On 2017年12月06日 14:54, Omar Sandoval wrote:
> From: Omar Sandoval <osandov@xxxxxx>
>
> 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@xxxxxx>
Reviewed-by: Qu Wenruo <wqu@xxxxxxxx>
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++;
> }
>
Attachment:
signature.asc
Description: OpenPGP digital signature
