diff options
author | Jan Kara <jack@suse.cz> | 2012-06-08 11:07:36 -0400 |
---|---|---|
committer | Fengguang Wu <fengguang.wu@intel.com> | 2012-06-08 19:32:15 -0400 |
commit | ead188f9f930fb5d7f0c49315a7fce3d8bd16b7e (patch) | |
tree | 1d5630f3b49814f89720624d4269ccf2b25e4974 | |
parent | f8f5701bdaf9134b1f90e5044a82c66324d2073f (diff) |
writeback: Fix lock imbalance in writeback_sb_inodes()
Fix bug introduced by 169ebd90. We have to have wb_list_lock locked when
restarting writeback loop after having waited for inode writeback.
Bug description by Ted Tso:
I can reproduce this fairly easily by using ext4 w/o a journal, running
under KVM with 1024megs memory, with fsstress (xfstests #13):
[ 45.153294] =====================================
[ 45.154784] [ BUG: bad unlock balance detected! ]
[ 45.155591] 3.5.0-rc1-00002-gb22b1f1 #124 Not tainted
[ 45.155591] -------------------------------------
[ 45.155591] flush-254:16/2499 is trying to release lock (&(&wb->list_lock)->rlock) at:
[ 45.155591] [<c022c3da>] writeback_sb_inodes+0x160/0x327
[ 45.155591] but there are no more locks to release!
Reported-by: Theodore Ts'o <tytso@mit.edu>
Tested-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
-rw-r--r-- | fs/fs-writeback.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 8d2fb8c88cf3..41a3ccff18d8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -664,6 +664,7 @@ static long writeback_sb_inodes(struct super_block *sb, | |||
664 | /* Wait for I_SYNC. This function drops i_lock... */ | 664 | /* Wait for I_SYNC. This function drops i_lock... */ |
665 | inode_sleep_on_writeback(inode); | 665 | inode_sleep_on_writeback(inode); |
666 | /* Inode may be gone, start again */ | 666 | /* Inode may be gone, start again */ |
667 | spin_lock(&wb->list_lock); | ||
667 | continue; | 668 | continue; |
668 | } | 669 | } |
669 | inode->i_state |= I_SYNC; | 670 | inode->i_state |= I_SYNC; |