| From: Omar Sandoval <osandov@fb.com> |
| Date: Tue, 5 Dec 2017 22:54:02 -0800 |
| Subject: Btrfs: disable FUA if mounted with nobarrier |
| |
| commit 1b9e619c5bc8235cfba3dc4ced2fb0e3554a05d4 upstream. |
| |
| 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. |
| |
| Fixes: 387125fc722a8ed ("Btrfs: fix barrier flushes") |
| Signed-off-by: Omar Sandoval <osandov@fb.com> |
| Reviewed-by: Qu Wenruo <wqu@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| [bwh: Backported to 3.16: |
| - I/O flag names are different, and are combined with the operation type |
| - Use the do_barrier parameter instead of checking the NOBARRIER option again] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| --- a/fs/btrfs/disk-io.c |
| +++ b/fs/btrfs/disk-io.c |
| @@ -3140,6 +3140,7 @@ static int write_dev_supers(struct btrfs |
| int errors = 0; |
| u32 crc; |
| u64 bytenr; |
| + int op_flags; |
| |
| if (max_mirrors == 0) |
| max_mirrors = BTRFS_SUPER_MIRROR_MAX; |
| @@ -3204,10 +3205,10 @@ static int write_dev_supers(struct btrfs |
| * we fua the first super. The others we allow |
| * to go down lazy. |
| */ |
| - if (i == 0) |
| - ret = btrfsic_submit_bh(WRITE_FUA, bh); |
| - else |
| - ret = btrfsic_submit_bh(WRITE_SYNC, bh); |
| + op_flags = REQ_SYNC | REQ_NOIDLE; |
| + if (i == 0 && do_barriers) |
| + op_flags |= REQ_FUA; |
| + ret = btrfsic_submit_bh(WRITE | op_flags, bh); |
| if (ret) |
| errors++; |
| } |