9p: switch v9fs_set_create_acl() to inode+fid, do it before d_instantiate()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 31 Jan 2013 18:45:39 +0000 (13:45 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 26 Feb 2013 07:46:07 +0000 (02:46 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/9p/acl.c
fs/9p/acl.h
fs/9p/vfs_inode_dotl.c

index 5b91689ac0b1b458b1cf42dd13a051197cf0c1ec..7af425f53beef91a6d21dc86b76e161ff7ed1696 100644 (file)
@@ -166,16 +166,13 @@ int v9fs_acl_chmod(struct inode *inode, struct p9_fid *fid)
        return retval;
 }
 
-int v9fs_set_create_acl(struct dentry *dentry,
+int v9fs_set_create_acl(struct inode *inode, struct p9_fid *fid,
                        struct posix_acl *dacl, struct posix_acl *acl)
 {
-       struct p9_fid *fid = v9fs_fid_lookup(dentry);
-       set_cached_acl(dentry->d_inode, ACL_TYPE_DEFAULT, dacl);
-       set_cached_acl(dentry->d_inode, ACL_TYPE_ACCESS, acl);
-       if (!IS_ERR(fid)) {
-               v9fs_set_acl(fid, ACL_TYPE_DEFAULT, dacl);
-               v9fs_set_acl(fid, ACL_TYPE_ACCESS, acl);
-       }
+       set_cached_acl(inode, ACL_TYPE_DEFAULT, dacl);
+       set_cached_acl(inode, ACL_TYPE_ACCESS, acl);
+       v9fs_set_acl(fid, ACL_TYPE_DEFAULT, dacl);
+       v9fs_set_acl(fid, ACL_TYPE_ACCESS, acl);
        return 0;
 }
 
index cb7fc54081f7a20e3a85d642746165013ed7c621..e4f7e882272b780c9bc8391ac385a50a067cb899 100644 (file)
@@ -18,7 +18,7 @@
 extern int v9fs_get_acl(struct inode *, struct p9_fid *);
 extern struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type);
 extern int v9fs_acl_chmod(struct inode *, struct p9_fid *);
-extern int v9fs_set_create_acl(struct dentry *,
+extern int v9fs_set_create_acl(struct inode *, struct p9_fid *,
                               struct posix_acl *, struct posix_acl *);
 extern int v9fs_acl_mode(struct inode *dir, umode_t *modep,
                         struct posix_acl **dpacl, struct posix_acl **pacl);
@@ -33,7 +33,8 @@ static inline int v9fs_acl_chmod(struct inode *inode, struct p9_fid *fid)
 {
        return 0;
 }
-static inline int v9fs_set_create_acl(struct dentry *dentry,
+static inline int v9fs_set_create_acl(struct inode *inode,
+                                     struct p9_fid *fid,
                                      struct posix_acl *dacl,
                                      struct posix_acl *acl)
 {
index dd6355721fc72ac9e04beaf37d0875652b9a00d9..7c295588150c46e846ad58ff8d1c72167f405d8d 100644 (file)
@@ -325,14 +325,14 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry,
                p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err);
                goto error;
        }
+       /* Now set the ACL based on the default value */
+       v9fs_set_create_acl(inode, fid, dacl, pacl);
+
        err = v9fs_fid_add(dentry, fid);
        if (err < 0)
                goto error;
        d_instantiate(dentry, inode);
 
-       /* Now set the ACL based on the default value */
-       v9fs_set_create_acl(dentry, dacl, pacl);
-
        v9inode = V9FS_I(inode);
        mutex_lock(&v9inode->v_mutex);
        if (v9ses->cache && !v9inode->writeback_fid &&
@@ -430,17 +430,17 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
        if (err < 0)
                goto error;
 
+       fid = p9_client_walk(dfid, 1, &name, 1);
+       if (IS_ERR(fid)) {
+               err = PTR_ERR(fid);
+               p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
+                        err);
+               fid = NULL;
+               goto error;
+       }
+
        /* instantiate inode and assign the unopened fid to the dentry */
        if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
-               fid = p9_client_walk(dfid, 1, &name, 1);
-               if (IS_ERR(fid)) {
-                       err = PTR_ERR(fid);
-                       p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
-                                err);
-                       fid = NULL;
-                       goto error;
-               }
-
                inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
                if (IS_ERR(inode)) {
                        err = PTR_ERR(inode);
@@ -451,6 +451,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
                err = v9fs_fid_add(dentry, fid);
                if (err < 0)
                        goto error;
+               v9fs_set_create_acl(inode, fid, dacl, pacl);
                d_instantiate(dentry, inode);
                fid = NULL;
        } else {
@@ -464,10 +465,9 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
                        err = PTR_ERR(inode);
                        goto error;
                }
+               v9fs_set_create_acl(inode, fid, dacl, pacl);
                d_instantiate(dentry, inode);
        }
-       /* Now set the ACL based on the default value */
-       v9fs_set_create_acl(dentry, dacl, pacl);
        inc_nlink(dir);
        v9fs_invalidate_inode_attr(dir);
 error:
@@ -876,17 +876,17 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
                goto error;
 
        v9fs_invalidate_inode_attr(dir);
+       fid = p9_client_walk(dfid, 1, &name, 1);
+       if (IS_ERR(fid)) {
+               err = PTR_ERR(fid);
+               p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
+                        err);
+               fid = NULL;
+               goto error;
+       }
+
        /* instantiate inode and assign the unopened fid to the dentry */
        if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
-               fid = p9_client_walk(dfid, 1, &name, 1);
-               if (IS_ERR(fid)) {
-                       err = PTR_ERR(fid);
-                       p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
-                                err);
-                       fid = NULL;
-                       goto error;
-               }
-
                inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
                if (IS_ERR(inode)) {
                        err = PTR_ERR(inode);
@@ -894,6 +894,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
                                 err);
                        goto error;
                }
+               v9fs_set_create_acl(inode, fid, dacl, pacl);
                err = v9fs_fid_add(dentry, fid);
                if (err < 0)
                        goto error;
@@ -909,10 +910,9 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
                        err = PTR_ERR(inode);
                        goto error;
                }
+               v9fs_set_create_acl(inode, fid, dacl, pacl);
                d_instantiate(dentry, inode);
        }
-       /* Now set the ACL based on the default value */
-       v9fs_set_create_acl(dentry, dacl, pacl);
 error:
        if (fid)
                p9_client_clunk(fid);