Re: [PATCH 15/40] btrfs: don't allocate a btrfs_bio for scrub bios

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 2022/3/22 23:55, Christoph Hellwig wrote:
All the scrub bios go straight to the block device or the raid56 code,
none of which looks at the btrfs_bio.

Exactly!

Reviewed-by: Qu Wenruo <wqu@xxxxxxxx>

Thanks,
Qu

Signed-off-by: Christoph Hellwig <hch@xxxxxx>
---
  fs/btrfs/scrub.c | 47 ++++++++++++++++++-----------------------------
  1 file changed, 18 insertions(+), 29 deletions(-)

diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index bb9382c02714f..250d271b02341 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -1415,8 +1415,8 @@ static void scrub_recheck_block_on_raid56(struct btrfs_fs_info *fs_info,
  	if (!first_page->dev->bdev)
  		goto out;

-	bio = btrfs_bio_alloc(BIO_MAX_VECS);
-	bio_set_dev(bio, first_page->dev->bdev);
+	bio = bio_alloc(first_page->dev->bdev, BIO_MAX_VECS, REQ_OP_READ,
+			GFP_NOFS);

  	for (page_num = 0; page_num < sblock->page_count; page_num++) {
  		struct scrub_page *spage = sblock->pagev[page_num];
@@ -1649,8 +1649,6 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx,
  	}
  	sbio = sctx->wr_curr_bio;
  	if (sbio->page_count == 0) {
-		struct bio *bio;
-
  		ret = fill_writer_pointer_gap(sctx,
  					      spage->physical_for_dev_replace);
  		if (ret) {
@@ -1661,17 +1659,14 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx,
  		sbio->physical = spage->physical_for_dev_replace;
  		sbio->logical = spage->logical;
  		sbio->dev = sctx->wr_tgtdev;
-		bio = sbio->bio;
-		if (!bio) {
-			bio = btrfs_bio_alloc(sctx->pages_per_bio);
-			sbio->bio = bio;
+		if (!sbio->bio) {
+			sbio->bio = bio_alloc(sbio->dev->bdev,
+					      sctx->pages_per_bio,
+					      REQ_OP_WRITE, GFP_NOFS);
  		}
-
-		bio->bi_private = sbio;
-		bio->bi_end_io = scrub_wr_bio_end_io;
-		bio_set_dev(bio, sbio->dev->bdev);
-		bio->bi_iter.bi_sector = sbio->physical >> 9;
-		bio->bi_opf = REQ_OP_WRITE;
+		sbio->bio->bi_private = sbio;
+		sbio->bio->bi_end_io = scrub_wr_bio_end_io;
+		sbio->bio->bi_iter.bi_sector = sbio->physical >> 9;
  		sbio->status = 0;
  	} else if (sbio->physical + sbio->page_count * sectorsize !=
  		   spage->physical_for_dev_replace ||
@@ -1712,7 +1707,6 @@ static void scrub_wr_submit(struct scrub_ctx *sctx)

  	sbio = sctx->wr_curr_bio;
  	sctx->wr_curr_bio = NULL;
-	WARN_ON(!sbio->bio->bi_bdev);
  	scrub_pending_bio_inc(sctx);
  	/* process all writes in a single worker thread. Then the block layer
  	 * orders the requests before sending them to the driver which
@@ -2084,22 +2078,17 @@ static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx,
  	}
  	sbio = sctx->bios[sctx->curr];
  	if (sbio->page_count == 0) {
-		struct bio *bio;
-
  		sbio->physical = spage->physical;
  		sbio->logical = spage->logical;
  		sbio->dev = spage->dev;
-		bio = sbio->bio;
-		if (!bio) {
-			bio = btrfs_bio_alloc(sctx->pages_per_bio);
-			sbio->bio = bio;
+		if (!sbio->bio) {
+			sbio->bio = bio_alloc(sbio->dev->bdev,
+					      sctx->pages_per_bio,
+					      REQ_OP_READ, GFP_NOFS);
  		}
-
-		bio->bi_private = sbio;
-		bio->bi_end_io = scrub_bio_end_io;
-		bio_set_dev(bio, sbio->dev->bdev);
-		bio->bi_iter.bi_sector = sbio->physical >> 9;
-		bio->bi_opf = REQ_OP_READ;
+		sbio->bio->bi_private = sbio;
+		sbio->bio->bi_end_io = scrub_bio_end_io;
+		sbio->bio->bi_iter.bi_sector = sbio->physical >> 9;
  		sbio->status = 0;
  	} else if (sbio->physical + sbio->page_count * sectorsize !=
  		   spage->physical ||
@@ -2215,7 +2204,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock)
  		goto bioc_out;
  	}

-	bio = btrfs_bio_alloc(BIO_MAX_VECS);
+	bio = bio_alloc(NULL, BIO_MAX_VECS, REQ_OP_READ, GFP_NOFS);
  	bio->bi_iter.bi_sector = logical >> 9;
  	bio->bi_private = sblock;
  	bio->bi_end_io = scrub_missing_raid56_end_io;
@@ -2831,7 +2820,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity)
  	if (ret || !bioc || !bioc->raid_map)
  		goto bioc_out;

-	bio = btrfs_bio_alloc(BIO_MAX_VECS);
+	bio = bio_alloc(NULL, BIO_MAX_VECS, REQ_OP_READ, GFP_NOFS);
  	bio->bi_iter.bi_sector = sparity->logic_start >> 9;
  	bio->bi_private = sparity;
  	bio->bi_end_io = scrub_parity_bio_endio;




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux