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: Zhao Lei <zhaolei@cn.fujitsu.com> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
@@ -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 @@ done_nolock:
|
||||
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 @@ cleanup:
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user