summaryrefslogtreecommitdiff
path: root/fs/btrfs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2022-06-17 12:04:11 +0200
committerDavid Sterba <dsterba@suse.com>2022-07-25 17:45:40 +0200
commit82443fd55c5adb0643f28fb7576a8605d0d41485 (patch)
treebf33770253e9d1b26b1cf207923bb7e7af237b18 /fs/btrfs
parentb9af128d1e81645e7d9030e30def06ea5032f201 (diff)
btrfs: simplify sync/async submission in btrfs_submit_data_write_bio
btrfs_submit_data_write_bio special cases the reloc root because the checksums are preloaded, but only does so for the !sync case. The sync case can't happen for data relocation, but just handling it more generally significantly simplifies the logic. Reviewed-by: Nikolay Borisov <nborisov@suse.com> Tested-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/inode.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index fe7e8af21c2d..dade66ee2200 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -2664,28 +2664,25 @@ void btrfs_submit_data_write_bio(struct inode *inode, struct bio *bio, int mirro
}
/*
- * Rules for async/sync submit:
- * a) write without checksum: sync submit
- * b) write with checksum:
- * b-1) if bio is issued by fsync: sync submit
- * (sync_writers != 0)
- * b-2) if root is reloc root: sync submit
- * (only in case of buffered IO)
- * b-3) otherwise: async submit
+ * If we need to checksum, and the I/O is not issued by fsync and
+ * friends, that is ->sync_writers != 0, defer the submission to a
+ * workqueue to parallelize it.
+ *
+ * Csum items for reloc roots have already been cloned at this point,
+ * so they are handled as part of the no-checksum case.
*/
if (!(bi->flags & BTRFS_INODE_NODATASUM) &&
- !test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state)) {
- if (atomic_read(&bi->sync_writers)) {
- ret = btrfs_csum_one_bio(bi, bio, (u64)-1, false);
- if (ret)
- goto out;
- } else if (btrfs_is_data_reloc_root(bi->root)) {
- ; /* Csum items have already been cloned */
- } else {
+ !test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state) &&
+ !btrfs_is_data_reloc_root(bi->root)) {
+ if (!atomic_read(&bi->sync_writers)) {
ret = btrfs_wq_submit_bio(inode, bio, mirror_num, 0,
btrfs_submit_bio_start);
goto out;
}
+
+ ret = btrfs_csum_one_bio(bi, bio, (u64)-1, false);
+ if (ret)
+ goto out;
}
btrfs_submit_bio(fs_info, bio, mirror_num);
return;