Re: [RFC PATCH 1/3] VFS: Fix s_umount thaw/write deadlock
From: Dave Chinner <david@fromorbit.com>
Date: 2011-09-18 23:25:17
Also in:
linux-fsdevel
On Wed, Sep 14, 2011 at 04:53:38PM -0700, Valerie Aurora wrote:
On Wed, Sep 14, 2011 at 7:00 AM, Jan Kara [off-list ref] wrote:quoted
On Mon 12-09-11 19:57:11, Valerie Aurora wrote:quoted
Val, if you are sending patches as attachments, make them at least text/plain please!Oops, sorry.quoted
quoted
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 04cf3b9..d1dca03 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c@@ -537,6 +537,9 @@ static long writeback_sb_inodes(struct super_block *sb,long write_chunk; long wrote = 0; /* count both pages and inodes */ + if (vfs_is_frozen(sb)) + return 0; +Umm, maybe we could make this more robust by skipping the superblock in __writeback_inodes_wb() and just explicitely stopping the writeback when work->sb is set (i.e. writeback is required only for frozen sb) in wb_writeback()?Sorry, I don't quite understand what the goal is here? I'm happy to make the change, just want to make sure I'm accomplishing what you want.quoted
quoted
while (!list_empty(&wb->b_io)) { struct inode *inode = wb_inode(wb->b_io.prev);@@ -1238,39 +1241,43 @@ EXPORT_SYMBOL(writeback_inodes_sb);* writeback_inodes_sb_if_idle - start writeback if none underway * @sb: the superblock * - * Invoke writeback_inodes_sb if no writeback is currently underway. - * Returns 1 if writeback was started, 0 if not. + * Invoke writeback_inodes_sb if no writeback is currently underway + * and no one else holds the s_umount lock. Returns 1 if writeback + * was started, 0 if not. */ int writeback_inodes_sb_if_idle(struct super_block *sb) { if (!writeback_in_progress(sb->s_bdi)) { - down_read(&sb->s_umount); - writeback_inodes_sb(sb); - up_read(&sb->s_umount); - return 1; - } else - return 0; + if (down_read_trylock(&sb->s_umount)) {What's exactly the deadlock trylock protects from here? Or is it just an optimization?The trylock is an optimization Dave Chinner suggested. The first version I wrote acquired the lock and then checked vfs_is_frozen().
It's not so much an optimisation, but the general case of avoiding read-write deadlocks such that freezing can trigger. I think remount can trigger the same deadlock as freezing, so the trylock avoids both deadlock cases rather than just working around the freeze problem.... Cheers, Dave. -- Dave Chinner david@fromorbit.com -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html