From: Christoph Hellwig <hch@lst.de>
To: Nikolay Borisov <nborisov@suse.com>
Cc: Christoph Hellwig <hch@lst.de>, David Sterba <dsterba@suse.com>,
Josef Bacik <josef@toxicpanda.com>, Qu Wenruo <wqu@suse.com>,
linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 10/10] btrfs: remove bioc->stripes_pending
Date: Mon, 20 Jun 2022 13:23:37 +0200 [thread overview]
Message-ID: <20220620112337.GA16136@lst.de> (raw)
In-Reply-To: <8b478441-ab11-575b-5dba-1136a26cfc35@suse.com>
On Mon, Jun 20, 2022 at 12:34:48PM +0300, Nikolay Borisov wrote:
> write to a RAID1 fs. So we have to do 2 writes - 1 of the orig bio, 1 of a
> stripe bio so we make 1 clone of the orig bio, call bio_inc_remaining and
> orig_bio->__bi_remaining is 2. So the 2 bios get submitted.
Yes.
> If the stripe bio is completed first 'if (bio != orig_bio) {' check in
> btrfs_end_bio ensures that the function is really a noop. Subsequently when
> orig_bio is completed it proceeds to executed:
>
> orig_bio->bi_end_io(orig_bio);
Yes.
> Consider the same scenario, but this time if orig_bio is completed first
> then we proceed directly calling orig_bio->bi_end_io(orig_bio);
No, it doesn't. When the low-level block driver calls bio_endio for
orig_bio, bio_endio calls bio_remaining_done which does an atomic
atomic_dec_and_test, which returns false because __bi_remaining is still
1 after the call. That causes bio_endio to just return and not call
->bi_end_io. Only when the cloned bio completes and calls bio_endio on
orig_bio again (from btrfs_end_bio) that atomic_dec_and_test now
returns true and ->bi_end_io is called on the orig_bio.
> bypassing
> bio_endio and the __bi_remaining checks etc. So shouldn't this
> orig_bio->bi_end_io(orig_bio); be converted to bio_endio call ?
The orig_bio->bi_end_io(orig_bio) from btrfs_end_bio and
btrfs_end_bio_work is weird. It used to be a bio_endio call before
this series, but that is actualy wrong as the bio has already been
completed. The bio is done and we just need to propagate it to the
submitter of the original btrfs_bio. The right thing would be to
call this as:
bioc->end_io(orig_bio);
but doing so would break the repair code that has way too much
magic behavior for its own sake.
next prev parent reply other threads:[~2022-06-20 11:23 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-17 10:04 cleanup btrfs bio submission v2 Christoph Hellwig
2022-06-17 10:04 ` [PATCH 01/10] btrfs: remove a bunch of pointles stripe_len arguments Christoph Hellwig
2022-06-20 17:16 ` David Sterba
2022-06-20 17:38 ` Christoph Hellwig
2022-06-22 4:19 ` Christoph Hellwig
2022-06-22 14:07 ` David Sterba
2022-06-22 4:30 ` Qu Wenruo
2022-06-17 10:04 ` [PATCH 02/10] btrfs: return proper mapped length for RAID56 profiles in __btrfs_map_block() Christoph Hellwig
2022-06-17 10:04 ` [PATCH 03/10] btrfs: remove the btrfs_map_bio return value Christoph Hellwig
2022-06-17 10:04 ` [PATCH 04/10] btrfs: remove the raid56_parity_write " Christoph Hellwig
2022-06-17 10:38 ` Qu Wenruo
2022-06-18 11:04 ` Johannes Thumshirn
2022-06-17 10:04 ` [PATCH 05/10] btrfs: remove the raid56_parity_recover " Christoph Hellwig
2022-06-18 11:06 ` Johannes Thumshirn
2022-06-19 6:35 ` Christoph Hellwig
2022-06-19 10:35 ` Qu Wenruo
2022-06-17 10:04 ` [PATCH 06/10] btrfs: transfer the bio counter reference to the raid submission helpers Christoph Hellwig
2022-06-19 10:45 ` Qu Wenruo
2022-06-19 21:50 ` Qu Wenruo
2022-06-20 7:47 ` Christoph Hellwig
2022-06-20 8:03 ` Qu Wenruo
2022-06-20 8:09 ` Christoph Hellwig
2022-06-20 7:37 ` Christoph Hellwig
2022-06-20 7:45 ` Qu Wenruo
2022-06-20 7:49 ` Christoph Hellwig
2022-06-17 10:04 ` [PATCH 07/10] btrfs: simplify the reloc root check in btrfs_submit_data_write_bio Christoph Hellwig
2022-06-17 10:04 ` [PATCH 08/10] btrfs: handle allocation failure in btrfs_wq_submit_bio gracefully Christoph Hellwig
2022-06-28 15:20 ` Boris Burkov
2022-06-17 10:04 ` [PATCH 09/10] btrfs: remove the btrfs_submit_dio_bio return value Christoph Hellwig
2022-06-17 10:04 ` [PATCH 10/10] btrfs: remove bioc->stripes_pending Christoph Hellwig
2022-06-20 8:18 ` Nikolay Borisov
2022-06-20 8:34 ` Nikolay Borisov
2022-06-20 8:53 ` Christoph Hellwig
2022-06-20 9:34 ` Nikolay Borisov
2022-06-20 11:23 ` Christoph Hellwig [this message]
2022-06-22 16:07 ` David Sterba
2022-06-22 16:15 ` Christoph Hellwig
2022-07-07 18:34 ` David Sterba
2022-06-20 13:04 ` cleanup btrfs bio submission v2 Nikolay Borisov
2022-07-07 18:35 ` David Sterba
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=20220620112337.GA16136@lst.de \
--to=hch@lst.de \
--cc=dsterba@suse.com \
--cc=josef@toxicpanda.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=nborisov@suse.com \
--cc=wqu@suse.com \
/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