Unionfs: lock parent dentry branch config in write
authorErez Zadok <ezk@cs.sunysb.edu>
Wed, 23 Apr 2008 23:33:26 +0000 (19:33 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Wed, 23 Apr 2008 23:33:26 +0000 (19:33 -0400)
Ensure that branch configuration is available to file_revalidate should a
copyup be required.

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

index e0869ea7e6ef33f3d75cd85fb632b62494f086f4..3feb1d7e01989247e7f5e2e5359045fdb4c8edf2 100644 (file)
@@ -55,7 +55,9 @@ static ssize_t unionfs_write(struct file *file, const char __user *buf,
 
        unionfs_read_lock(dentry->d_sb, UNIONFS_SMUTEX_PARENT);
        unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
-       err = unionfs_file_revalidate(file, true);
+       if (dentry != dentry->d_parent)
+               unionfs_lock_dentry(dentry->d_parent, UNIONFS_DMUTEX_PARENT);
+       err = unionfs_file_revalidate_locked(file, true);
        if (unlikely(err))
                goto out;
 
@@ -72,6 +74,8 @@ static ssize_t unionfs_write(struct file *file, const char __user *buf,
        }
 
 out:
+       if (dentry != dentry->d_parent)
+               unionfs_unlock_dentry(dentry->d_parent);
        unionfs_unlock_dentry(dentry);
        unionfs_read_unlock(dentry->d_sb);
        return err;