On Wed 18-08-10 05:29:17, Christoph Hellwig wrote: > Switch to the WRITE_FLUSH_FUA flag for journal commits and remove the > EOPNOTSUPP detection for barriers. Well, in the context of just this patch series, the patch is OK so you can add Acked-by: Jan Kara But as soon as blkdev_issue_flush() stops draining the queue, commit when JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT is set breaks. Do you plan to fix that separately? Actually, attached is a patch which should fix ASYNC_COMMIT code... The patch is totally untested, I just wrote it because it's simpler than explaining what needs to be done ;). Honza > > Signed-off-by: Christoph Hellwig > > Index: linux-2.6/fs/jbd2/commit.c > =================================================================== > --- linux-2.6.orig/fs/jbd2/commit.c 2010-08-17 16:52:37.111011684 +0200 > +++ linux-2.6/fs/jbd2/commit.c 2010-08-17 16:53:50.531029420 +0200 > @@ -134,25 +134,10 @@ static int journal_submit_commit_record( > > if (journal->j_flags & JBD2_BARRIER && > !JBD2_HAS_INCOMPAT_FEATURE(journal, > - JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { > - ret = submit_bh(WRITE_SYNC_PLUG | WRITE_BARRIER, bh); > - if (ret == -EOPNOTSUPP) { > - printk(KERN_WARNING > - "JBD: barrier-based sync failed on %s - " > - "disabling barriers\n", journal->j_devname); > - spin_lock(&journal->j_state_lock); > - journal->j_flags &= ~JBD2_BARRIER; > - spin_unlock(&journal->j_state_lock); > - > - /* And try again, without the barrier */ > - lock_buffer(bh); > - set_buffer_uptodate(bh); > - clear_buffer_dirty(bh); > - ret = submit_bh(WRITE_SYNC_PLUG, bh); > - } > - } else { > + JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) > + ret = submit_bh(WRITE_SYNC_PLUG | WRITE_FLUSH_FUA, bh); > + else > ret = submit_bh(WRITE_SYNC_PLUG, bh); > - } > > *cbh = bh; > return ret; > @@ -167,29 +152,8 @@ static int journal_wait_on_commit_record > { > int ret = 0; > > -retry: > clear_buffer_dirty(bh); > wait_on_buffer(bh); > - if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) { > - printk(KERN_WARNING > - "JBD2: wait_on_commit_record: sync failed on %s - " > - "disabling barriers\n", journal->j_devname); > - spin_lock(&journal->j_state_lock); > - journal->j_flags &= ~JBD2_BARRIER; > - spin_unlock(&journal->j_state_lock); > - > - lock_buffer(bh); > - clear_buffer_dirty(bh); > - set_buffer_uptodate(bh); > - bh->b_end_io = journal_end_buffer_io_sync; > - > - ret = submit_bh(WRITE_SYNC_PLUG, bh); > - if (ret) { > - unlock_buffer(bh); > - return ret; > - } > - goto retry; > - } > > if (unlikely(!buffer_uptodate(bh))) > ret = -EIO; > -- Jan Kara SUSE Labs, CR