[Unionfs] Locking issue with unionfs
Herton Ronaldo Krzesinski
herton at mandriva.com.br
Fri Oct 19 09:47:12 EDT 2007
Hi,
While using unionfs (2.1.3) we are having a problem. basically if you do something
like this:
- mkdir -p /live/distrib
- install a distro into /live/distrib so you can do a chroot/play with it
- mkdir -p /live/memory
- mount -t tmpfs none /live/memory
- mkdir -p /live/union
- mount -o dirs=/live/memory=rw:/live/distrib=ro -t unionfs
unionfs /live/union
- chroot /live/union
- mkdir /foo
- mount -t unionfs -o remount,add=/foo=rw none /live/union
Then the last command freezes, instead of giving a error. This is just an
example for reproducing, not a real usage. The real usage is using something
similar to do something like a pivot root inside a live cd.
Looking at the stack trace of mount command, you have something like this:
mount D dbdb8800 0 13892 13843
d1563b50 00200082 d739b000 dbdb8800 00000000 006013d4 c040f320 c040e9e0
c040e9e0 c040e9e0 d739b000 cd2d2580 cd2d26ac c13889e0 d739b000 dbdb8800
00000000 d1563baa d9b35000 d739b000 fffeffff d9337d68 cd2d2580 d1563b74
Call Trace:
[<c01f9015>] rwsem_down_failed_common+0x75/0x180
[<c03157cd>] rwsem_down_read_failed+0x1d/0x28
[<c0315853>] call_rwsem_down_read_failed+0x7/0xc
[<dcf0f6df>] unionfs_lookup+0x1f/0x170 [unionfs]
[<c018ad90>] do_lookup+0x110/0x190
[<c018cfcc>] __link_path_walk+0x74c/0xdf0
[<c018d6b6>] link_path_walk+0x46/0xd0
[<c018d759>] path_walk+0x19/0x20
[<c018d917>] do_path_lookup+0x87/0x230
[<c018e627>] path_lookup+0x17/0x20
[<dcf1262c>] do_remount_add_option+0x10c/0x270 [unionfs]
[<dcf130dd>] unionfs_remount_fs+0x39d/0x8b0 [unionfs]
[<c01853c1>] do_remount_sb+0xc1/0x130
[<c019ab4d>] do_mount+0x23d/0x6d0
[<c019b55f>] sys_mount+0x6f/0xb0
[<c01041ba>] sysenter_past_esp+0x6b/0xa1
Looking at above, we can see that unionfs is locked at unionfs_lookup,
probably at "unionfs_read_lock(sb);". Then if you analyze the stack trace
above looking at the other unionfs functions, you discover that in
unionfs_remount_fs there is a "unionfs_write_lock(sb)", and because this the
deadlock happens. I made a patch that at least seems to have worked here on a
quick test as a workaround, I don't know yet if it has some side effect or if
could be the proper fix for this locking issue, here it's the patch:
--- linux-2.6.22.10-0.2mdv/fs/unionfs/super.c 2007-10-18
17:11:39.000000000 -0200
+++ linux-2.6.22.10-0.2mdv.mod/fs/unionfs/super.c 2007-10-18
16:56:39.000000000 -0200
@@ -587,10 +587,12 @@ static int unionfs_remount_fs(struct sup
}
if (!strcmp("add", optname)) {
+ unionfs_write_unlock(sb);
err = do_remount_add_option(optarg, new_branches,
tmp_data,
tmp_lower_paths,
&new_high_branch_id);
+ unionfs_write_lock(sb);
if (err)
goto out_release;
new_branches++;
I just unlock temporarily sb, probably not the right fix, as I didn't
understand well the locking scheme yet.
--
[]'s
Herton
More information about the unionfs
mailing list