From b54710b41d84f7076d550ca454f358c49a7971af Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 7 Apr 2008 14:31:20 -0700 Subject: [PATCH] kclient: use provided mode, or mask against current->fs->umask, on path_lookup_open (possible create) --- src/kernel/dir.c | 5 +++-- src/kernel/file.c | 3 +-- src/kernel/super.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 5cac51d7f4ae6..ea7df234633ad 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -248,7 +248,8 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry, /* open (but not create!) intent? */ if (nd->flags & LOOKUP_OPEN && !(nd->intent.open.flags & O_CREAT)) { - err = ceph_lookup_open(dir, dentry, nd); + int mode = nd->intent.open.create_mode & ~current->fs->umask; + err = ceph_lookup_open(dir, dentry, nd, mode); return ERR_PTR(err); } @@ -268,7 +269,7 @@ static int ceph_dir_create(struct inode *dir, struct dentry *dentry, int mode, dout(5, "create in dir %p dentry %p name '%.*s'\n", dir, dentry, dentry->d_name.len, dentry->d_name.name); BUG_ON((nd->flags & LOOKUP_OPEN) == 0); - err = ceph_lookup_open(dir, dentry, nd); + err = ceph_lookup_open(dir, dentry, nd, mode); return err; } diff --git a/src/kernel/file.c b/src/kernel/file.c index e18b54a2cdac7..48e30465b2ea8 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -106,7 +106,7 @@ int ceph_open(struct inode *inode, struct file *file) * path_lookup_create -> LOOKUP_OPEN|LOOKUP_CREATE */ int ceph_lookup_open(struct inode *dir, struct dentry *dentry, - struct nameidata *nd) + struct nameidata *nd, int mode) { struct ceph_client *client = ceph_sb_to_client(dir->i_sb); struct ceph_mds_client *mdsc = &client->mdsc; @@ -114,7 +114,6 @@ int ceph_lookup_open(struct inode *dir, struct dentry *dentry, struct ceph_mds_request *req; int err; int flags = nd->intent.open.flags; - int mode = nd->intent.open.create_mode; dout(5, "ceph_lookup_open dentry %p '%.*s' flags %d mode 0%o\n", dentry, dentry->d_name.len, dentry->d_name.name, flags, mode); diff --git a/src/kernel/super.h b/src/kernel/super.h index cbf22bccd84b0..f20d926ca795f 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -394,7 +394,7 @@ extern const struct file_operations ceph_file_fops; extern const struct address_space_operations ceph_aops; extern int ceph_open(struct inode *inode, struct file *file); extern int ceph_lookup_open(struct inode *dir, struct dentry *dentry, - struct nameidata *nd); + struct nameidata *nd, int mode); extern int ceph_release(struct inode *inode, struct file *filp); extern int ceph_inode_revalidate(struct inode *inode, int mask); -- 2.39.5