From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Cc: linux-block@vger.kernel.org, dm-devel@redhat.com
Subject: [PATCH RFC 09/11] btrfs: remove bio split operations in btrfs_submit_direct()
Date: Sun, 28 Nov 2021 13:52:57 +0800 [thread overview]
Message-ID: <20211128055259.39249-10-wqu@suse.com> (raw)
In-Reply-To: <20211128055259.39249-1-wqu@suse.com>
Since btrfs_map_bio() will handle the split, there is no need to do the
split in btrfs_submit_direct() anymore.
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
fs/btrfs/inode.c | 116 +++++++++--------------------------------------
1 file changed, 22 insertions(+), 94 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 1bf56c2b4bd9..24c8bb6d8543 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8202,22 +8202,16 @@ static void btrfs_end_dio_bio(struct bio *bio)
}
static inline blk_status_t btrfs_submit_dio_bio(struct bio *bio,
- struct inode *inode, u64 file_offset, int async_submit)
+ struct inode *inode, u64 file_offset)
{
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
struct btrfs_dio_private *dip = bio->bi_private;
bool write = btrfs_op(bio) == BTRFS_MAP_WRITE;
+ bool async_submit;
blk_status_t ret;
- /*
- * Check btrfs_submit_data_bio() for rules about async submit.
- *
- * The only exception is for RAID56, when there are more than one bios
- * to submit, async submit seems to make it harder to collect csums
- * for the full stripe.
- */
- if (async_submit)
- async_submit = !atomic_read(&BTRFS_I(inode)->sync_writers);
+ /* Check btrfs_submit_data_bio() for rules about async submit. */
+ async_submit = !atomic_read(&BTRFS_I(inode)->sync_writers);
if (!write)
btrfs_bio(bio)->endio_type = BTRFS_WQ_ENDIO_DATA;
@@ -8291,20 +8285,9 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
{
struct inode *inode = iter->inode;
const bool write = (btrfs_op(dio_bio) == BTRFS_MAP_WRITE);
- struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
- const bool raid56 = (btrfs_data_alloc_profile(fs_info) &
- BTRFS_BLOCK_GROUP_RAID56_MASK);
struct btrfs_dio_private *dip;
struct bio *bio;
- u64 start_sector;
- int async_submit = 0;
- u64 submit_len;
- u64 clone_offset = 0;
- u64 clone_len;
- u64 logical;
- int ret;
blk_status_t status;
- struct btrfs_io_geometry geom;
struct btrfs_dio_data *dio_data = iter->iomap.private;
struct extent_map *em = NULL;
@@ -8331,84 +8314,29 @@ static void btrfs_submit_direct(const struct iomap_iter *iter,
goto out_err;
}
- start_sector = dio_bio->bi_iter.bi_sector;
- submit_len = dio_bio->bi_iter.bi_size;
-
- do {
- logical = start_sector << 9;
- em = btrfs_get_chunk_map(fs_info, logical, submit_len);
- if (IS_ERR(em)) {
- status = errno_to_blk_status(PTR_ERR(em));
- em = NULL;
- goto out_err_em;
- }
- ret = btrfs_get_io_geometry(fs_info, em, btrfs_op(dio_bio),
- logical, &geom);
- if (ret) {
- status = errno_to_blk_status(ret);
- goto out_err_em;
- }
-
- clone_len = min(submit_len, geom.len);
- ASSERT(clone_len <= UINT_MAX);
-
- /*
- * This will never fail as it's passing GPF_NOFS and
- * the allocation is backed by btrfs_bioset.
- */
- bio = btrfs_bio_clone_partial(dio_bio, clone_offset, clone_len);
- bio->bi_private = dip;
- bio->bi_end_io = btrfs_end_dio_bio;
-
- if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
- status = extract_ordered_extent(BTRFS_I(inode), bio,
- file_offset);
- if (status) {
- bio_put(bio);
- goto out_err;
- }
- }
-
- ASSERT(submit_len >= clone_len);
- submit_len -= clone_len;
-
- /*
- * Increase the count before we submit the bio so we know
- * the end IO handler won't happen before we increase the
- * count. Otherwise, the dip might get freed before we're
- * done setting it up.
- *
- * We transfer the initial reference to the last bio, so we
- * don't need to increment the reference count for the last one.
- */
- if (submit_len > 0) {
- refcount_inc(&dip->refs);
- /*
- * If we are submitting more than one bio, submit them
- * all asynchronously. The exception is RAID 5 or 6, as
- * asynchronous checksums make it difficult to collect
- * full stripe writes.
- */
- if (!raid56)
- async_submit = 1;
- }
+ /*
+ * This will never fail as it's passing GPF_NOFS and
+ * the allocation is backed by btrfs_bioset.
+ */
+ bio = btrfs_bio_clone(dio_bio);
+ bio->bi_private = dip;
+ bio->bi_end_io = btrfs_end_dio_bio;
- status = btrfs_submit_dio_bio(bio, inode, file_offset,
- async_submit);
+ if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
+ status = extract_ordered_extent(BTRFS_I(inode), bio,
+ file_offset);
if (status) {
bio_put(bio);
- if (submit_len > 0)
- refcount_dec(&dip->refs);
- goto out_err_em;
+ goto out_err;
}
+ }
- dio_data->submitted += clone_len;
- clone_offset += clone_len;
- start_sector += clone_len >> 9;
- file_offset += clone_len;
-
- free_extent_map(em);
- } while (submit_len > 0);
+ status = btrfs_submit_dio_bio(bio, inode, file_offset);
+ if (status) {
+ bio_put(bio);
+ goto out_err_em;
+ }
+ dio_data->submitted += dio_bio->bi_iter.bi_size;
return;
out_err_em:
--
2.34.0
next prev parent reply other threads:[~2021-11-28 5:55 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-28 5:52 [PATCH RFC 00/11] btrfs: split bio at btrfs_map_bio() time Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 01/11] btrfs: update an stale comment on btrfs_submit_bio_hook() Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 02/11] btrfs: refactor btrfs_map_bio() Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 03/11] btrfs: move btrfs_bio_wq_end_io() calls into submit_stripe_bio() Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 04/11] btrfs: introduce btrfs_bio_split() helper Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 05/11] btrfs: save bio::bi_iter into btrfs_bio::iter before submitting Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 06/11] btrfs: make end_bio_extent_readpage() to handle split bio properly Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 07/11] btrfs: make end_bio_extent_*_writepage() to handle split biot properly Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 08/11] btrfs: allow btrfs_map_bio() to split bio according to chunk stripe boundaries Qu Wenruo
2021-11-28 5:52 ` Qu Wenruo [this message]
2021-11-30 13:54 ` [btrfs] 675923ac06: BUG:KASAN:use-after-free_in__blk_queue_split kernel test robot
2021-11-28 5:52 ` [PATCH RFC 10/11] btrfs: remove btrfs_bio_ctrl::len_to_stripe_boundary Qu Wenruo
2021-11-28 5:52 ` [PATCH RFC 11/11] btrfs: temporarily disable RAID56 Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211128055259.39249-10-wqu@suse.com \
--to=wqu@suse.com \
--cc=dm-devel@redhat.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).