GIT: unionfs2-2.6.27.y: Unionfs: unionfs_permission locking fixes

Erez Zadok ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:18:12 EDT 2010


commit e338a2987a9f2196e0ba0ae3580022ae33078935
Author: Erez Zadok <ezk at cs.sunysb.edu>
Date:   Thu Sep 18 19:55:19 2008 -0400

    Unionfs: unionfs_permission locking fixes
    
    Signed-off-by: Erez Zadok <ezk at cs.sunysb.edu>

diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c
index 8d42f72..800648e 100644
--- a/fs/unionfs/inode.c
+++ b/fs/unionfs/inode.c
@@ -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;
 }
 


More information about the unionfs-cvs mailing list