Unionfs: cleanup state in ->permission before returning ECHILD
authorErez Zadok <ezk@cs.sunysb.edu>
Sat, 30 Apr 2011 05:33:59 +0000 (01:33 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 12 Aug 2011 02:39:35 +0000 (22:39 -0400)
Fixes bugs that cased leftover dentries upon unmount, causing oopses.

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

index 24243adbe61affefabe28b23da35d8a6ece5cea6..3d34394306c649e324103355b47ea3e2dd66a52e 100644 (file)
@@ -794,8 +794,10 @@ static int unionfs_permission(struct inode *inode, int mask, unsigned int flags)
        struct inode *inode_grabbed = igrab(inode);
        struct dentry *dentry = d_find_alias(inode);
 
-       if (flags & IPERM_FLAG_RCU)
-               return -ECHILD;
+       if (flags & IPERM_FLAG_RCU) {
+               err = -ECHILD;
+               goto out_nograb;
+       }
 
        if (dentry)
                unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
@@ -892,6 +894,7 @@ out:
                dput(dentry);
        }
        iput(inode_grabbed);
+out_nograb:
        return err;
 }