Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ead188f9 authored by Jan Kara's avatar Jan Kara Committed by Fengguang Wu
Browse files

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: default avatarTheodore Ts'o <tytso@mit.edu>
Tested-by: default avatarTheodore Ts'o <tytso@mit.edu>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarFengguang Wu <fengguang.wu@intel.com>
parent f8f5701b
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -664,6 +664,7 @@ static long writeback_sb_inodes(struct super_block *sb,
			/* Wait for I_SYNC. This function drops i_lock... */
			/* Wait for I_SYNC. This function drops i_lock... */
			inode_sleep_on_writeback(inode);
			inode_sleep_on_writeback(inode);
			/* Inode may be gone, start again */
			/* Inode may be gone, start again */
			spin_lock(&wb->list_lock);
			continue;
			continue;
		}
		}
		inode->i_state |= I_SYNC;
		inode->i_state |= I_SYNC;