[PATCH, RFC 2/3] fs: propagate the open_flags structure down to the low-level fs's create()
From: Theodore Ts'o <tytso@mit.edu>
Date: 2012-04-19 19:20:14
Also in:
linux-fsdevel
Subsystem:
9p file system, affs file system, bfs file system, btrfs file system, cachefiles: fs-cache backend for caching on mounted filesystems, ceph distributed file system client (ceph), coda file system, ecrypt file system, ext2 file system, ext4 file system, filesystems (vfs and infrastructure), fuse filesystem [core], gfs2 file system, hfs filesystem, hfsplus filesystem, hugetlb subsystem, jfs filesystem, journalling flash file system v2 (jffs2), kernel nfsd, sunrpc, and lockd servers, nfs, sunrpc, and lockd clients, nilfs2 filesystem, omfs filesystem, oracle cluster filesystem 2 (ocfs2), the rest, ubi file system (ubifs), udf filesystem, user-mode linux (uml), vfat/fat/msdos filesystem, xfs filesystem · Maintainers:
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet, David Sterba, "Tigran A. Aivazian", Chris Mason, David Howells, Ilya Dryomov, Alex Markuze, Viacheslav Dubeyko, Jan Harkes, Tyler Hicks, Jan Kara, "Theodore Ts'o", Alexander Viro, Christian Brauner, Miklos Szeredi, Andreas Gruenbacher, John Paul Adrian Glaubitz, Yangtao Li, Muchun Song, Oscar Salvador, Dave Kleikamp, David Woodhouse, Richard Weinberger, Chuck Lever, Jeff Layton, Trond Myklebust, Anna Schumaker, Ryusuke Konishi, Bob Copeland, Mark Fasheh, Joel Becker, Joseph Qi, Linus Torvalds, Anton Ivanov, Johannes Berg, OGAWA Hirofumi, Carlos Maiolino
This allows the file systems access to the open flags, so they can take these into account when making allocation decisions for newly created inodes. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> --- fs/9p/vfs_inode.c | 2 +- fs/affs/affs.h | 2 +- fs/affs/namei.c | 3 ++- fs/bfs/dir.c | 2 +- fs/btrfs/inode.c | 3 ++- fs/cachefiles/namei.c | 3 ++- fs/ceph/dir.c | 2 +- fs/cifs/dir.c | 2 +- fs/coda/dir.c | 3 ++- fs/ecryptfs/inode.c | 5 +++-- fs/exofs/namei.c | 2 +- fs/ext2/namei.c | 4 +++- fs/ext3/namei.c | 5 +++-- fs/ext4/namei.c | 2 +- fs/fat/namei_msdos.c | 2 +- fs/fat/namei_vfat.c | 2 +- fs/fuse/dir.c | 2 +- fs/gfs2/inode.c | 3 ++- fs/hfs/dir.c | 2 +- fs/hfsplus/dir.c | 5 +++-- fs/hostfs/hostfs_kern.c | 2 +- fs/hugetlbfs/inode.c | 4 +++- fs/internal.h | 6 ------ fs/jffs2/dir.c | 5 +++-- fs/jfs/namei.c | 2 +- fs/logfs/dir.c | 2 +- fs/minix/namei.c | 2 +- fs/namei.c | 9 +++++---- fs/ncpfs/dir.c | 5 +++-- fs/nfs/dir.c | 6 ++++-- fs/nfsd/vfs.c | 4 ++-- fs/nilfs2/namei.c | 2 +- fs/ocfs2/namei.c | 3 ++- fs/omfs/dir.c | 2 +- fs/ramfs/inode.c | 3 ++- fs/reiserfs/namei.c | 5 +++-- fs/sysv/namei.c | 4 +++- fs/ubifs/dir.c | 2 +- fs/udf/namei.c | 2 +- fs/ufs/namei.c | 2 +- fs/xfs/xfs_iops.c | 3 ++- include/linux/fs.h | 14 ++++++++++++-- ipc/mqueue.c | 2 +- 43 files changed, 87 insertions(+), 60 deletions(-)
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 014c8dd..53c448b 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c@@ -722,7 +722,7 @@ error: static int v9fs_vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { int err; u32 perm;
diff --git a/fs/affs/affs.h b/fs/affs/affs.h
index 45a0ce4..2710c36 100644
--- a/fs/affs/affs.h
+++ b/fs/affs/affs.h@@ -156,7 +156,7 @@ extern void affs_free_bitmap(struct super_block *sb); extern int affs_hash_name(struct super_block *sb, const u8 *name, unsigned int len); extern struct dentry *affs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *); extern int affs_unlink(struct inode *dir, struct dentry *dentry); -extern int affs_create(struct inode *dir, struct dentry *dentry, umode_t mode, struct nameidata *); +extern int affs_create(struct inode *dir, struct dentry *dentry, umode_t mode, struct nameidata *, const struct open_flags *); extern int affs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode); extern int affs_rmdir(struct inode *dir, struct dentry *dentry); extern int affs_link(struct dentry *olddentry, struct inode *dir,
diff --git a/fs/affs/namei.c b/fs/affs/namei.c
index 4780694..44c74a0 100644
--- a/fs/affs/namei.c
+++ b/fs/affs/namei.c@@ -255,7 +255,8 @@ affs_unlink(struct inode *dir, struct dentry *dentry) } int -affs_create(struct inode *dir, struct dentry *dentry, umode_t mode, struct nameidata *nd) +affs_create(struct inode *dir, struct dentry *dentry, umode_t mode, + struct nameidata *nd, const struct open_flags *op) { struct super_block *sb = dir->i_sb; struct inode *inode;
diff --git a/fs/bfs/dir.c b/fs/bfs/dir.c
index d12c796..163e16f 100644
--- a/fs/bfs/dir.c
+++ b/fs/bfs/dir.c@@ -85,7 +85,7 @@ const struct file_operations bfs_dir_operations = { extern void dump_imap(const char *, struct super_block *); static int bfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { int err; struct inode *inode;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 115bc05..6c3e9a9 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c@@ -4854,7 +4854,8 @@ out_unlock: } static int btrfs_create(struct inode *dir, struct dentry *dentry, - umode_t mode, struct nameidata *nd) + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { struct btrfs_trans_handle *trans; struct btrfs_root *root = BTRFS_I(dir)->root;
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index 7f0771d..bc1aba9 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c@@ -567,7 +567,8 @@ lookup_again: if (ret < 0) goto create_error; start = jiffies; - ret = vfs_create(dir->d_inode, next, S_IFREG, NULL); + ret = vfs_create(dir->d_inode, next, S_IFREG, NULL, + NULL); cachefiles_hist(cachefiles_create_histogram, start); if (ret < 0) goto create_error;
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index 3e8094b..40318505 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c@@ -700,7 +700,7 @@ static int ceph_mknod(struct inode *dir, struct dentry *dentry, } static int ceph_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { dout("create in dir %p dentry %p name '%.*s'\n", dir, dentry, dentry->d_name.len, dentry->d_name.name);
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index d172c8e..05647d7 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c@@ -137,7 +137,7 @@ cifs_bp_rename_retry: int cifs_create(struct inode *inode, struct dentry *direntry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { int rc = -ENOENT; int xid;
diff --git a/fs/coda/dir.c b/fs/coda/dir.c
index 1775158..51e5413 100644
--- a/fs/coda/dir.c
+++ b/fs/coda/dir.c@@ -30,7 +30,8 @@ #include "coda_int.h" /* dir inode-ops */ -static int coda_create(struct inode *dir, struct dentry *new, umode_t mode, struct nameidata *nd); +static int coda_create(struct inode *dir, struct dentry *new, umode_t mode, + struct nameidata *nd, const struct open_flags *op); static struct dentry *coda_lookup(struct inode *dir, struct dentry *target, struct nameidata *nd); static int coda_link(struct dentry *old_dentry, struct inode *dir_inode, struct dentry *entry);
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index ab35b11..5daa0aa 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c@@ -173,7 +173,8 @@ ecryptfs_do_create(struct inode *directory_inode, inode = ERR_CAST(lower_dir_dentry); goto out; } - rc = vfs_create(lower_dir_dentry->d_inode, lower_dentry, mode, NULL); + rc = vfs_create(lower_dir_dentry->d_inode, lower_dentry, mode, + NULL, NULL); if (rc) { printk(KERN_ERR "%s: Failure to create dentry in lower fs; " "rc = [%d]\n", __func__, rc);
@@ -248,7 +249,7 @@ out: */ static int ecryptfs_create(struct inode *directory_inode, struct dentry *ecryptfs_dentry, - umode_t mode, struct nameidata *nd) + umode_t mode, struct nameidata *nd, const struct open_flags *op) { struct inode *ecryptfs_inode; int rc;
diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c
index fc7161d..67e83a7 100644
--- a/fs/exofs/namei.c
+++ b/fs/exofs/namei.c@@ -60,7 +60,7 @@ static struct dentry *exofs_lookup(struct inode *dir, struct dentry *dentry, } static int exofs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode = exofs_new_inode(dir, mode); int err = PTR_ERR(inode);
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
index dffb865..1d40748 100644
--- a/fs/ext2/namei.c
+++ b/fs/ext2/namei.c@@ -94,7 +94,9 @@ struct dentry *ext2_get_parent(struct dentry *child) * If the create succeeds, we fill in the inode information * with d_instantiate(). */ -static int ext2_create (struct inode * dir, struct dentry * dentry, umode_t mode, struct nameidata *nd) +static int ext2_create (struct inode * dir, struct dentry * dentry, + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { struct inode *inode;
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c
index d7940b2..2607c74 100644
--- a/fs/ext3/namei.c
+++ b/fs/ext3/namei.c@@ -1689,8 +1689,9 @@ static int ext3_add_nondir(handle_t *handle, * If the create succeeds, we fill in the inode information * with d_instantiate(). */ -static int ext3_create (struct inode * dir, struct dentry * dentry, umode_t mode, - struct nameidata *nd) +static int ext3_create (struct inode * dir, struct dentry * dentry, + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { handle_t *handle; struct inode * inode;
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 349d7b3..6f48ff8 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c@@ -1737,7 +1737,7 @@ static int ext4_add_nondir(handle_t *handle, * with d_instantiate(). */ static int ext4_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { handle_t *handle; struct inode *inode;
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c
index c5938c9..cef8ddc 100644
--- a/fs/fat/namei_msdos.c
+++ b/fs/fat/namei_msdos.c@@ -265,7 +265,7 @@ static int msdos_add_entry(struct inode *dir, const unsigned char *name, /***** Create a file */ static int msdos_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct super_block *sb = dir->i_sb; struct inode *inode = NULL;
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 98ae804..8dd2f1b 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c@@ -772,7 +772,7 @@ error: } static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct super_block *sb = dir->i_sb; struct inode *inode;
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 2066328..56bd899 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c@@ -574,7 +574,7 @@ static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode, } static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { if (nd) { int err = fuse_create_open(dir, entry, mode, nd);
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index c98a60e..36701c8 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c@@ -755,7 +755,8 @@ fail: */ static int gfs2_create(struct inode *dir, struct dentry *dentry, - umode_t mode, struct nameidata *nd) + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { int excl = 0; if (nd && (nd->flags & LOOKUP_EXCL))
diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c
index 62fc14e..67a2885 100644
--- a/fs/hfs/dir.c
+++ b/fs/hfs/dir.c@@ -187,7 +187,7 @@ static int hfs_dir_release(struct inode *inode, struct file *file) * the directory and the name (and its length) of the new file. */ static int hfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode; int res;
diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c
index 88e155f..2da1def 100644
--- a/fs/hfsplus/dir.c
+++ b/fs/hfsplus/dir.c@@ -453,8 +453,9 @@ out: return res; } -static int hfsplus_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) +static int hfsplus_create(struct inode *dir, struct dentry *dentry, + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { return hfsplus_mknod(dir, dentry, mode, 0); }
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index 07c516b..8420a7f 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c@@ -553,7 +553,7 @@ static int read_name(struct inode *ino, char *name) } int hostfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode; char *name;
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 28cf06e..df64699 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c@@ -564,7 +564,9 @@ static int hugetlbfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mod return retval; } -static int hugetlbfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, struct nameidata *nd) +static int hugetlbfs_create(struct inode *dir, struct dentry *dentry, + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { return hugetlbfs_mknod(dir, dentry, mode | S_IFREG, 0); }
diff --git a/fs/internal.h b/fs/internal.h
index 9962c59..63ddd95 100644
--- a/fs/internal.h
+++ b/fs/internal.h@@ -87,12 +87,6 @@ extern struct super_block *user_get_super(dev_t); struct nameidata; extern struct file *nameidata_to_filp(struct nameidata *); extern void release_open_intent(struct nameidata *); -struct open_flags { - int open_flag; - umode_t mode; - int acc_mode; - int intent; -}; extern struct file *do_filp_open(int dfd, const char *pathname, const struct open_flags *op, int lookup_flags); extern struct file *do_file_open_root(struct dentry *, struct vfsmount *,
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index b560188..4a92b38 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c@@ -25,7 +25,7 @@ static int jffs2_readdir (struct file *, void *, filldir_t); static int jffs2_create (struct inode *,struct dentry *,umode_t, - struct nameidata *); + struct nameidata *, const struct open_flags *); static struct dentry *jffs2_lookup (struct inode *,struct dentry *, struct nameidata *); static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
@@ -175,7 +175,8 @@ static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir) static int jffs2_create(struct inode *dir_i, struct dentry *dentry, - umode_t mode, struct nameidata *nd) + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { struct jffs2_raw_inode *ri; struct jffs2_inode_info *f, *dir_f;
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c
index 07c91ca..8537059 100644
--- a/fs/jfs/namei.c
+++ b/fs/jfs/namei.c@@ -73,7 +73,7 @@ static inline void free_ea_wmap(struct inode *inode) * */ static int jfs_create(struct inode *dip, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { int rc = 0; tid_t tid; /* transaction id */
diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c
index bea5d1b..2e219e8 100644
--- a/fs/logfs/dir.c
+++ b/fs/logfs/dir.c@@ -502,7 +502,7 @@ static int logfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) } static int logfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode;
diff --git a/fs/minix/namei.c b/fs/minix/namei.c
index 2d0ee17..c0a4510 100644
--- a/fs/minix/namei.c
+++ b/fs/minix/namei.c@@ -55,7 +55,7 @@ static int minix_mknod(struct inode * dir, struct dentry *dentry, umode_t mode, } static int minix_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { return minix_mknod(dir, dentry, mode, 0); }
diff --git a/fs/namei.c b/fs/namei.c
index 0062dd1..898b2af 100644
--- a/fs/namei.c
+++ b/fs/namei.c@@ -2057,7 +2057,7 @@ void unlock_rename(struct dentry *p1, struct dentry *p2) } int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { int error = may_create(dir, dentry);
@@ -2071,7 +2071,7 @@ int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, error = security_inode_create(dir, dentry, mode); if (error) return error; - error = dir->i_op->create(dir, dentry, mode, nd); + error = dir->i_op->create(dir, dentry, mode, nd, op); if (!error) fsnotify_create(dir, dentry); return error;
@@ -2278,7 +2278,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path, error = security_path_mknod(&nd->path, dentry, mode, 0); if (error) goto exit_mutex_unlock; - error = vfs_create(dir->d_inode, dentry, mode, nd); + error = vfs_create(dir->d_inode, dentry, mode, nd, op); if (error) goto exit_mutex_unlock; mutex_unlock(&dir->d_inode->i_mutex);
@@ -2596,7 +2596,8 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, goto out_drop_write; switch (mode & S_IFMT) { case 0: case S_IFREG: - error = vfs_create(path.dentry->d_inode,dentry,mode,NULL); + error = vfs_create(path.dentry->d_inode,dentry,mode, + NULL, NULL); break; case S_IFCHR: case S_IFBLK: error = vfs_mknod(path.dentry->d_inode,dentry,mode,
diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c
index aeed93a..9aff9fd 100644
--- a/fs/ncpfs/dir.c
+++ b/fs/ncpfs/dir.c@@ -30,7 +30,8 @@ static void ncp_do_readdir(struct file *, void *, filldir_t, static int ncp_readdir(struct file *, void *, filldir_t); -static int ncp_create(struct inode *, struct dentry *, umode_t, struct nameidata *); +static int ncp_create(struct inode *, struct dentry *, umode_t, + struct nameidata *, const struct open_flags *); static struct dentry *ncp_lookup(struct inode *, struct dentry *, struct nameidata *); static int ncp_unlink(struct inode *, struct dentry *); static int ncp_mkdir(struct inode *, struct dentry *, umode_t);
@@ -980,7 +981,7 @@ out: } static int ncp_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { return ncp_create_new(dir, dentry, mode, 0, 0); }
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 4aaf031..986cde5 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c@@ -47,7 +47,8 @@ static int nfs_opendir(struct inode *, struct file *); static int nfs_closedir(struct inode *, struct file *); static int nfs_readdir(struct file *, void *, filldir_t); static struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *); -static int nfs_create(struct inode *, struct dentry *, umode_t, struct nameidata *); +static int nfs_create(struct inode *, struct dentry *, umode_t, + struct nameidata *, const struct open_flags *); static int nfs_mkdir(struct inode *, struct dentry *, umode_t); static int nfs_rmdir(struct inode *, struct dentry *); static int nfs_unlink(struct inode *, struct dentry *);
@@ -1678,7 +1679,8 @@ out_error: * reply path made it appear to have failed. */ static int nfs_create(struct inode *dir, struct dentry *dentry, - umode_t mode, struct nameidata *nd) + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { struct iattr attr; int error;
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 296d671..4ff4a61 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c@@ -1329,7 +1329,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, err = 0; switch (type) { case S_IFREG: - host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); + host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL, NULL); if (!host_err) nfsd_check_ignore_resizing(iap); break;
@@ -1492,7 +1492,7 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, goto out; } - host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); + host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL, NULL); if (host_err < 0) { fh_drop_write(fhp); goto out_nfserr;
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c
index fce2bbe..13e99aa 100644
--- a/fs/nilfs2/namei.c
+++ b/fs/nilfs2/namei.c@@ -85,7 +85,7 @@ nilfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) * with d_instantiate(). */ static int nilfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode; struct nilfs_transaction_info ti;
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c
index a9856e3..f1d8a81 100644
--- a/fs/ocfs2/namei.c
+++ b/fs/ocfs2/namei.c@@ -618,7 +618,8 @@ static int ocfs2_mkdir(struct inode *dir, static int ocfs2_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, + const struct open_flags *op) { int ret;
diff --git a/fs/omfs/dir.c b/fs/omfs/dir.c
index f00576e..db58089 100644
--- a/fs/omfs/dir.c
+++ b/fs/omfs/dir.c@@ -285,7 +285,7 @@ static int omfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) } static int omfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { return omfs_add_node(dir, dentry, mode | S_IFREG); }
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
index a1fdabe..b1ac7c6 100644
--- a/fs/ramfs/inode.c
+++ b/fs/ramfs/inode.c@@ -114,7 +114,8 @@ static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode) return retval; } -static int ramfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, struct nameidata *nd) +static int ramfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, + struct nameidata *nd, const struct open_flags *op) { return ramfs_mknod(dir, dentry, mode | S_IFREG, 0); }
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c
index 84e8a69..85ed28d 100644
--- a/fs/reiserfs/namei.c
+++ b/fs/reiserfs/namei.c@@ -572,8 +572,9 @@ static int new_inode_init(struct inode *inode, struct inode *dir, umode_t mode) return 0; } -static int reiserfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) +static int reiserfs_create(struct inode *dir, struct dentry *dentry, + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { int retval; struct inode *inode;
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c
index d7466e2..177ee46 100644
--- a/fs/sysv/namei.c
+++ b/fs/sysv/namei.c@@ -80,7 +80,9 @@ static int sysv_mknod(struct inode * dir, struct dentry * dentry, umode_t mode, return err; } -static int sysv_create(struct inode * dir, struct dentry * dentry, umode_t mode, struct nameidata *nd) +static int sysv_create(struct inode * dir, struct dentry * dentry, + umode_t mode, struct nameidata *nd, + const struct open_flags *op) { return sysv_mknod(dir, dentry, mode, 0); }
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
index ec9f187..450a0c8 100644
--- a/fs/ubifs/dir.c
+++ b/fs/ubifs/dir.c@@ -254,7 +254,7 @@ out: } static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode; struct ubifs_info *c = dir->i_sb->s_fs_info;
diff --git a/fs/udf/namei.c b/fs/udf/namei.c
index 38de8f2..74057d2 100644
--- a/fs/udf/namei.c
+++ b/fs/udf/namei.c@@ -551,7 +551,7 @@ static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, } static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct udf_fileident_bh fibh; struct inode *inode;
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c
index a2281ca..61e086f 100644
--- a/fs/ufs/namei.c
+++ b/fs/ufs/namei.c@@ -71,7 +71,7 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru * with d_instantiate(). */ static int ufs_create (struct inode * dir, struct dentry * dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, const struct open_flags *op) { struct inode *inode; int err;
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index 3011b87..c39e076 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c@@ -182,7 +182,8 @@ xfs_vn_create( struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) + struct nameidata *nd, + const struct open_flags *op) { return xfs_vn_mknod(dir, dentry, mode, 0); }
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8de6755..4ed5244 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h@@ -1173,6 +1173,14 @@ struct file_lock { #define OFFT_OFFSET_MAX INT_LIMIT(off_t) #endif +/* Passed down to the VFS's create function */ +struct open_flags { + int open_flag; + umode_t mode; + int acc_mode; + int intent; +}; + #include <linux/fcntl.h> extern void send_sigio(struct fown_struct *fown, int fd, int band);
@@ -1542,7 +1550,8 @@ extern void unlock_super(struct super_block *); /* * VFS helper functions.. */ -extern int vfs_create(struct inode *, struct dentry *, umode_t, struct nameidata *); +extern int vfs_create(struct inode *, struct dentry *, umode_t, + struct nameidata *, const struct open_flags *op); extern int vfs_mkdir(struct inode *, struct dentry *, umode_t); extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t); extern int vfs_symlink(struct inode *, struct dentry *, const char *);
@@ -1645,7 +1654,8 @@ struct inode_operations { int (*readlink) (struct dentry *, char __user *,int); void (*put_link) (struct dentry *, struct nameidata *, void *); - int (*create) (struct inode *,struct dentry *,umode_t,struct nameidata *); + int (*create) (struct inode *,struct dentry *,umode_t, + struct nameidata *, const struct open_flags *); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*unlink) (struct inode *,struct dentry *); int (*symlink) (struct inode *,struct dentry *,const char *);
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index 28bd64d..dab7606 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c@@ -624,7 +624,7 @@ static struct file *do_create(struct ipc_namespace *ipc_ns, struct dentry *dir, ret = mnt_want_write(ipc_ns->mq_mnt); if (ret) goto out; - ret = vfs_create(dir->d_inode, dentry, mode, NULL); + ret = vfs_create(dir->d_inode, dentry, mode, NULL, NULL); dentry->d_fsdata = NULL; if (ret) goto out_drop_write;
--
1.7.10.rc3