Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e58e327 authored by Ming Lei's avatar Ming Lei Committed by Shaohua Li
Browse files

md/raid1: use bio_clone_bioset_partial() in case of write behind



Write behind need to replace pages in bio's bvecs, and we have
to clone a fresh bio with new bvec table, so use the introduced
bio_clone_bioset_partial() for it.

For other bio_clone_mddev() cases, we will use fast clone since
they don't need to touch bvec table.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMing Lei <tom.leiming@gmail.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent 10273170
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -1345,13 +1345,12 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,

	first_clone = 1;
	for (i = 0; i < disks; i++) {
		struct bio *mbio;
		struct bio *mbio = NULL;
		sector_t offset;
		if (!r1_bio->bios[i])
			continue;

		mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
		bio_trim(mbio, r1_bio->sector - bio->bi_iter.bi_sector,
			 max_sectors);
		offset = r1_bio->sector - bio->bi_iter.bi_sector;

		if (first_clone) {
			/* do behind I/O ?
@@ -1361,8 +1360,13 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
			if (bitmap &&
			    (atomic_read(&bitmap->behind_writes)
			     < mddev->bitmap_info.max_write_behind) &&
			    !waitqueue_active(&bitmap->behind_wait))
			    !waitqueue_active(&bitmap->behind_wait)) {
				mbio = bio_clone_bioset_partial(bio, GFP_NOIO,
								mddev->bio_set,
								offset,
								max_sectors);
				alloc_behind_pages(mbio, r1_bio);
			}

			bitmap_startwrite(bitmap, r1_bio->sector,
					  r1_bio->sectors,
@@ -1370,6 +1374,12 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
						   &r1_bio->state));
			first_clone = 0;
		}

		if (!mbio) {
			mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
			bio_trim(mbio, offset, max_sectors);
		}

		if (r1_bio->behind_bvecs) {
			struct bio_vec *bvec;
			int j;