Unionfs: reorder initializations in ->permission
authorErez Zadok <ezk@cs.sunysb.edu>
Sat, 30 Apr 2011 05:34:00 +0000 (01:34 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 12 Aug 2011 02:39:36 +0000 (22:39 -0400)
First igrab, then reference the inode in question; and do all this after
checking for IPERM_FLAG_RCU.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/inode.c

index 3d34394306c649e324103355b47ea3e2dd66a52e..21acb882fae5e22db9858954ddcf5201f1c05145 100644 (file)
@@ -789,19 +789,23 @@ static int unionfs_permission(struct inode *inode, int mask, unsigned int flags)
        struct inode *lower_inode = NULL;
        int err = 0;
        int bindex, bstart, bend;
-       const int is_file = !S_ISDIR(inode->i_mode);
+       int is_file;
        const int write_mask = (mask & MAY_WRITE) && !(mask & MAY_READ);
-       struct inode *inode_grabbed = igrab(inode);
-       struct dentry *dentry = d_find_alias(inode);
+       struct inode *inode_grabbed;
+       struct dentry *dentry;
 
        if (flags & IPERM_FLAG_RCU) {
                err = -ECHILD;
                goto out_nograb;
        }
 
+       dentry = d_find_alias(inode);
        if (dentry)
                unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
 
+       inode_grabbed = igrab(inode);
+       is_file = !S_ISDIR(inode->i_mode);
+
        if (!UNIONFS_I(inode)->lower_inodes) {
                if (is_file)    /* dirs can be unlinked but chdir'ed to */
                        err = -ESTALE;  /* force revalidate */