On 08/28/2020 03:03 PM, Song Liu wrote:
On Mon, Aug 24, 2020 at 10:43 PM Xiao Ni <xni@xxxxxxxxxx> wrote:
For far layout, the discard region is not continuous on disks. So it needs
far copies r10bio to cover all regions. It needs a way to know all r10bios
have finish or not. Similar with raid10_sync_request, only the first r10bio
master_bio records the discard bio. Other r10bios master_bio record the
first r10bio. The first r10bio can finish after other r10bios finish and
then return the discard bio.
Signed-off-by: Xiao Ni <xni@xxxxxxxxxx>
---
drivers/md/raid10.c | 87 +++++++++++++++++++++++++++++++++++++++--------------
drivers/md/raid10.h | 1 +
2 files changed, 65 insertions(+), 23 deletions(-)
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 257791e..f6518ea 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1534,6 +1534,29 @@ static struct bio *raid10_split_bio(struct r10conf *conf,
return bio;
}
+static void raid_end_discard_bio(struct r10bio *r10bio)
Let's name this raid10_*
Ok
+{
+ struct r10conf *conf = r10bio->mddev->private;
+ struct r10bio *first_r10bio;
+
+ while (atomic_dec_and_test(&r10bio->remaining)) {
Should this be "if (atomic_*"?
The usage of while is right here. For far layout, it needs far copies
r10bio. It needs to find a method
to know all r10bios finish. The first r10bio->remaining is used to
achieve the target. It adds the first
r10bio->remaining when preparing other r10bios. I was inspired by
end_sync_request. So it should
use while here. It needs to decrease the first r10bio remaining for
other r10bios in the second loop.
Are there more things you want me to modify or add? If not, I'll send
the v6 to rename the function
name. Thanks for reviewing these patches :)
Regards
Xiao