Message ID | bf59f09eff9232dcb5872aab4c975a776232b6ac.1512543205.git.osandov@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2017年12月06日 14:54, Omar Sandoval wrote: > From: Omar Sandoval <osandov@fb.com> > > I was seeing disk flushes still happening when I mounted a Btrfs > filesystem with nobarrier for testing. This is because we use FUA to > write out the first super block, and on devices without FUA support, the > block layer translates FUA to a flush. Even on devices supporting true > FUA, using FUA when we asked for no barriers is surprising. > > Signed-off-by: Omar Sandoval <osandov@fb.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu > --- > fs/btrfs/disk-io.c | 12 +++++------- > 1 file changed, 5 insertions(+), 7 deletions(-) > > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index 10a2a579cc7f..a8ecccfc36de 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -3231,6 +3231,7 @@ static int write_dev_supers(struct btrfs_device *device, > int errors = 0; > u32 crc; > u64 bytenr; > + int op_flags; > > if (max_mirrors == 0) > max_mirrors = BTRFS_SUPER_MIRROR_MAX; > @@ -3273,13 +3274,10 @@ 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_SYNC | REQ_FUA | REQ_META | REQ_PRIO, bh); > - } else { > - ret = btrfsic_submit_bh(REQ_OP_WRITE, > - REQ_SYNC | REQ_META | REQ_PRIO, bh); > - } > + op_flags = REQ_SYNC | REQ_META | REQ_PRIO; > + if (i == 0 && !btrfs_test_opt(device->fs_info, NOBARRIER)) > + op_flags |= REQ_FUA; > + ret = btrfsic_submit_bh(REQ_OP_WRITE, op_flags, bh); > if (ret) > errors++; > } >
On Tue, Dec 05, 2017 at 10:54:02PM -0800, Omar Sandoval wrote: > From: Omar Sandoval <osandov@fb.com> > > I was seeing disk flushes still happening when I mounted a Btrfs > filesystem with nobarrier for testing. This is because we use FUA to > write out the first super block, and on devices without FUA support, the > block layer translates FUA to a flush. Even on devices supporting true > FUA, using FUA when we asked for no barriers is surprising. > > Signed-off-by: Omar Sandoval <osandov@fb.com> Reviewed-by: David Sterba <dsterba@suse.com> The documented nobarrier behaviour matches the updated code. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 10a2a579cc7f..a8ecccfc36de 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3231,6 +3231,7 @@ static int write_dev_supers(struct btrfs_device *device, int errors = 0; u32 crc; u64 bytenr; + int op_flags; if (max_mirrors == 0) max_mirrors = BTRFS_SUPER_MIRROR_MAX; @@ -3273,13 +3274,10 @@ 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_SYNC | REQ_FUA | REQ_META | REQ_PRIO, bh); - } else { - ret = btrfsic_submit_bh(REQ_OP_WRITE, - REQ_SYNC | REQ_META | REQ_PRIO, bh); - } + op_flags = REQ_SYNC | REQ_META | REQ_PRIO; + if (i == 0 && !btrfs_test_opt(device->fs_info, NOBARRIER)) + op_flags |= REQ_FUA; + ret = btrfsic_submit_bh(REQ_OP_WRITE, op_flags, bh); if (ret) errors++; }