X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=ovl01-vfs-add-i_op-dentry_open.patch;h=fccacce152fbd28474de57f2592ba2a27d4dbd07;hb=44db841e7f93822bba30e1ccca3506a3f8c93f39;hp=b4fd81a276c2c592caa39b32c73db5e9c40bf6e0;hpb=68184a5af355df3c4bd8aead86f2aa53db3cf0a4;p=packages%2Fkernel.git diff --git a/ovl01-vfs-add-i_op-dentry_open.patch b/ovl01-vfs-add-i_op-dentry_open.patch index b4fd81a2..fccacce1 100644 --- a/ovl01-vfs-add-i_op-dentry_open.patch +++ b/ovl01-vfs-add-i_op-dentry_open.patch @@ -16,39 +16,35 @@ Signed-off-by: Miklos Szeredi include/linux/fs.h | 2 ++ 5 files changed, 38 insertions(+), 5 deletions(-) -Index: linux-3.6-rc7-master/Documentation/filesystems/Locking -=================================================================== ---- linux-3.6-rc7-master.orig/Documentation/filesystems/Locking 2012-09-28 13:36:40.000000000 +0200 -+++ linux-3.6-rc7-master/Documentation/filesystems/Locking 2012-09-28 13:36:47.000000000 +0200 -@@ -64,6 +64,7 @@ d_manage: no no yes (ref-walk) maybe - int (*atomic_open)(struct inode *, struct dentry *, +--- a/Documentation/filesystems/Locking ++++ b/Documentation/filesystems/Locking +@@ -66,6 +66,7 @@ d_manage: no no yes (ref-walk) maybe struct file *, unsigned open_flag, umode_t create_mode, int *opened); + int (*tmpfile) (struct inode *, struct dentry *, umode_t); + int (*dentry_open)(struct dentry *, struct file *, const struct cred *); locking rules: all may block -@@ -92,6 +93,7 @@ removexattr: yes - fiemap: no +@@ -93,6 +94,7 @@ removexattr: yes update_time: no atomic_open: yes + tmpfile: no +dentry_open: no Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on victim. -Index: linux-3.6-rc7-master/Documentation/filesystems/vfs.txt -=================================================================== ---- linux-3.6-rc7-master.orig/Documentation/filesystems/vfs.txt 2012-09-28 13:36:40.000000000 +0200 -+++ linux-3.6-rc7-master/Documentation/filesystems/vfs.txt 2012-09-28 13:36:47.000000000 +0200 -@@ -363,6 +363,7 @@ struct inode_operations { - int (*atomic_open)(struct inode *, struct dentry *, - struct file *, unsigned open_flag, - umode_t create_mode, int *opened); +--- a/Documentation/filesystems/vfs.txt ++++ b/Documentation/filesystems/vfs.txt +@@ -362,6 +362,7 @@ struct inode_operations { + int (*atomic_open)(struct inode *, struct dentry *, struct file *, + unsigned open_flag, umode_t create_mode, int *opened); + int (*tmpfile) (struct inode *, struct dentry *, umode_t); + int (*dentry_open)(struct dentry *, struct file *, const struct cred *); }; Again, all methods are called without any locks being held, unless -@@ -692,6 +693,12 @@ struct address_space_operations { +@@ -681,6 +682,12 @@ struct address_space_operations { but instead uses bmap to find out where the blocks in the file are and uses those addresses directly. @@ -61,11 +57,9 @@ Index: linux-3.6-rc7-master/Documentation/filesystems/vfs.txt invalidatepage: If a page has PagePrivate set, then invalidatepage will be called when part or all of the page is to be removed -Index: linux-3.6-rc7-master/fs/namei.c -=================================================================== ---- linux-3.6-rc7-master.orig/fs/namei.c 2012-09-28 13:36:40.000000000 +0200 -+++ linux-3.6-rc7-master/fs/namei.c 2012-09-28 13:36:47.000000000 +0200 -@@ -2870,9 +2870,12 @@ static int do_last(struct nameidata *nd, +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -2915,9 +2915,12 @@ static int do_last(struct nameidata *nd, error = may_open(&nd->path, acc_mode, open_flag); if (error) goto out; @@ -81,21 +75,19 @@ Index: linux-3.6-rc7-master/fs/namei.c if (error == -EOPENSTALE) goto stale_open; goto out; -Index: linux-3.6-rc7-master/fs/open.c -=================================================================== ---- linux-3.6-rc7-master.orig/fs/open.c 2012-09-28 13:36:40.000000000 +0200 -+++ linux-3.6-rc7-master/fs/open.c 2012-09-28 13:36:47.000000000 +0200 -@@ -787,8 +787,7 @@ struct file *dentry_open(const struct pa - return ERR_PTR(error); - - f->f_flags = flags; -- f->f_path = *path; -- error = do_dentry_open(f, NULL, cred); -+ error = vfs_open(path, f, cred); - if (!error) { - error = open_check_o_direct(f); - if (error) { -@@ -803,6 +802,26 @@ struct file *dentry_open(const struct pa +--- a/fs/open.c ++++ b/fs/open.c +@@ -800,8 +800,7 @@ struct file *dentry_open(const struct pa + f = get_empty_filp(); + if (!IS_ERR(f)) { + f->f_flags = flags; +- f->f_path = *path; +- error = do_dentry_open(f, NULL, cred); ++ error = vfs_open(path, f, cred); + if (!error) { + /* from now on we need fput() to dispose of f */ + error = open_check_o_direct(f); +@@ -818,6 +817,26 @@ struct file *dentry_open(const struct pa } EXPORT_SYMBOL(dentry_open); @@ -122,19 +114,17 @@ Index: linux-3.6-rc7-master/fs/open.c static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) { int lookup_flags = 0; -Index: linux-3.6-rc7-master/include/linux/fs.h -=================================================================== ---- linux-3.6-rc7-master.orig/include/linux/fs.h 2012-09-28 13:36:40.000000000 +0200 -+++ linux-3.6-rc7-master/include/linux/fs.h 2012-09-28 13:36:47.000000000 +0200 -@@ -1843,6 +1843,7 @@ struct inode_operations { - int (*atomic_open)(struct inode *, struct dentry *, - struct file *, unsigned open_flag, +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -1575,6 +1575,7 @@ struct inode_operations { umode_t create_mode, int *opened); + int (*tmpfile) (struct inode *, struct dentry *, umode_t); + int (*set_acl)(struct inode *, struct posix_acl *, int); + int (*dentry_open)(struct dentry *, struct file *, const struct cred *); } ____cacheline_aligned; - struct seq_file; -@@ -2211,6 +2212,7 @@ extern long do_sys_open(int dfd, const c + ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, +@@ -2019,6 +2020,7 @@ extern struct file *file_open_name(struc extern struct file *filp_open(const char *, int, umode_t); extern struct file *file_open_root(struct dentry *, struct vfsmount *, const char *, int);