Unionfs: unionfs_permission locking fixes
authorErez Zadok <ezk@cs.sunysb.edu>
Thu, 18 Sep 2008 23:55:19 +0000 (19:55 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 12 Aug 2011 02:38:53 +0000 (22:38 -0400)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/inode.c

index 8d42f7213a9a500721bb8da60a8581efc3fe0fab..800648e6017fbb69e596b7df774804746e1e85b6 100644 (file)
@@ -785,6 +785,11 @@ static int unionfs_permission(struct inode *inode, int mask)
        int bindex, bstart, bend;
        const int is_file = !S_ISDIR(inode->i_mode);
        const int write_mask = (mask & MAY_WRITE) && !(mask & MAY_READ);
+       struct inode *inode_grabbed = igrab(inode);
+       struct dentry *dentry = d_find_alias(inode);
+
+       if (dentry)
+               unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
 
        if (!UNIONFS_I(inode)->lower_inodes) {
                if (is_file)    /* dirs can be unlinked but chdir'ed to */
@@ -859,6 +864,11 @@ static int unionfs_permission(struct inode *inode, int mask)
 
 out:
        unionfs_check_inode(inode);
+       if (dentry) {
+               unionfs_unlock_dentry(dentry);
+               dput(dentry);
+       }
+       iput(inode_grabbed);
        return err;
 }