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