On Wed, Sep 14, 2011 at 04:53:38PM -0700, Valerie Aurora wrote: > On Wed, Sep 14, 2011 at 7:00 AM, Jan Kara <jack@xxxxxxx> wrote: > > On Mon 12-09-11 19:57:11, Valerie Aurora wrote: > >> Val, if you are sending patches as attachments, make them at least > >> text/plain please! > > Oops, sorry. > > >> 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. > > >> 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@xxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html