From: Frederik Deweerdt On Thu, Jan 04, 2007 at 10:02:00PM -0800, Andrew Morton wrote: > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.20-rc3/2.6.20-rc3-mm1/ Hi, The reiser4-sb_sync_inodes.patch, which goal is to: "This patch moves spin_lock/spin_unlock down to sync_sb_inodes." Only really moved the spin_unlock, thus triggering the following lockdep message: [ 65.267402] ===================================== [ 65.267508] [ BUG: bad unlock balance detected! ] [ 65.267563] ------------------------------------- [ 65.267619] swapper/0 is trying to release lock (inode_lock) at: [ 65.267751] [] generic_sync_sb_inodes+0xa6/0x2e8 [ 65.267853] but there are no more locks to release! [ 65.267908] [ 65.267909] other info that might help us debug this: [ 65.268014] 1 lock held by swapper/0: [ 65.268068] #0: (&type->s_umount_key){--..}, at: [] alloc_super+0xe8/0x1a5 [ 65.268330] [ 65.268330] stack backtrace: [ 65.268433] [] show_trace_log_lvl+0x1a/0x30 [ 65.268528] [] show_trace+0x12/0x14 [ 65.268621] [] dump_stack+0x16/0x18 [ 65.268714] [] print_unlock_inbalance_bug+0xce/0xd8 [ 65.268811] [] lock_release_non_nested+0x6f/0x172 [ 65.268907] [] lock_release_nested+0x34/0xdc [ 65.269001] [] __lock_release+0x54/0x56 [ 65.269095] [] lock_release+0x46/0x60 [ 65.269188] [] _spin_unlock+0x16/0x40 [ 65.269284] [] generic_sync_sb_inodes+0xa6/0x2e8 [ 65.269379] [] sync_sb_inodes+0x20/0x23 [ 65.269472] [] sync_inodes_sb+0x82/0x8a [ 65.269566] [] __fsync_super+0xd/0x84 [ 65.269659] [] fsync_super+0xb/0x19 [ 65.269753] [] do_remount_sb+0x30/0xee [ 65.269846] [] get_sb_single+0x66/0x8b [ 65.269940] [] sysfs_get_sb+0x1d/0x2c [ 65.270036] [] vfs_kern_mount+0x82/0xfb [ 65.270130] [] kern_mount+0x16/0x1d [ 65.270223] [] sysfs_init+0x57/0xad [ 65.270319] [] mnt_init+0xbf/0x13b [ 65.270412] [] vfs_caches_init+0x97/0xa7 [ 65.270506] [] start_kernel+0x1ca/0x261 [ 65.270600] [<00000000>] 0x0 [ 65.270691] ======================= Regards, Frederik Signed-off-by: Frederik Deweerdt Signed-off-by: Andrew Morton --- fs/fs-writeback.c | 2 ++ 1 files changed, 2 insertions(+) diff -puN fs/fs-writeback.c~reiser4-sb_sync_inodes-fix fs/fs-writeback.c --- a/fs/fs-writeback.c~reiser4-sb_sync_inodes-fix +++ a/fs/fs-writeback.c @@ -317,6 +317,8 @@ int generic_sync_sb_inodes(struct super_ const unsigned long start = jiffies; /* livelock avoidance */ int ret = 0; + spin_lock(&inode_lock); + if (!wbc->for_kupdate || list_empty(&sb->s_io)) list_splice_init(&sb->s_dirty, &sb->s_io); _