I believe there's a locking deadlock/race b/w unionctl and revalidating
the parent.

namely.

unionctl will lock / in 

write_lock
lock_dentry()

while 

revalidate locks it in 

lock_dentry()
read_lock()

hence deadlock city (advantage of this for me, was that I've now learned
how to debug deadlocks w/ sysrq's process dump trigger and objdump help)

here's the patch


diff -ur unionfs-20051126-1822/branchman.c
unionfs-20051126-1822.new/branchman.c---
unionfs-20051126-1822/branchman.c   2005-11-26 18:22:04.000000000 -0500
+++ unionfs-20051126-1822.new/branchman.c       2005-11-27
21:04:00.000000000 -0500
@@ -232,8 +232,8 @@
                goto out;
        }

-       unionfs_write_lock(inode->i_sb);
        lock_dentry(inode->i_sb->s_root);
+       unionfs_write_lock(inode->i_sb);

        err = -EINVAL;
        if (addargs->ab_branch < 0
@@ -371,8 +371,8 @@
        fixputmaps(inode->i_sb);

       out:
-       unlock_dentry(inode->i_sb->s_root);
        unionfs_write_unlock(inode->i_sb);
+       unlock_dentry(inode->i_sb->s_root);

        KFREE(new_hidden_mnt);
        KFREE(new_udi_dentry);
@@ -483,8 +483,8 @@

        print_entry_location();

-       unionfs_write_lock(inode->i_sb);
        lock_dentry(inode->i_sb->s_root);
+       unionfs_write_lock(inode->i_sb);

        if ((err = newputmap(inode->i_sb)))
                goto out;
@@ -518,8 +518,8 @@
        err = 0;

       out:
-       unlock_dentry(inode->i_sb->s_root);
        unionfs_write_unlock(inode->i_sb);
+       unlock_dentry(inode->i_sb->s_root);
        KFREE(rdwrargs);

        print_exit_status(err);


_______________________________________________
unionfs mailing list
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs

Reply via email to