On Tue, May 02, 2017 at 05:03:50PM +0200, Jan Kara wrote: > Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as > synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...} > definitions. generic_make_request_checks() however strips REQ_FUA and > REQ_PREFLUSH flags from a bio when the storage doesn't report volatile > write cache and thus write effectively becomes asynchronous which can > lead to performance regressions > > Fix the problem by making sure all bios which are synchronous are > properly marked with REQ_SYNC. > Reviewed-by: Liu Bo <bo.li.liu@xxxxxxxxxx> Thanks, -liubo > CC: David Sterba <dsterba@xxxxxxxx> > CC: linux-btrfs@xxxxxxxxxxxxxxx > Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3 > Signed-off-by: Jan Kara <jack@xxxxxxx> > --- > fs/btrfs/disk-io.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index eb1ee7b6f532..af75a9aab81e 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -3488,10 +3488,12 @@ static int write_dev_supers(struct btrfs_device *device, > * we fua the first super. The others we allow > * to go down lazy. > */ > - if (i == 0) > - ret = btrfsic_submit_bh(REQ_OP_WRITE, REQ_FUA, bh); > - else > + if (i == 0) { > + ret = btrfsic_submit_bh(REQ_OP_WRITE, > + REQ_SYNC | REQ_FUA, bh); > + } else { > ret = btrfsic_submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); > + } > if (ret) > errors++; > } > @@ -3555,7 +3557,7 @@ static int write_dev_flush(struct btrfs_device *device, int wait) > > bio->bi_end_io = btrfs_end_empty_barrier; > bio->bi_bdev = device->bdev; > - bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; > + bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH; > init_completion(&device->flush_wait); > bio->bi_private = &device->flush_wait; > device->flush_bio = bio; > -- > 2.12.0 >