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

Commit 6e9606d2 authored by Zhao Lei's avatar Zhao Lei Committed by Chris Mason
Browse files

Btrfs: add ref_count and free function for btrfs_bio



1: ref_count is simple than current RBIO_HOLD_BBIO_MAP_BIT flag
   to keep btrfs_bio's memory in raid56 recovery implement.
2: free function for bbio will make code clean and flexible, plus
   forced data type checking in compile.

Changelog v1->v2:
 Rename following by David Sterba's suggestion:
 put_btrfs_bio() -> btrfs_put_bio()
 get_btrfs_bio() -> btrfs_get_bio()
 bbio->ref_count -> bbio->refs

Signed-off-by: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent 8e5cfb55
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1926,7 +1926,7 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr,
			 */
			ret = 0;
		}
		kfree(bbio);
		btrfs_put_bbio(bbio);
	}

	if (actual_bytes)
+1 −1
Original line number Diff line number Diff line
@@ -2058,7 +2058,7 @@ int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical,
	sector = bbio->stripes[mirror_num-1].physical >> 9;
	bio->bi_iter.bi_sector = sector;
	dev = bbio->stripes[mirror_num-1].dev;
	kfree(bbio);
	btrfs_put_bbio(bbio);
	if (!dev || !dev->bdev || !dev->writeable) {
		bio_put(bio);
		return -EIO;
+8 −30
Original line number Diff line number Diff line
@@ -58,15 +58,6 @@
 */
#define RBIO_CACHE_READY_BIT	3

/*
 * bbio and raid_map is managed by the caller, so we shouldn't free
 * them here. And besides that, all rbios with this flag should not
 * be cached, because we need raid_map to check the rbios' stripe
 * is the same or not, but it is very likely that the caller has
 * free raid_map, so don't cache those rbios.
 */
#define RBIO_HOLD_BBIO_MAP_BIT	4

#define RBIO_CACHE_SIZE 1024

enum btrfs_rbio_ops {
@@ -834,19 +825,6 @@ static noinline void unlock_stripe(struct btrfs_raid_bio *rbio)
		remove_rbio_from_cache(rbio);
}

static inline void
__free_bbio(struct btrfs_bio *bbio, int need)
{
	if (need)
		kfree(bbio);
}

static inline void free_bbio(struct btrfs_raid_bio *rbio)
{
	__free_bbio(rbio->bbio,
		    !test_bit(RBIO_HOLD_BBIO_MAP_BIT, &rbio->flags));
}

static void __free_raid_bio(struct btrfs_raid_bio *rbio)
{
	int i;
@@ -866,8 +844,7 @@ static void __free_raid_bio(struct btrfs_raid_bio *rbio)
		}
	}

	free_bbio(rbio);

	btrfs_put_bbio(rbio->bbio);
	kfree(rbio);
}

@@ -1774,7 +1751,7 @@ int raid56_parity_write(struct btrfs_root *root, struct bio *bio,

	rbio = alloc_rbio(root, bbio, stripe_len);
	if (IS_ERR(rbio)) {
		__free_bbio(bbio, 1);
		btrfs_put_bbio(bbio);
		return PTR_ERR(rbio);
	}
	bio_list_add(&rbio->bio_list, bio);
@@ -1990,8 +1967,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio)

cleanup_io:
	if (rbio->operation == BTRFS_RBIO_READ_REBUILD) {
		if (err == 0 &&
		    !test_bit(RBIO_HOLD_BBIO_MAP_BIT, &rbio->flags))
		if (err == 0)
			cache_rbio_pages(rbio);
		else
			clear_bit(RBIO_CACHE_READY_BIT, &rbio->flags);
@@ -2153,7 +2129,8 @@ int raid56_parity_recover(struct btrfs_root *root, struct bio *bio,

	rbio = alloc_rbio(root, bbio, stripe_len);
	if (IS_ERR(rbio)) {
		__free_bbio(bbio, generic_io);
		if (generic_io)
			btrfs_put_bbio(bbio);
		return PTR_ERR(rbio);
	}

@@ -2164,7 +2141,8 @@ int raid56_parity_recover(struct btrfs_root *root, struct bio *bio,
	rbio->faila = find_logical_bio_stripe(rbio, bio);
	if (rbio->faila == -1) {
		BUG();
		__free_bbio(bbio, generic_io);
		if (generic_io)
			btrfs_put_bbio(bbio);
		kfree(rbio);
		return -EIO;
	}
@@ -2173,7 +2151,7 @@ int raid56_parity_recover(struct btrfs_root *root, struct bio *bio,
		btrfs_bio_counter_inc_noblocked(root->fs_info);
		rbio->generic_bio_cnt = 1;
	} else {
		set_bit(RBIO_HOLD_BBIO_MAP_BIT, &rbio->flags);
		btrfs_get_bbio(bbio);
	}

	/*
+2 −2
Original line number Diff line number Diff line
@@ -461,7 +461,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
	spin_unlock(&fs_info->reada_lock);
	btrfs_dev_replace_unlock(&fs_info->dev_replace);

	kfree(bbio);
	btrfs_put_bbio(bbio);
	return re;

error:
@@ -486,7 +486,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
		kref_put(&zone->refcnt, reada_zone_release);
		spin_unlock(&fs_info->reada_lock);
	}
	kfree(bbio);
	btrfs_put_bbio(bbio);
	kfree(re);
	return re_exist;
}
+6 −6
Original line number Diff line number Diff line
@@ -855,7 +855,7 @@ static inline void scrub_get_recover(struct scrub_recover *recover)
static inline void scrub_put_recover(struct scrub_recover *recover)
{
	if (atomic_dec_and_test(&recover->refs)) {
		kfree(recover->bbio);
		btrfs_put_bbio(recover->bbio);
		kfree(recover);
	}
}
@@ -1373,13 +1373,13 @@ static int scrub_setup_recheck_block(struct scrub_ctx *sctx,
		ret = btrfs_map_sblock(fs_info, REQ_GET_READ_MIRRORS, logical,
				       &mapped_length, &bbio, 0, 1);
		if (ret || !bbio || mapped_length < sublen) {
			kfree(bbio);
			btrfs_put_bbio(bbio);
			return -EIO;
		}

		recover = kzalloc(sizeof(struct scrub_recover), GFP_NOFS);
		if (!recover) {
			kfree(bbio);
			btrfs_put_bbio(bbio);
			return -ENOMEM;
		}

@@ -2748,7 +2748,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity)
rbio_out:
	bio_put(bio);
bbio_out:
	kfree(bbio);
	btrfs_put_bbio(bbio);
	bitmap_or(sparity->ebitmap, sparity->ebitmap, sparity->dbitmap,
		  sparity->nsectors);
	spin_lock(&sctx->stat_lock);
@@ -3879,14 +3879,14 @@ static void scrub_remap_extent(struct btrfs_fs_info *fs_info,
			      &mapped_length, &bbio, 0);
	if (ret || !bbio || mapped_length < extent_len ||
	    !bbio->stripes[0].dev->bdev) {
		kfree(bbio);
		btrfs_put_bbio(bbio);
		return;
	}

	*extent_physical = bbio->stripes[0].physical;
	*extent_mirror_num = bbio->mirror_num;
	*extent_dev = bbio->stripes[0].dev;
	kfree(bbio);
	btrfs_put_bbio(bbio);
}

static int scrub_setup_wr_ctx(struct scrub_ctx *sctx,
Loading