Unionfs: Fix deadlock on unionfs superblock read/write semaphore.
authorRachita Kothiyal <rachita@dewey.fsl.cs.sunysb.edu>
Thu, 22 Nov 2007 05:34:28 +0000 (00:34 -0500)
committerRachita Kothiyal <rachita@dewey.fsl.cs.sunysb.edu>
Thu, 1 May 2008 23:03:21 +0000 (19:03 -0400)
Added missing unionfs_read_lock() on the superblock object.

Signed-off-by: Rachita Kothiyal(rachita@fsl.cs.sunysb.edu)
fs/unionfs/dirhelper.c
fs/unionfs/inode.c

index c3cc9a3e0a4976cc9e1b71692a295fe326970316..3e726388bd20b4c158f651be3913c639b9d943df 100644 (file)
@@ -218,6 +218,7 @@ int check_empty(struct dentry *dentry, struct unionfs_dir_state **namelist)
        int bindex, bstart, bend, bopaque;
 
        sb = dentry->d_sb;
+       unionfs_read_lock(sb);
 
 
        BUG_ON(!S_ISDIR(dentry->d_inode->i_mode));
index e4ca03a784f69327c89208dbc8a2433421aba869..82c2398e3adafe9be4e0e59f6cdecc793bd6af55 100644 (file)
@@ -345,6 +345,7 @@ static int unionfs_symlink(struct inode *dir, struct dentry *dentry,
        umode_t mode;
        int bstart;
 
+       unionfs_read_lock(dentry->d_sb);
        unionfs_lock_dentry(dentry);
 
        if (unlikely(dentry->d_inode &&
@@ -550,6 +551,7 @@ static int unionfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
        struct dentry *lower_parent_dentry = NULL;
        int bstart;
 
+       unionfs_read_lock(dentry->d_sb);
        unionfs_lock_dentry(dentry);
 
        if (unlikely(dentry->d_inode &&
@@ -721,7 +723,6 @@ static void unionfs_put_link(struct dentry *dentry, struct nameidata *nd,
 {
        unionfs_read_lock(dentry->d_sb);
 
-       unionfs_read_lock(dentry->d_sb);
        unionfs_lock_dentry(dentry);
        if (unlikely(!__unionfs_d_revalidate_chain(dentry, nd, false)))
                printk(KERN_ERR