* [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename @ 2021-09-14 1:25 Qu Wenruo 2021-09-14 1:25 ` [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context Qu Wenruo ` (3 more replies) 0 siblings, 4 replies; 10+ messages in thread From: Qu Wenruo @ 2021-09-14 1:25 UTC (permalink / raw) To: linux-btrfs The branch can be fetched from github, and is the preferred way to grab the code, as this patchset changed quite a lot of code. https://github.com/adam900710/linux/tree/chunk_refactor There are two structure, btrfs_io_bio and btrfs_bio, which have very similar names but completely different meanings. Btrfs_io_bio mostly works at logical bytenr layer (its bio->bi_iter.bi_sector points to btrfs logical bytenr), and just contains extra info like csum and mirror_num. And btrfs_io_bio is in fact the most utilized bio, as all data/metadata IO is using btrfs_io_bio. While btrfs_bio is completely a helper structure for stripe IO submission (RAID56 doesn't utilize it for IO submission). Such naming is completely anti-human. So this patchset will do the following renaming: - btrfs_bio -> btrfs_io_context Since it's not really used by all bios (only mirrored profiles utilize it), and it contains extra info for RAID56, it's not proper to name it with _bio suffix. Later we can integrate btrfs_io_context pointer into the new btrfs_bio. - btrfs_io_bio -> btrfs_bio I originally plan to rename it to btrfs_logical_bio, but it's a little too long for a lot of functions. Changelog: v2: - Rename btrfs_bio to btrfs_io_context (bioc) - Rename btrfs_io_bio to btrfs_bio Both suggested by Nikolay Qu Wenruo (3): btrfs: rename btrfs_bio to btrfs_io_context btrfs: remove btrfs_bio_alloc() helper btrfs: rename struct btrfs_io_bio to btrfs_bio fs/btrfs/check-integrity.c | 4 +- fs/btrfs/compression.c | 20 +-- fs/btrfs/ctree.h | 3 +- fs/btrfs/disk-io.c | 2 +- fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent-tree.c | 18 +-- fs/btrfs/extent_io.c | 108 ++++++++------- fs/btrfs/extent_io.h | 3 +- fs/btrfs/extent_map.c | 4 +- fs/btrfs/file-item.c | 12 +- fs/btrfs/inode.c | 42 +++--- fs/btrfs/raid56.c | 130 +++++++++---------- fs/btrfs/raid56.h | 8 +- fs/btrfs/reada.c | 26 ++-- fs/btrfs/scrub.c | 130 +++++++++---------- fs/btrfs/volumes.c | 260 ++++++++++++++++++------------------- fs/btrfs/volumes.h | 48 +++---- fs/btrfs/zoned.c | 16 +-- 18 files changed, 416 insertions(+), 420 deletions(-) -- 2.33.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context 2021-09-14 1:25 [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename Qu Wenruo @ 2021-09-14 1:25 ` Qu Wenruo 2021-09-14 16:42 ` David Sterba 2021-09-14 1:25 ` [PATCH v2 2/3] btrfs: remove btrfs_bio_alloc() helper Qu Wenruo ` (2 subsequent siblings) 3 siblings, 1 reply; 10+ messages in thread From: Qu Wenruo @ 2021-09-14 1:25 UTC (permalink / raw) To: linux-btrfs The structure btrfs_bio is mostly used for stripe submission, and it its used by SINGLE/DUP/RAID1*/RAID10, while only parse stripe map layout for RAID56. Currently it's not always bind to a bio, and contains more info for IO context, thus renaming it will make the naming less confusing. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/check-integrity.c | 2 +- fs/btrfs/extent-tree.c | 18 +-- fs/btrfs/extent_io.c | 18 +-- fs/btrfs/extent_map.c | 4 +- fs/btrfs/raid56.c | 122 +++++++++--------- fs/btrfs/raid56.h | 8 +- fs/btrfs/reada.c | 26 ++-- fs/btrfs/scrub.c | 116 ++++++++--------- fs/btrfs/volumes.c | 256 ++++++++++++++++++------------------- fs/btrfs/volumes.h | 23 ++-- fs/btrfs/zoned.c | 16 +-- 11 files changed, 304 insertions(+), 305 deletions(-) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 86816088927f..81b11124b67a 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1455,7 +1455,7 @@ static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len, struct btrfs_fs_info *fs_info = state->fs_info; int ret; u64 length; - struct btrfs_bio *multi = NULL; + struct btrfs_io_context *multi = NULL; struct btrfs_device *device; length = len; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 7d03ffa04bce..c88e7727a31a 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1266,7 +1266,7 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, return ret; } -static int do_discard_extent(struct btrfs_bio_stripe *stripe, u64 *bytes) +static int do_discard_extent(struct btrfs_io_stripe *stripe, u64 *bytes) { struct btrfs_device *dev = stripe->dev; struct btrfs_fs_info *fs_info = dev->fs_info; @@ -1313,22 +1313,22 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, u64 discarded_bytes = 0; u64 end = bytenr + num_bytes; u64 cur = bytenr; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; /* - * Avoid races with device replace and make sure our bbio has devices + * Avoid races with device replace and make sure our bioc has devices * associated to its stripes that don't go away while we are discarding. */ btrfs_bio_counter_inc_blocked(fs_info); while (cur < end) { - struct btrfs_bio_stripe *stripe; + struct btrfs_io_stripe *stripe; int i; num_bytes = end - cur; /* Tell the block device(s) that the sectors can be discarded */ ret = btrfs_map_block(fs_info, BTRFS_MAP_DISCARD, cur, - &num_bytes, &bbio, 0); + &num_bytes, &bioc, 0); /* * Error can be -ENOMEM, -ENOENT (no such chunk mapping) or * -EOPNOTSUPP. For any such error, @num_bytes is not updated, @@ -1337,8 +1337,8 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, if (ret < 0) goto out; - stripe = bbio->stripes; - for (i = 0; i < bbio->num_stripes; i++, stripe++) { + stripe = bioc->stripes; + for (i = 0; i < bioc->num_stripes; i++, stripe++) { u64 bytes; struct btrfs_device *device = stripe->dev; @@ -1361,7 +1361,7 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, * And since there are two loops, explicitly * go to out to avoid confusion. */ - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); goto out; } @@ -1372,7 +1372,7 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, */ ret = 0; } - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); cur += num_bytes; } out: diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 8959ac580f46..1aed03ef5f49 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2290,7 +2290,7 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, struct btrfs_device *dev; u64 map_length = 0; u64 sector; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc = NULL; int ret; ASSERT(!(fs_info->sb->s_flags & SB_RDONLY)); @@ -2304,7 +2304,7 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, map_length = length; /* - * Avoid races with device replace and make sure our bbio has devices + * Avoid races with device replace and make sure our bioc has devices * associated to its stripes that don't go away while we are doing the * read repair operation. */ @@ -2317,28 +2317,28 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, * stripe's dev and sector. */ ret = btrfs_map_block(fs_info, BTRFS_MAP_READ, logical, - &map_length, &bbio, 0); + &map_length, &bioc, 0); if (ret) { btrfs_bio_counter_dec(fs_info); bio_put(bio); return -EIO; } - ASSERT(bbio->mirror_num == 1); + ASSERT(bioc->mirror_num == 1); } else { ret = btrfs_map_block(fs_info, BTRFS_MAP_WRITE, logical, - &map_length, &bbio, mirror_num); + &map_length, &bioc, mirror_num); if (ret) { btrfs_bio_counter_dec(fs_info); bio_put(bio); return -EIO; } - BUG_ON(mirror_num != bbio->mirror_num); + BUG_ON(mirror_num != bioc->mirror_num); } - sector = bbio->stripes[bbio->mirror_num - 1].physical >> 9; + sector = bioc->stripes[bioc->mirror_num - 1].physical >> 9; bio->bi_iter.bi_sector = sector; - dev = bbio->stripes[bbio->mirror_num - 1].dev; - btrfs_put_bbio(bbio); + dev = bioc->stripes[bioc->mirror_num - 1].dev; + btrfs_put_bioc(bioc); if (!dev || !dev->bdev || !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state)) { btrfs_bio_counter_dec(fs_info); diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 4a8e02f7b6c7..5a36add21305 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -360,7 +360,7 @@ static void extent_map_device_set_bits(struct extent_map *em, unsigned bits) int i; for (i = 0; i < map->num_stripes; i++) { - struct btrfs_bio_stripe *stripe = &map->stripes[i]; + struct btrfs_io_stripe *stripe = &map->stripes[i]; struct btrfs_device *device = stripe->dev; set_extent_bits_nowait(&device->alloc_state, stripe->physical, @@ -375,7 +375,7 @@ static void extent_map_device_clear_bits(struct extent_map *em, unsigned bits) int i; for (i = 0; i < map->num_stripes; i++) { - struct btrfs_bio_stripe *stripe = &map->stripes[i]; + struct btrfs_io_stripe *stripe = &map->stripes[i]; struct btrfs_device *device = stripe->dev; __clear_extent_bit(&device->alloc_state, stripe->physical, diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index d8d268ca8aa7..386de5a59900 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -61,7 +61,7 @@ enum btrfs_rbio_ops { struct btrfs_raid_bio { struct btrfs_fs_info *fs_info; - struct btrfs_bio *bbio; + struct btrfs_io_context *bioc; /* while we're doing rmw on a stripe * we put it into a hash table so we can @@ -271,7 +271,7 @@ static void cache_rbio_pages(struct btrfs_raid_bio *rbio) */ static int rbio_bucket(struct btrfs_raid_bio *rbio) { - u64 num = rbio->bbio->raid_map[0]; + u64 num = rbio->bioc->raid_map[0]; /* * we shift down quite a bit. We're using byte @@ -559,8 +559,8 @@ static int rbio_can_merge(struct btrfs_raid_bio *last, test_bit(RBIO_CACHE_BIT, &cur->flags)) return 0; - if (last->bbio->raid_map[0] != - cur->bbio->raid_map[0]) + if (last->bioc->raid_map[0] != + cur->bioc->raid_map[0]) return 0; /* we can't merge with different operations */ @@ -673,7 +673,7 @@ static noinline int lock_stripe_add(struct btrfs_raid_bio *rbio) spin_lock_irqsave(&h->lock, flags); list_for_each_entry(cur, &h->hash_list, hash_list) { - if (cur->bbio->raid_map[0] != rbio->bbio->raid_map[0]) + if (cur->bioc->raid_map[0] != rbio->bioc->raid_map[0]) continue; spin_lock(&cur->bio_list_lock); @@ -838,7 +838,7 @@ static void __free_raid_bio(struct btrfs_raid_bio *rbio) } } - btrfs_put_bbio(rbio->bbio); + btrfs_put_bioc(rbio->bioc); kfree(rbio); } @@ -906,7 +906,7 @@ static void raid_write_end_io(struct bio *bio) /* OK, we have read all the stripes we need to. */ max_errors = (rbio->operation == BTRFS_RBIO_PARITY_SCRUB) ? - 0 : rbio->bbio->max_errors; + 0 : rbio->bioc->max_errors; if (atomic_read(&rbio->error) > max_errors) err = BLK_STS_IOERR; @@ -961,12 +961,12 @@ static unsigned long rbio_nr_pages(unsigned long stripe_len, int nr_stripes) * this does not allocate any pages for rbio->pages. */ static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, - struct btrfs_bio *bbio, + struct btrfs_io_context *bioc, u64 stripe_len) { struct btrfs_raid_bio *rbio; int nr_data = 0; - int real_stripes = bbio->num_stripes - bbio->num_tgtdevs; + int real_stripes = bioc->num_stripes - bioc->num_tgtdevs; int num_pages = rbio_nr_pages(stripe_len, real_stripes); int stripe_npages = DIV_ROUND_UP(stripe_len, PAGE_SIZE); void *p; @@ -987,7 +987,7 @@ static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, spin_lock_init(&rbio->bio_list_lock); INIT_LIST_HEAD(&rbio->stripe_cache); INIT_LIST_HEAD(&rbio->hash_list); - rbio->bbio = bbio; + rbio->bioc = bioc; rbio->fs_info = fs_info; rbio->stripe_len = stripe_len; rbio->nr_pages = num_pages; @@ -1015,9 +1015,9 @@ static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, CONSUME_ALLOC(rbio->finish_pbitmap, BITS_TO_LONGS(stripe_npages)); #undef CONSUME_ALLOC - if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID5) + if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID5) nr_data = real_stripes - 1; - else if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID6) + else if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID6) nr_data = real_stripes - 2; else BUG(); @@ -1077,10 +1077,10 @@ static int rbio_add_io_page(struct btrfs_raid_bio *rbio, struct bio *last = bio_list->tail; int ret; struct bio *bio; - struct btrfs_bio_stripe *stripe; + struct btrfs_io_stripe *stripe; u64 disk_start; - stripe = &rbio->bbio->stripes[stripe_nr]; + stripe = &rbio->bioc->stripes[stripe_nr]; disk_start = stripe->physical + (page_index << PAGE_SHIFT); /* if the device is missing, just fail this stripe */ @@ -1155,7 +1155,7 @@ static void index_rbio_pages(struct btrfs_raid_bio *rbio) int i = 0; start = bio->bi_iter.bi_sector << 9; - stripe_offset = start - rbio->bbio->raid_map[0]; + stripe_offset = start - rbio->bioc->raid_map[0]; page_index = stripe_offset >> PAGE_SHIFT; if (bio_flagged(bio, BIO_CLONED)) @@ -1179,7 +1179,7 @@ static void index_rbio_pages(struct btrfs_raid_bio *rbio) */ static noinline void finish_rmw(struct btrfs_raid_bio *rbio) { - struct btrfs_bio *bbio = rbio->bbio; + struct btrfs_io_context *bioc= rbio->bioc; void **pointers = rbio->finish_pointers; int nr_data = rbio->nr_data; int stripe; @@ -1284,11 +1284,11 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio) } } - if (likely(!bbio->num_tgtdevs)) + if (likely(!bioc->num_tgtdevs)) goto write_data; for (stripe = 0; stripe < rbio->real_stripes; stripe++) { - if (!bbio->tgtdev_map[stripe]) + if (!bioc->tgtdev_map[stripe]) continue; for (pagenr = 0; pagenr < rbio->stripe_npages; pagenr++) { @@ -1302,7 +1302,7 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio) } ret = rbio_add_io_page(rbio, &bio_list, page, - rbio->bbio->tgtdev_map[stripe], + rbio->bioc->tgtdev_map[stripe], pagenr, rbio->stripe_len); if (ret) goto cleanup; @@ -1339,12 +1339,12 @@ static int find_bio_stripe(struct btrfs_raid_bio *rbio, { u64 physical = bio->bi_iter.bi_sector; int i; - struct btrfs_bio_stripe *stripe; + struct btrfs_io_stripe *stripe; physical <<= 9; - for (i = 0; i < rbio->bbio->num_stripes; i++) { - stripe = &rbio->bbio->stripes[i]; + for (i = 0; i < rbio->bioc->num_stripes; i++) { + stripe = &rbio->bioc->stripes[i]; if (in_range(physical, stripe->physical, rbio->stripe_len) && stripe->dev->bdev && bio->bi_bdev == stripe->dev->bdev) { return i; @@ -1365,7 +1365,7 @@ static int find_logical_bio_stripe(struct btrfs_raid_bio *rbio, int i; for (i = 0; i < rbio->nr_data; i++) { - u64 stripe_start = rbio->bbio->raid_map[i]; + u64 stripe_start = rbio->bioc->raid_map[i]; if (in_range(logical, stripe_start, rbio->stripe_len)) return i; @@ -1456,7 +1456,7 @@ static void raid_rmw_end_io(struct bio *bio) if (!atomic_dec_and_test(&rbio->stripes_pending)) return; - if (atomic_read(&rbio->error) > rbio->bbio->max_errors) + if (atomic_read(&rbio->error) > rbio->bioc->max_errors) goto cleanup; /* @@ -1538,7 +1538,7 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) } /* - * the bbio may be freed once we submit the last bio. Make sure + * the bioc may be freed once we submit the last bio. Make sure * not to touch it after that */ atomic_set(&rbio->stripes_pending, bios_to_read); @@ -1720,16 +1720,16 @@ static void btrfs_raid_unplug(struct blk_plug_cb *cb, bool from_schedule) * our main entry point for writes from the rest of the FS. */ int raid56_parity_write(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 stripe_len) + struct btrfs_io_context *bioc, u64 stripe_len) { struct btrfs_raid_bio *rbio; struct btrfs_plug_cb *plug = NULL; struct blk_plug_cb *cb; int ret; - rbio = alloc_rbio(fs_info, bbio, stripe_len); + rbio = alloc_rbio(fs_info, bioc, stripe_len); if (IS_ERR(rbio)) { - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); return PTR_ERR(rbio); } bio_list_add(&rbio->bio_list, bio); @@ -1842,7 +1842,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio) } /* all raid6 handling here */ - if (rbio->bbio->map_type & BTRFS_BLOCK_GROUP_RAID6) { + if (rbio->bioc->map_type & BTRFS_BLOCK_GROUP_RAID6) { /* * single failure, rebuild from parity raid5 * style @@ -1874,8 +1874,8 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio) * here due to a crc mismatch and we can't give them the * data they want */ - if (rbio->bbio->raid_map[failb] == RAID6_Q_STRIPE) { - if (rbio->bbio->raid_map[faila] == + if (rbio->bioc->raid_map[failb] == RAID6_Q_STRIPE) { + if (rbio->bioc->raid_map[faila] == RAID5_P_STRIPE) { err = BLK_STS_IOERR; goto cleanup; @@ -1887,7 +1887,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio) goto pstripe; } - if (rbio->bbio->raid_map[failb] == RAID5_P_STRIPE) { + if (rbio->bioc->raid_map[failb] == RAID5_P_STRIPE) { raid6_datap_recov(rbio->real_stripes, PAGE_SIZE, faila, pointers); } else { @@ -2006,7 +2006,7 @@ static void raid_recover_end_io(struct bio *bio) if (!atomic_dec_and_test(&rbio->stripes_pending)) return; - if (atomic_read(&rbio->error) > rbio->bbio->max_errors) + if (atomic_read(&rbio->error) > rbio->bioc->max_errors) rbio_orig_end_io(rbio, BLK_STS_IOERR); else __raid_recover_end_io(rbio); @@ -2074,7 +2074,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) * were up to date, or we might have no bios to read because * the devices were gone. */ - if (atomic_read(&rbio->error) <= rbio->bbio->max_errors) { + if (atomic_read(&rbio->error) <= rbio->bioc->max_errors) { __raid_recover_end_io(rbio); return 0; } else { @@ -2083,7 +2083,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) } /* - * the bbio may be freed once we submit the last bio. Make sure + * the bioc may be freed once we submit the last bio. Make sure * not to touch it after that */ atomic_set(&rbio->stripes_pending, bios_to_read); @@ -2117,21 +2117,21 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) * of the drive. */ int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 stripe_len, + struct btrfs_io_context *bioc, u64 stripe_len, int mirror_num, int generic_io) { struct btrfs_raid_bio *rbio; int ret; if (generic_io) { - ASSERT(bbio->mirror_num == mirror_num); + ASSERT(bioc->mirror_num == mirror_num); btrfs_io_bio(bio)->mirror_num = mirror_num; } - rbio = alloc_rbio(fs_info, bbio, stripe_len); + rbio = alloc_rbio(fs_info, bioc, stripe_len); if (IS_ERR(rbio)) { if (generic_io) - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); return PTR_ERR(rbio); } @@ -2142,11 +2142,11 @@ int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, rbio->faila = find_logical_bio_stripe(rbio, bio); if (rbio->faila == -1) { btrfs_warn(fs_info, - "%s could not find the bad stripe in raid56 so that we cannot recover any more (bio has logical %llu len %llu, bbio has map_type %llu)", + "%s could not find the bad stripe in raid56 so that we cannot recover any more (bio has logical %llu len %llu, bioc has map_type %llu)", __func__, bio->bi_iter.bi_sector << 9, - (u64)bio->bi_iter.bi_size, bbio->map_type); + (u64)bio->bi_iter.bi_size, bioc->map_type); if (generic_io) - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); kfree(rbio); return -EIO; } @@ -2155,7 +2155,7 @@ int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, btrfs_bio_counter_inc_noblocked(fs_info); rbio->generic_bio_cnt = 1; } else { - btrfs_get_bbio(bbio); + btrfs_get_bioc(bioc); } /* @@ -2214,7 +2214,7 @@ static void read_rebuild_work(struct btrfs_work *work) /* * The following code is used to scrub/replace the parity stripe * - * Caller must have already increased bio_counter for getting @bbio. + * Caller must have already increased bio_counter for getting @bioc. * * Note: We need make sure all the pages that add into the scrub/replace * raid bio are correct and not be changed during the scrub/replace. That @@ -2223,14 +2223,14 @@ static void read_rebuild_work(struct btrfs_work *work) struct btrfs_raid_bio * raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 stripe_len, + struct btrfs_io_context *bioc, u64 stripe_len, struct btrfs_device *scrub_dev, unsigned long *dbitmap, int stripe_nsectors) { struct btrfs_raid_bio *rbio; int i; - rbio = alloc_rbio(fs_info, bbio, stripe_len); + rbio = alloc_rbio(fs_info, bioc, stripe_len); if (IS_ERR(rbio)) return NULL; bio_list_add(&rbio->bio_list, bio); @@ -2242,12 +2242,12 @@ raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, rbio->operation = BTRFS_RBIO_PARITY_SCRUB; /* - * After mapping bbio with BTRFS_MAP_WRITE, parities have been sorted + * After mapping bioc with BTRFS_MAP_WRITE, parities have been sorted * to the end position, so this search can start from the first parity * stripe. */ for (i = rbio->nr_data; i < rbio->real_stripes; i++) { - if (bbio->stripes[i].dev == scrub_dev) { + if (bioc->stripes[i].dev == scrub_dev) { rbio->scrubp = i; break; } @@ -2260,7 +2260,7 @@ raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, bitmap_copy(rbio->dbitmap, dbitmap, stripe_nsectors); /* - * We have already increased bio_counter when getting bbio, record it + * We have already increased bio_counter when getting bioc, record it * so we can free it at rbio_orig_end_io(). */ rbio->generic_bio_cnt = 1; @@ -2275,10 +2275,10 @@ void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, int stripe_offset; int index; - ASSERT(logical >= rbio->bbio->raid_map[0]); - ASSERT(logical + PAGE_SIZE <= rbio->bbio->raid_map[0] + + ASSERT(logical >= rbio->bioc->raid_map[0]); + ASSERT(logical + PAGE_SIZE <= rbio->bioc->raid_map[0] + rbio->stripe_len * rbio->nr_data); - stripe_offset = (int)(logical - rbio->bbio->raid_map[0]); + stripe_offset = (int)(logical - rbio->bioc->raid_map[0]); index = stripe_offset >> PAGE_SHIFT; rbio->bio_pages[index] = page; } @@ -2312,7 +2312,7 @@ static int alloc_rbio_essential_pages(struct btrfs_raid_bio *rbio) static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio, int need_check) { - struct btrfs_bio *bbio = rbio->bbio; + struct btrfs_io_context *bioc= rbio->bioc; void **pointers = rbio->finish_pointers; unsigned long *pbitmap = rbio->finish_pbitmap; int nr_data = rbio->nr_data; @@ -2335,7 +2335,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio, else BUG(); - if (bbio->num_tgtdevs && bbio->tgtdev_map[rbio->scrubp]) { + if (bioc->num_tgtdevs && bioc->tgtdev_map[rbio->scrubp]) { is_replace = 1; bitmap_copy(pbitmap, rbio->dbitmap, rbio->stripe_npages); } @@ -2435,7 +2435,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio, page = rbio_stripe_page(rbio, rbio->scrubp, pagenr); ret = rbio_add_io_page(rbio, &bio_list, page, - bbio->tgtdev_map[rbio->scrubp], + bioc->tgtdev_map[rbio->scrubp], pagenr, rbio->stripe_len); if (ret) goto cleanup; @@ -2483,7 +2483,7 @@ static inline int is_data_stripe(struct btrfs_raid_bio *rbio, int stripe) */ static void validate_rbio_for_parity_scrub(struct btrfs_raid_bio *rbio) { - if (atomic_read(&rbio->error) > rbio->bbio->max_errors) + if (atomic_read(&rbio->error) > rbio->bioc->max_errors) goto cleanup; if (rbio->faila >= 0 || rbio->failb >= 0) { @@ -2504,7 +2504,7 @@ static void validate_rbio_for_parity_scrub(struct btrfs_raid_bio *rbio) * the data, so the capability of the repair is declined. * (In the case of RAID5, we can not repair anything) */ - if (dfail > rbio->bbio->max_errors - 1) + if (dfail > rbio->bioc->max_errors - 1) goto cleanup; /* @@ -2625,7 +2625,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) } /* - * the bbio may be freed once we submit the last bio. Make sure + * the bioc may be freed once we submit the last bio. Make sure * not to touch it after that */ atomic_set(&rbio->stripes_pending, bios_to_read); @@ -2671,11 +2671,11 @@ void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio) struct btrfs_raid_bio * raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 length) + struct btrfs_io_context *bioc, u64 length) { struct btrfs_raid_bio *rbio; - rbio = alloc_rbio(fs_info, bbio, length); + rbio = alloc_rbio(fs_info, bioc, length); if (IS_ERR(rbio)) return NULL; @@ -2695,7 +2695,7 @@ raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, } /* - * When we get bbio, we have already increased bio_counter, record it + * When we get bioc, we have already increased bio_counter, record it * so we can free it at rbio_orig_end_io() */ rbio->generic_bio_cnt = 1; diff --git a/fs/btrfs/raid56.h b/fs/btrfs/raid56.h index 2503485db859..838d3a5e07ef 100644 --- a/fs/btrfs/raid56.h +++ b/fs/btrfs/raid56.h @@ -31,24 +31,24 @@ struct btrfs_raid_bio; struct btrfs_device; int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 stripe_len, + struct btrfs_io_context *bioc, u64 stripe_len, int mirror_num, int generic_io); int raid56_parity_write(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 stripe_len); + struct btrfs_io_context *bioc, u64 stripe_len); void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, u64 logical); struct btrfs_raid_bio * raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 stripe_len, + struct btrfs_io_context *bioc, u64 stripe_len, struct btrfs_device *scrub_dev, unsigned long *dbitmap, int stripe_nsectors); void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio); struct btrfs_raid_bio * raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, - struct btrfs_bio *bbio, u64 length); + struct btrfs_io_context *bioc, u64 length); void raid56_submit_missing_rbio(struct btrfs_raid_bio *rbio); int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info); diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c index 06713a8fe26b..eb96c45f205c 100644 --- a/fs/btrfs/reada.c +++ b/fs/btrfs/reada.c @@ -227,7 +227,7 @@ int btree_readahead_hook(struct extent_buffer *eb, int err) } static struct reada_zone *reada_find_zone(struct btrfs_device *dev, u64 logical, - struct btrfs_bio *bbio) + struct btrfs_io_context *bioc) { struct btrfs_fs_info *fs_info = dev->fs_info; int ret; @@ -275,11 +275,11 @@ static struct reada_zone *reada_find_zone(struct btrfs_device *dev, u64 logical, kref_init(&zone->refcnt); zone->elems = 0; zone->device = dev; /* our device always sits at index 0 */ - for (i = 0; i < bbio->num_stripes; ++i) { + for (i = 0; i < bioc->num_stripes; ++i) { /* bounds have already been checked */ - zone->devs[i] = bbio->stripes[i].dev; + zone->devs[i] = bioc->stripes[i].dev; } - zone->ndevs = bbio->num_stripes; + zone->ndevs = bioc->num_stripes; spin_lock(&fs_info->reada_lock); ret = radix_tree_insert(&dev->reada_zones, @@ -309,7 +309,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, int ret; struct reada_extent *re = NULL; struct reada_extent *re_exist = NULL; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc = NULL; struct btrfs_device *dev; struct btrfs_device *prev_dev; u64 length; @@ -345,28 +345,28 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, */ length = fs_info->nodesize; ret = btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical, - &length, &bbio, 0); - if (ret || !bbio || length < fs_info->nodesize) + &length, &bioc, 0); + if (ret || !bioc || length < fs_info->nodesize) goto error; - if (bbio->num_stripes > BTRFS_MAX_MIRRORS) { + if (bioc->num_stripes > BTRFS_MAX_MIRRORS) { btrfs_err(fs_info, "readahead: more than %d copies not supported", BTRFS_MAX_MIRRORS); goto error; } - real_stripes = bbio->num_stripes - bbio->num_tgtdevs; + real_stripes = bioc->num_stripes - bioc->num_tgtdevs; for (nzones = 0; nzones < real_stripes; ++nzones) { struct reada_zone *zone; - dev = bbio->stripes[nzones].dev; + dev = bioc->stripes[nzones].dev; /* cannot read ahead on missing device. */ if (!dev->bdev) continue; - zone = reada_find_zone(dev, logical, bbio); + zone = reada_find_zone(dev, logical, bioc); if (!zone) continue; @@ -464,7 +464,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, if (!have_zone) goto error; - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); return re; error: @@ -488,7 +488,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, kref_put(&zone->refcnt, reada_zone_release); spin_unlock(&fs_info->reada_lock); } - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); kfree(re); return re_exist; } diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 088641ba7a8e..d83ccec89aa7 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -57,7 +57,7 @@ struct scrub_ctx; struct scrub_recover { refcount_t refs; - struct btrfs_bio *bbio; + struct btrfs_io_context *bioc; u64 map_length; }; @@ -254,7 +254,7 @@ static void scrub_put_ctx(struct scrub_ctx *sctx); static inline int scrub_is_page_on_raid56(struct scrub_page *spage) { return spage->recover && - (spage->recover->bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK); + (spage->recover->bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK); } static void scrub_pending_bio_inc(struct scrub_ctx *sctx) @@ -798,7 +798,7 @@ static inline void scrub_put_recover(struct btrfs_fs_info *fs_info, { if (refcount_dec_and_test(&recover->refs)) { btrfs_bio_counter_dec(fs_info); - btrfs_put_bbio(recover->bbio); + btrfs_put_bioc(recover->bioc); kfree(recover); } } @@ -1027,8 +1027,8 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) sblock_other = sblocks_for_recheck + mirror_index; } else { struct scrub_recover *r = sblock_bad->pagev[0]->recover; - int max_allowed = r->bbio->num_stripes - - r->bbio->num_tgtdevs; + int max_allowed = r->bioc->num_stripes - + r->bioc->num_tgtdevs; if (mirror_index >= max_allowed) break; @@ -1218,14 +1218,14 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) return 0; } -static inline int scrub_nr_raid_mirrors(struct btrfs_bio *bbio) +static inline int scrub_nr_raid_mirrors(struct btrfs_io_context *bioc) { - if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID5) + if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID5) return 2; - else if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID6) + else if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID6) return 3; else - return (int)bbio->num_stripes; + return (int)bioc->num_stripes; } static inline void scrub_stripe_index_and_offset(u64 logical, u64 map_type, @@ -1269,7 +1269,7 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, u64 flags = original_sblock->pagev[0]->flags; u64 have_csum = original_sblock->pagev[0]->have_csum; struct scrub_recover *recover; - struct btrfs_bio *bbio; + struct btrfs_io_context *bioc; u64 sublen; u64 mapped_length; u64 stripe_offset; @@ -1288,7 +1288,7 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, while (length > 0) { sublen = min_t(u64, length, fs_info->sectorsize); mapped_length = sublen; - bbio = NULL; + bioc = NULL; /* * With a length of sectorsize, each returned stripe represents @@ -1296,27 +1296,27 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, */ btrfs_bio_counter_inc_blocked(fs_info); ret = btrfs_map_sblock(fs_info, BTRFS_MAP_GET_READ_MIRRORS, - logical, &mapped_length, &bbio); - if (ret || !bbio || mapped_length < sublen) { - btrfs_put_bbio(bbio); + logical, &mapped_length, &bioc); + if (ret || !bioc|| mapped_length < sublen) { + btrfs_put_bioc(bioc); btrfs_bio_counter_dec(fs_info); return -EIO; } recover = kzalloc(sizeof(struct scrub_recover), GFP_NOFS); if (!recover) { - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); btrfs_bio_counter_dec(fs_info); return -ENOMEM; } refcount_set(&recover->refs, 1); - recover->bbio = bbio; + recover->bioc = bioc; recover->map_length = mapped_length; BUG_ON(page_index >= SCRUB_MAX_PAGES_PER_BLOCK); - nmirrors = min(scrub_nr_raid_mirrors(bbio), BTRFS_MAX_MIRRORS); + nmirrors = min(scrub_nr_raid_mirrors(bioc), BTRFS_MAX_MIRRORS); for (mirror_index = 0; mirror_index < nmirrors; mirror_index++) { @@ -1348,17 +1348,17 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, sctx->fs_info->csum_size); scrub_stripe_index_and_offset(logical, - bbio->map_type, - bbio->raid_map, + bioc->map_type, + bioc->raid_map, mapped_length, - bbio->num_stripes - - bbio->num_tgtdevs, + bioc->num_stripes - + bioc->num_tgtdevs, mirror_index, &stripe_index, &stripe_offset); - spage->physical = bbio->stripes[stripe_index].physical + + spage->physical = bioc->stripes[stripe_index].physical + stripe_offset; - spage->dev = bbio->stripes[stripe_index].dev; + spage->dev = bioc->stripes[stripe_index].dev; BUG_ON(page_index >= original_sblock->page_count); spage->physical_for_dev_replace = @@ -1401,7 +1401,7 @@ static int scrub_submit_raid56_bio_wait(struct btrfs_fs_info *fs_info, bio->bi_end_io = scrub_bio_wait_endio; mirror_num = spage->sblock->pagev[0]->mirror_num; - ret = raid56_parity_recover(fs_info, bio, spage->recover->bbio, + ret = raid56_parity_recover(fs_info, bio, spage->recover->bioc, spage->recover->map_length, mirror_num, 0); if (ret) @@ -2203,7 +2203,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) struct btrfs_fs_info *fs_info = sctx->fs_info; u64 length = sblock->page_count * PAGE_SIZE; u64 logical = sblock->pagev[0]->logical; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; struct bio *bio; struct btrfs_raid_bio *rbio; int ret; @@ -2211,19 +2211,19 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) btrfs_bio_counter_inc_blocked(fs_info); ret = btrfs_map_sblock(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical, - &length, &bbio); - if (ret || !bbio || !bbio->raid_map) - goto bbio_out; + &length, &bioc); + if (ret || !bioc || !bioc->raid_map) + goto bioc_out; if (WARN_ON(!sctx->is_dev_replace || - !(bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK))) { + !(bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK))) { /* * We shouldn't be scrubbing a missing device. Even for dev * replace, we should only get here for RAID 5/6. We either * managed to mount something with no mirrors remaining or * there's a bug in scrub_remap_extent()/btrfs_map_block(). */ - goto bbio_out; + goto bioc_out; } bio = btrfs_io_bio_alloc(0); @@ -2231,7 +2231,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) bio->bi_private = sblock; bio->bi_end_io = scrub_missing_raid56_end_io; - rbio = raid56_alloc_missing_rbio(fs_info, bio, bbio, length); + rbio = raid56_alloc_missing_rbio(fs_info, bio, bioc, length); if (!rbio) goto rbio_out; @@ -2249,9 +2249,9 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) rbio_out: bio_put(bio); -bbio_out: +bioc_out: btrfs_bio_counter_dec(fs_info); - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); spin_lock(&sctx->stat_lock); sctx->stat.malloc_errors++; spin_unlock(&sctx->stat_lock); @@ -2826,7 +2826,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) struct btrfs_fs_info *fs_info = sctx->fs_info; struct bio *bio; struct btrfs_raid_bio *rbio; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; u64 length; int ret; @@ -2838,16 +2838,16 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) btrfs_bio_counter_inc_blocked(fs_info); ret = btrfs_map_sblock(fs_info, BTRFS_MAP_WRITE, sparity->logic_start, - &length, &bbio); - if (ret || !bbio || !bbio->raid_map) - goto bbio_out; + &length, &bioc); + if (ret || !bioc || !bioc->raid_map) + goto bioc_out; bio = btrfs_io_bio_alloc(0); bio->bi_iter.bi_sector = sparity->logic_start >> 9; bio->bi_private = sparity; bio->bi_end_io = scrub_parity_bio_endio; - rbio = raid56_parity_alloc_scrub_rbio(fs_info, bio, bbio, + rbio = raid56_parity_alloc_scrub_rbio(fs_info, bio, bioc, length, sparity->scrub_dev, sparity->dbitmap, sparity->nsectors); @@ -2860,9 +2860,9 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) rbio_out: bio_put(bio); -bbio_out: +bioc_out: btrfs_bio_counter_dec(fs_info); - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); bitmap_or(sparity->ebitmap, sparity->ebitmap, sparity->dbitmap, sparity->nsectors); spin_lock(&sctx->stat_lock); @@ -2901,7 +2901,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, struct btrfs_root *root = fs_info->extent_root; struct btrfs_root *csum_root = fs_info->csum_root; struct btrfs_extent_item *extent; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc = NULL; u64 flags; int ret; int slot; @@ -3044,22 +3044,22 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, extent_len); mapped_length = extent_len; - bbio = NULL; + bioc = NULL; ret = btrfs_map_block(fs_info, BTRFS_MAP_READ, - extent_logical, &mapped_length, &bbio, + extent_logical, &mapped_length, &bioc, 0); if (!ret) { - if (!bbio || mapped_length < extent_len) + if (!bioc || mapped_length < extent_len) ret = -EIO; } if (ret) { - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); goto out; } - extent_physical = bbio->stripes[0].physical; - extent_mirror_num = bbio->mirror_num; - extent_dev = bbio->stripes[0].dev; - btrfs_put_bbio(bbio); + extent_physical = bioc->stripes[0].physical; + extent_mirror_num = bioc->mirror_num; + extent_dev = bioc->stripes[0].dev; + btrfs_put_bioc(bioc); ret = btrfs_lookup_csums_range(csum_root, extent_logical, @@ -4309,20 +4309,20 @@ static void scrub_remap_extent(struct btrfs_fs_info *fs_info, int *extent_mirror_num) { u64 mapped_length; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; int ret; mapped_length = extent_len; ret = btrfs_map_block(fs_info, BTRFS_MAP_READ, extent_logical, - &mapped_length, &bbio, 0); - if (ret || !bbio || mapped_length < extent_len || - !bbio->stripes[0].dev->bdev) { - btrfs_put_bbio(bbio); + &mapped_length, &bioc, 0); + if (ret || !bioc || mapped_length < extent_len || + !bioc->stripes[0].dev->bdev) { + btrfs_put_bioc(bioc); return; } - *extent_physical = bbio->stripes[0].physical; - *extent_mirror_num = bbio->mirror_num; - *extent_dev = bbio->stripes[0].dev; - btrfs_put_bbio(bbio); + *extent_physical = bioc->stripes[0].physical; + *extent_mirror_num = bioc->mirror_num; + *extent_dev = bioc->stripes[0].dev; + btrfs_put_bioc(bioc); } diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index b81f25eed298..0cb1d5bad09d 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -250,7 +250,7 @@ static void btrfs_dev_stat_print_on_load(struct btrfs_device *device); static int __btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, u64 logical, u64 *length, - struct btrfs_bio **bbio_ret, + struct btrfs_io_context **bioc_ret, int mirror_num, int need_raid_map); /* @@ -5776,7 +5776,7 @@ static int find_live_mirror(struct btrfs_fs_info *fs_info, } /* Bubble-sort the stripe set to put the parity/syndrome stripes last */ -static void sort_parity_stripes(struct btrfs_bio *bbio, int num_stripes) +static void sort_parity_stripes(struct btrfs_io_context *bioc, int num_stripes) { int i; int again = 1; @@ -5785,22 +5785,23 @@ static void sort_parity_stripes(struct btrfs_bio *bbio, int num_stripes) again = 0; for (i = 0; i < num_stripes - 1; i++) { /* Swap if parity is on a smaller index */ - if (bbio->raid_map[i] > bbio->raid_map[i + 1]) { - swap(bbio->stripes[i], bbio->stripes[i + 1]); - swap(bbio->raid_map[i], bbio->raid_map[i + 1]); + if (bioc->raid_map[i] > bioc->raid_map[i + 1]) { + swap(bioc->stripes[i], bioc->stripes[i + 1]); + swap(bioc->raid_map[i], bioc->raid_map[i + 1]); again = 1; } } } } -static struct btrfs_bio *alloc_btrfs_bio(int total_stripes, int real_stripes) +static struct btrfs_io_context *alloc_btrfs_io_context(int total_stripes, + int real_stripes) { - struct btrfs_bio *bbio = kzalloc( - /* the size of the btrfs_bio */ - sizeof(struct btrfs_bio) + + struct btrfs_io_context *bioc = kzalloc( + /* the size of the btrfs_io_context */ + sizeof(struct btrfs_io_context) + /* plus the variable array for the stripes */ - sizeof(struct btrfs_bio_stripe) * (total_stripes) + + sizeof(struct btrfs_io_stripe) * (total_stripes) + /* plus the variable array for the tgt dev */ sizeof(int) * (real_stripes) + /* @@ -5810,27 +5811,27 @@ static struct btrfs_bio *alloc_btrfs_bio(int total_stripes, int real_stripes) sizeof(u64) * (total_stripes), GFP_NOFS|__GFP_NOFAIL); - atomic_set(&bbio->error, 0); - refcount_set(&bbio->refs, 1); + atomic_set(&bioc->error, 0); + refcount_set(&bioc->refs, 1); - bbio->tgtdev_map = (int *)(bbio->stripes + total_stripes); - bbio->raid_map = (u64 *)(bbio->tgtdev_map + real_stripes); + bioc->tgtdev_map = (int *)(bioc->stripes + total_stripes); + bioc->raid_map = (u64 *)(bioc->tgtdev_map + real_stripes); - return bbio; + return bioc; } -void btrfs_get_bbio(struct btrfs_bio *bbio) +void btrfs_get_bioc(struct btrfs_io_context *bioc) { - WARN_ON(!refcount_read(&bbio->refs)); - refcount_inc(&bbio->refs); + WARN_ON(!refcount_read(&bioc->refs)); + refcount_inc(&bioc->refs); } -void btrfs_put_bbio(struct btrfs_bio *bbio) +void btrfs_put_bioc(struct btrfs_io_context *bioc) { - if (!bbio) + if (!bioc) return; - if (refcount_dec_and_test(&bbio->refs)) - kfree(bbio); + if (refcount_dec_and_test(&bioc->refs)) + kfree(bioc); } /* can REQ_OP_DISCARD be sent with other REQ like REQ_OP_WRITE? */ @@ -5840,11 +5841,11 @@ void btrfs_put_bbio(struct btrfs_bio *bbio) */ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, u64 logical, u64 *length_ret, - struct btrfs_bio **bbio_ret) + struct btrfs_io_context **bioc_ret) { struct extent_map *em; struct map_lookup *map; - struct btrfs_bio *bbio; + struct btrfs_io_context *bioc; u64 length = *length_ret; u64 offset; u64 stripe_nr; @@ -5863,8 +5864,8 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, int ret = 0; int i; - /* discard always return a bbio */ - ASSERT(bbio_ret); + /* discard always return a bioc */ + ASSERT(bioc_ret); em = btrfs_get_chunk_map(fs_info, logical, length); if (IS_ERR(em)) @@ -5927,26 +5928,25 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, &stripe_index); } - bbio = alloc_btrfs_bio(num_stripes, 0); - if (!bbio) { + bioc = alloc_btrfs_io_context(num_stripes, 0); + if (!bioc) { ret = -ENOMEM; goto out; } for (i = 0; i < num_stripes; i++) { - bbio->stripes[i].physical = + bioc->stripes[i].physical = map->stripes[stripe_index].physical + stripe_offset + stripe_nr * map->stripe_len; - bbio->stripes[i].dev = map->stripes[stripe_index].dev; + bioc->stripes[i].dev = map->stripes[stripe_index].dev; if (map->type & (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID10)) { - bbio->stripes[i].length = stripes_per_dev * + bioc->stripes[i].length = stripes_per_dev * map->stripe_len; if (i / sub_stripes < remaining_stripes) - bbio->stripes[i].length += - map->stripe_len; + bioc->stripes[i].length += map->stripe_len; /* * Special for the first stripe and @@ -5957,19 +5957,17 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, * off end_off */ if (i < sub_stripes) - bbio->stripes[i].length -= - stripe_offset; + bioc->stripes[i].length -= stripe_offset; if (stripe_index >= last_stripe && stripe_index <= (last_stripe + sub_stripes - 1)) - bbio->stripes[i].length -= - stripe_end_offset; + bioc->stripes[i].length -= stripe_end_offset; if (i == sub_stripes - 1) stripe_offset = 0; } else { - bbio->stripes[i].length = length; + bioc->stripes[i].length = length; } stripe_index++; @@ -5979,9 +5977,9 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, } } - *bbio_ret = bbio; - bbio->map_type = map->type; - bbio->num_stripes = num_stripes; + *bioc_ret = bioc; + bioc->map_type = map->type; + bioc->num_stripes = num_stripes; out: free_extent_map(em); return ret; @@ -6005,7 +6003,7 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, u64 srcdev_devid, int *mirror_num, u64 *physical) { - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; int num_stripes; int index_srcdev = 0; int found = 0; @@ -6014,20 +6012,20 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, int ret = 0; ret = __btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS, - logical, &length, &bbio, 0, 0); + logical, &length, &bioc, 0, 0); if (ret) { - ASSERT(bbio == NULL); + ASSERT(bioc== NULL); return ret; } - num_stripes = bbio->num_stripes; + num_stripes = bioc->num_stripes; if (*mirror_num > num_stripes) { /* * BTRFS_MAP_GET_READ_MIRRORS does not contain this mirror, * that means that the requested area is not left of the left * cursor */ - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); return -EIO; } @@ -6037,7 +6035,7 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, * pointer to the one of the target drive. */ for (i = 0; i < num_stripes; i++) { - if (bbio->stripes[i].dev->devid != srcdev_devid) + if (bioc->stripes[i].dev->devid != srcdev_devid) continue; /* @@ -6045,15 +6043,15 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, * mirror with the lowest physical address */ if (found && - physical_of_found <= bbio->stripes[i].physical) + physical_of_found <= bioc->stripes[i].physical) continue; index_srcdev = i; found = 1; - physical_of_found = bbio->stripes[i].physical; + physical_of_found = bioc->stripes[i].physical; } - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); ASSERT(found); if (!found) @@ -6084,12 +6082,12 @@ static bool is_block_group_to_copy(struct btrfs_fs_info *fs_info, u64 logical) } static void handle_ops_on_dev_replace(enum btrfs_map_op op, - struct btrfs_bio **bbio_ret, + struct btrfs_io_context **bioc_ret, struct btrfs_dev_replace *dev_replace, u64 logical, int *num_stripes_ret, int *max_errors_ret) { - struct btrfs_bio *bbio = *bbio_ret; + struct btrfs_io_context *bioc = *bioc_ret; u64 srcdev_devid = dev_replace->srcdev->devid; int tgtdev_indexes = 0; int num_stripes = *num_stripes_ret; @@ -6119,17 +6117,17 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, */ index_where_to_add = num_stripes; for (i = 0; i < num_stripes; i++) { - if (bbio->stripes[i].dev->devid == srcdev_devid) { + if (bioc->stripes[i].dev->devid == srcdev_devid) { /* write to new disk, too */ - struct btrfs_bio_stripe *new = - bbio->stripes + index_where_to_add; - struct btrfs_bio_stripe *old = - bbio->stripes + i; + struct btrfs_io_stripe *new = + bioc->stripes + index_where_to_add; + struct btrfs_io_stripe *old = + bioc->stripes + i; new->physical = old->physical; new->length = old->length; new->dev = dev_replace->tgtdev; - bbio->tgtdev_map[i] = index_where_to_add; + bioc->tgtdev_map[i] = index_where_to_add; index_where_to_add++; max_errors++; tgtdev_indexes++; @@ -6149,7 +6147,7 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, * full copy of the source drive. */ for (i = 0; i < num_stripes; i++) { - if (bbio->stripes[i].dev->devid == srcdev_devid) { + if (bioc->stripes[i].dev->devid == srcdev_devid) { /* * In case of DUP, in order to keep it simple, * only add the mirror with the lowest physical @@ -6157,22 +6155,22 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, */ if (found && physical_of_found <= - bbio->stripes[i].physical) + bioc->stripes[i].physical) continue; index_srcdev = i; found = 1; - physical_of_found = bbio->stripes[i].physical; + physical_of_found = bioc->stripes[i].physical; } } if (found) { - struct btrfs_bio_stripe *tgtdev_stripe = - bbio->stripes + num_stripes; + struct btrfs_io_stripe *tgtdev_stripe = + bioc->stripes + num_stripes; tgtdev_stripe->physical = physical_of_found; tgtdev_stripe->length = - bbio->stripes[index_srcdev].length; + bioc->stripes[index_srcdev].length; tgtdev_stripe->dev = dev_replace->tgtdev; - bbio->tgtdev_map[index_srcdev] = num_stripes; + bioc->tgtdev_map[index_srcdev] = num_stripes; tgtdev_indexes++; num_stripes++; @@ -6181,8 +6179,8 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, *num_stripes_ret = num_stripes; *max_errors_ret = max_errors; - bbio->num_tgtdevs = tgtdev_indexes; - *bbio_ret = bbio; + bioc->num_tgtdevs = tgtdev_indexes; + *bioc_ret = bioc; } static bool need_full_stripe(enum btrfs_map_op op) @@ -6285,7 +6283,7 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *em, static int __btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, u64 logical, u64 *length, - struct btrfs_bio **bbio_ret, + struct btrfs_io_context **bioc_ret, int mirror_num, int need_raid_map) { struct extent_map *em; @@ -6300,7 +6298,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int num_stripes; int max_errors = 0; int tgtdev_indexes = 0; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; int dev_replace_is_ongoing = 0; int num_alloc_stripes; @@ -6309,7 +6307,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, u64 raid56_full_stripe_start = (u64)-1; struct btrfs_io_geometry geom; - ASSERT(bbio_ret); + ASSERT(bioc_ret); ASSERT(op != BTRFS_MAP_DISCARD); em = btrfs_get_chunk_map(fs_info, logical, *length); @@ -6453,16 +6451,16 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, tgtdev_indexes = num_stripes; } - bbio = alloc_btrfs_bio(num_alloc_stripes, tgtdev_indexes); - if (!bbio) { + bioc = alloc_btrfs_io_context(num_alloc_stripes, tgtdev_indexes); + if (!bioc) { ret = -ENOMEM; goto out; } for (i = 0; i < num_stripes; i++) { - bbio->stripes[i].physical = map->stripes[stripe_index].physical + + bioc->stripes[i].physical = map->stripes[stripe_index].physical + stripe_offset + stripe_nr * map->stripe_len; - bbio->stripes[i].dev = map->stripes[stripe_index].dev; + bioc->stripes[i].dev = map->stripes[stripe_index].dev; stripe_index++; } @@ -6478,15 +6476,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, /* Fill in the logical address of each stripe */ tmp = stripe_nr * data_stripes; for (i = 0; i < data_stripes; i++) - bbio->raid_map[(i+rot) % num_stripes] = + bioc->raid_map[(i+rot) % num_stripes] = em->start + (tmp + i) * map->stripe_len; - bbio->raid_map[(i+rot) % map->num_stripes] = RAID5_P_STRIPE; + bioc->raid_map[(i+rot) % map->num_stripes] = RAID5_P_STRIPE; if (map->type & BTRFS_BLOCK_GROUP_RAID6) - bbio->raid_map[(i+rot+1) % num_stripes] = + bioc->raid_map[(i+rot+1) % num_stripes] = RAID6_Q_STRIPE; - sort_parity_stripes(bbio, num_stripes); + sort_parity_stripes(bioc, num_stripes); } if (need_full_stripe(op)) @@ -6494,15 +6492,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, if (dev_replace_is_ongoing && dev_replace->tgtdev != NULL && need_full_stripe(op)) { - handle_ops_on_dev_replace(op, &bbio, dev_replace, logical, + handle_ops_on_dev_replace(op, &bioc, dev_replace, logical, &num_stripes, &max_errors); } - *bbio_ret = bbio; - bbio->map_type = map->type; - bbio->num_stripes = num_stripes; - bbio->max_errors = max_errors; - bbio->mirror_num = mirror_num; + *bioc_ret = bioc; + bioc->map_type = map->type; + bioc->num_stripes = num_stripes; + bioc->max_errors = max_errors; + bioc->mirror_num = mirror_num; /* * this is the case that REQ_READ && dev_replace_is_ongoing && @@ -6511,9 +6509,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, */ if (patch_the_first_stripe_for_dev_replace && num_stripes > 0) { WARN_ON(num_stripes > 1); - bbio->stripes[0].dev = dev_replace->tgtdev; - bbio->stripes[0].physical = physical_to_patch_in_first_stripe; - bbio->mirror_num = map->num_stripes + 1; + bioc->stripes[0].dev = dev_replace->tgtdev; + bioc->stripes[0].physical = physical_to_patch_in_first_stripe; + bioc->mirror_num = map->num_stripes + 1; } out: if (dev_replace_is_ongoing) { @@ -6527,40 +6525,40 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, u64 logical, u64 *length, - struct btrfs_bio **bbio_ret, int mirror_num) + struct btrfs_io_context **bioc_ret, int mirror_num) { if (op == BTRFS_MAP_DISCARD) return __btrfs_map_block_for_discard(fs_info, logical, - length, bbio_ret); + length, bioc_ret); - return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, + return __btrfs_map_block(fs_info, op, logical, length, bioc_ret, mirror_num, 0); } /* For Scrub/replace */ int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, u64 logical, u64 *length, - struct btrfs_bio **bbio_ret) + struct btrfs_io_context **bioc_ret) { - return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, 0, 1); + return __btrfs_map_block(fs_info, op, logical, length, bioc_ret, 0, 1); } -static inline void btrfs_end_bbio(struct btrfs_bio *bbio, struct bio *bio) +static inline void btrfs_end_bioc(struct btrfs_io_context *bioc, struct bio *bio) { - bio->bi_private = bbio->private; - bio->bi_end_io = bbio->end_io; + bio->bi_private = bioc->private; + bio->bi_end_io = bioc->end_io; bio_endio(bio); - btrfs_put_bbio(bbio); + btrfs_put_bioc(bioc); } static void btrfs_end_bio(struct bio *bio) { - struct btrfs_bio *bbio = bio->bi_private; + struct btrfs_io_context *bioc= bio->bi_private; int is_orig_bio = 0; if (bio->bi_status) { - atomic_inc(&bbio->error); + atomic_inc(&bioc->error); if (bio->bi_status == BLK_STS_IOERR || bio->bi_status == BLK_STS_TARGET) { struct btrfs_device *dev = btrfs_io_bio(bio)->device; @@ -6578,22 +6576,22 @@ static void btrfs_end_bio(struct bio *bio) } } - if (bio == bbio->orig_bio) + if (bio == bioc->orig_bio) is_orig_bio = 1; - btrfs_bio_counter_dec(bbio->fs_info); + btrfs_bio_counter_dec(bioc->fs_info); - if (atomic_dec_and_test(&bbio->stripes_pending)) { + if (atomic_dec_and_test(&bioc->stripes_pending)) { if (!is_orig_bio) { bio_put(bio); - bio = bbio->orig_bio; + bio = bioc->orig_bio; } - btrfs_io_bio(bio)->mirror_num = bbio->mirror_num; + btrfs_io_bio(bio)->mirror_num = bioc->mirror_num; /* only send an error to the higher layers if it is * beyond the tolerance of the btrfs bio */ - if (atomic_read(&bbio->error) > bbio->max_errors) { + if (atomic_read(&bioc->error) > bioc->max_errors) { bio->bi_status = BLK_STS_IOERR; } else { /* @@ -6603,18 +6601,18 @@ static void btrfs_end_bio(struct bio *bio) bio->bi_status = BLK_STS_OK; } - btrfs_end_bbio(bbio, bio); + btrfs_end_bioc(bioc, bio); } else if (!is_orig_bio) { bio_put(bio); } } -static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio, +static void submit_stripe_bio(struct btrfs_io_context *bioc, struct bio *bio, u64 physical, struct btrfs_device *dev) { - struct btrfs_fs_info *fs_info = bbio->fs_info; + struct btrfs_fs_info *fs_info = bioc->fs_info; - bio->bi_private = bbio; + bio->bi_private = bioc; btrfs_io_bio(bio)->device = dev; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; @@ -6644,20 +6642,20 @@ static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio, btrfsic_submit_bio(bio); } -static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) +static void bioc_error(struct btrfs_io_context *bioc, struct bio *bio, u64 logical) { - atomic_inc(&bbio->error); - if (atomic_dec_and_test(&bbio->stripes_pending)) { + atomic_inc(&bioc->error); + if (atomic_dec_and_test(&bioc->stripes_pending)) { /* Should be the original bio. */ - WARN_ON(bio != bbio->orig_bio); + WARN_ON(bio != bioc->orig_bio); - btrfs_io_bio(bio)->mirror_num = bbio->mirror_num; + btrfs_io_bio(bio)->mirror_num = bioc->mirror_num; bio->bi_iter.bi_sector = logical >> 9; - if (atomic_read(&bbio->error) > bbio->max_errors) + if (atomic_read(&bioc->error) > bioc->max_errors) bio->bi_status = BLK_STS_IOERR; else bio->bi_status = BLK_STS_OK; - btrfs_end_bbio(bbio, bio); + btrfs_end_bioc(bioc, bio); } } @@ -6672,35 +6670,35 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int ret; int dev_nr; int total_devs; - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; length = bio->bi_iter.bi_size; map_length = length; btrfs_bio_counter_inc_blocked(fs_info); ret = __btrfs_map_block(fs_info, btrfs_op(bio), logical, - &map_length, &bbio, mirror_num, 1); + &map_length, &bioc, mirror_num, 1); if (ret) { btrfs_bio_counter_dec(fs_info); return errno_to_blk_status(ret); } - total_devs = bbio->num_stripes; - bbio->orig_bio = first_bio; - bbio->private = first_bio->bi_private; - bbio->end_io = first_bio->bi_end_io; - bbio->fs_info = fs_info; - atomic_set(&bbio->stripes_pending, bbio->num_stripes); + total_devs = bioc->num_stripes; + bioc->orig_bio = first_bio; + bioc->private = first_bio->bi_private; + bioc->end_io = first_bio->bi_end_io; + bioc->fs_info = fs_info; + atomic_set(&bioc->stripes_pending, bioc->num_stripes); - if ((bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && + if ((bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && ((btrfs_op(bio) == BTRFS_MAP_WRITE) || (mirror_num > 1))) { /* In this case, map_length has been set to the length of a single stripe; not the whole write */ if (btrfs_op(bio) == BTRFS_MAP_WRITE) { - ret = raid56_parity_write(fs_info, bio, bbio, + ret = raid56_parity_write(fs_info, bio, bioc, map_length); } else { - ret = raid56_parity_recover(fs_info, bio, bbio, + ret = raid56_parity_recover(fs_info, bio, bioc, map_length, mirror_num, 1); } @@ -6716,12 +6714,12 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, } for (dev_nr = 0; dev_nr < total_devs; dev_nr++) { - dev = bbio->stripes[dev_nr].dev; + dev = bioc->stripes[dev_nr].dev; if (!dev || !dev->bdev || test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state) || (btrfs_op(first_bio) == BTRFS_MAP_WRITE && !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))) { - bbio_error(bbio, first_bio, logical); + bioc_error(bioc, first_bio, logical); continue; } @@ -6730,7 +6728,7 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, else bio = first_bio; - submit_stripe_bio(bbio, bio, bbio->stripes[dev_nr].physical, dev); + submit_stripe_bio(bioc, bio, bioc->stripes[dev_nr].physical, dev); } btrfs_bio_counter_dec(fs_info); return BLK_STS_OK; diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 7e8f205978d9..1e3bbdf7be94 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -306,11 +306,11 @@ struct btrfs_fs_devices { /* * we need the mirror number and stripe index to be passed around * the call chain while we are processing end_io (especially errors). - * Really, what we need is a btrfs_bio structure that has this info + * Really, what we need is a btrfs_io_context structure that has this info * and is properly sized with its stripe array, but we're not there * quite yet. We have our own btrfs bioset, and all of the bios * we allocate are actually btrfs_io_bios. We'll cram as much of - * struct btrfs_bio as we can into this over time. + * struct btrfs_io_context as we can into this over time. */ struct btrfs_io_bio { unsigned int mirror_num; @@ -339,13 +339,14 @@ static inline void btrfs_io_bio_free_csum(struct btrfs_io_bio *io_bio) } } -struct btrfs_bio_stripe { +struct btrfs_io_stripe { struct btrfs_device *dev; u64 physical; u64 length; /* only used for discard mappings */ }; -struct btrfs_bio { +/* Context for IO subsmission for device stripe. */ +struct btrfs_io_context { refcount_t refs; atomic_t stripes_pending; struct btrfs_fs_info *fs_info; @@ -365,7 +366,7 @@ struct btrfs_bio { * so raid_map[0] is the start of our full stripe */ u64 *raid_map; - struct btrfs_bio_stripe stripes[]; + struct btrfs_io_stripe stripes[]; }; struct btrfs_device_info { @@ -400,11 +401,11 @@ struct map_lookup { int num_stripes; int sub_stripes; int verified_stripes; /* For mount time dev extent verification */ - struct btrfs_bio_stripe stripes[]; + struct btrfs_io_stripe stripes[]; }; #define map_lookup_size(n) (sizeof(struct map_lookup) + \ - (sizeof(struct btrfs_bio_stripe) * (n))) + (sizeof(struct btrfs_io_stripe) * (n))) struct btrfs_balance_args; struct btrfs_balance_progress; @@ -441,14 +442,14 @@ static inline enum btrfs_map_op btrfs_op(struct bio *bio) } } -void btrfs_get_bbio(struct btrfs_bio *bbio); -void btrfs_put_bbio(struct btrfs_bio *bbio); +void btrfs_get_bioc(struct btrfs_io_context *bioc); +void btrfs_put_bioc(struct btrfs_io_context *bioc); int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, u64 logical, u64 *length, - struct btrfs_bio **bbio_ret, int mirror_num); + struct btrfs_io_context **bioc_ret, int mirror_num); int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, u64 logical, u64 *length, - struct btrfs_bio **bbio_ret); + struct btrfs_io_context **bioc_ret); int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *map, enum btrfs_map_op op, u64 logical, struct btrfs_io_geometry *io_geom); diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index 28a06c2d80ad..759668f0569c 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -1626,27 +1626,27 @@ int btrfs_zoned_issue_zeroout(struct btrfs_device *device, u64 physical, u64 len static int read_zone_info(struct btrfs_fs_info *fs_info, u64 logical, struct blk_zone *zone) { - struct btrfs_bio *bbio = NULL; + struct btrfs_io_context *bioc= NULL; u64 mapped_length = PAGE_SIZE; unsigned int nofs_flag; int nmirrors; int i, ret; ret = btrfs_map_sblock(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical, - &mapped_length, &bbio); - if (ret || !bbio || mapped_length < PAGE_SIZE) { - btrfs_put_bbio(bbio); + &mapped_length, &bioc); + if (ret || !bioc || mapped_length < PAGE_SIZE) { + btrfs_put_bioc(bioc); return -EIO; } - if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) + if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) return -EINVAL; nofs_flag = memalloc_nofs_save(); - nmirrors = (int)bbio->num_stripes; + nmirrors = (int)bioc->num_stripes; for (i = 0; i < nmirrors; i++) { - u64 physical = bbio->stripes[i].physical; - struct btrfs_device *dev = bbio->stripes[i].dev; + u64 physical = bioc->stripes[i].physical; + struct btrfs_device *dev = bioc->stripes[i].dev; /* Missing device */ if (!dev->bdev) -- 2.33.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context 2021-09-14 1:25 ` [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context Qu Wenruo @ 2021-09-14 16:42 ` David Sterba 2021-09-15 6:02 ` Qu Wenruo 0 siblings, 1 reply; 10+ messages in thread From: David Sterba @ 2021-09-14 16:42 UTC (permalink / raw) To: Qu Wenruo; +Cc: linux-btrfs On Tue, Sep 14, 2021 at 09:25:41AM +0800, Qu Wenruo wrote: > The structure btrfs_bio is mostly used for stripe submission, and it its > used by SINGLE/DUP/RAID1*/RAID10, while only parse stripe map layout for > RAID56. > > Currently it's not always bind to a bio, and contains more info for IO > context, thus renaming it will make the naming less confusing. > > Signed-off-by: Qu Wenruo <wqu@suse.com> > --- > fs/btrfs/check-integrity.c | 2 +- > fs/btrfs/extent-tree.c | 18 +-- > fs/btrfs/extent_io.c | 18 +-- > fs/btrfs/extent_map.c | 4 +- > fs/btrfs/raid56.c | 122 +++++++++--------- > fs/btrfs/raid56.h | 8 +- > fs/btrfs/reada.c | 26 ++-- > fs/btrfs/scrub.c | 116 ++++++++--------- > fs/btrfs/volumes.c | 256 ++++++++++++++++++------------------- > fs/btrfs/volumes.h | 23 ++-- > fs/btrfs/zoned.c | 16 +-- > 11 files changed, 304 insertions(+), 305 deletions(-) > > diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c > index 86816088927f..81b11124b67a 100644 > --- a/fs/btrfs/check-integrity.c > +++ b/fs/btrfs/check-integrity.c > @@ -1455,7 +1455,7 @@ static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len, > struct btrfs_fs_info *fs_info = state->fs_info; > int ret; > u64 length; > - struct btrfs_bio *multi = NULL; > + struct btrfs_io_context *multi = NULL; > struct btrfs_device *device; > > length = len; > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 7d03ffa04bce..c88e7727a31a 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -1266,7 +1266,7 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, > return ret; > } > > -static int do_discard_extent(struct btrfs_bio_stripe *stripe, u64 *bytes) > +static int do_discard_extent(struct btrfs_io_stripe *stripe, u64 *bytes) > { > struct btrfs_device *dev = stripe->dev; > struct btrfs_fs_info *fs_info = dev->fs_info; > @@ -1313,22 +1313,22 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, > u64 discarded_bytes = 0; > u64 end = bytenr + num_bytes; > u64 cur = bytenr; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = NULL > > two newlines, could be removed in one go as well > /* > - * Avoid races with device replace and make sure our bbio has devices > + * Avoid races with device replace and make sure our bioc has devices > * associated to its stripes that don't go away while we are discarding. > */ > btrfs_bio_counter_inc_blocked(fs_info); > while (cur < end) { > - struct btrfs_bio_stripe *stripe; > + struct btrfs_io_stripe *stripe; > int i; > > num_bytes = end - cur; > /* Tell the block device(s) that the sectors can be discarded */ > ret = btrfs_map_block(fs_info, BTRFS_MAP_DISCARD, cur, > - &num_bytes, &bbio, 0); > + &num_bytes, &bioc, 0); > /* > * Error can be -ENOMEM, -ENOENT (no such chunk mapping) or > * -EOPNOTSUPP. For any such error, @num_bytes is not updated, > @@ -1337,8 +1337,8 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, > if (ret < 0) > goto out; > > - stripe = bbio->stripes; > - for (i = 0; i < bbio->num_stripes; i++, stripe++) { > + stripe = bioc->stripes; > + for (i = 0; i < bioc->num_stripes; i++, stripe++) { > u64 bytes; > struct btrfs_device *device = stripe->dev; > > @@ -1361,7 +1361,7 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, > * And since there are two loops, explicitly > * go to out to avoid confusion. > */ > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > goto out; > } > > @@ -1372,7 +1372,7 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, > */ > ret = 0; > } > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > cur += num_bytes; > } > out: > diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c > index 8959ac580f46..1aed03ef5f49 100644 > --- a/fs/btrfs/extent_io.c > +++ b/fs/btrfs/extent_io.c > @@ -2290,7 +2290,7 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, > struct btrfs_device *dev; > u64 map_length = 0; > u64 sector; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc = NULL; > int ret; > > ASSERT(!(fs_info->sb->s_flags & SB_RDONLY)); > @@ -2304,7 +2304,7 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, > map_length = length; > > /* > - * Avoid races with device replace and make sure our bbio has devices > + * Avoid races with device replace and make sure our bioc has devices > * associated to its stripes that don't go away while we are doing the > * read repair operation. > */ > @@ -2317,28 +2317,28 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, > * stripe's dev and sector. > */ > ret = btrfs_map_block(fs_info, BTRFS_MAP_READ, logical, > - &map_length, &bbio, 0); > + &map_length, &bioc, 0); > if (ret) { > btrfs_bio_counter_dec(fs_info); > bio_put(bio); > return -EIO; > } > - ASSERT(bbio->mirror_num == 1); > + ASSERT(bioc->mirror_num == 1); > } else { > ret = btrfs_map_block(fs_info, BTRFS_MAP_WRITE, logical, > - &map_length, &bbio, mirror_num); > + &map_length, &bioc, mirror_num); > if (ret) { > btrfs_bio_counter_dec(fs_info); > bio_put(bio); > return -EIO; > } > - BUG_ON(mirror_num != bbio->mirror_num); > + BUG_ON(mirror_num != bioc->mirror_num); > } > > - sector = bbio->stripes[bbio->mirror_num - 1].physical >> 9; > + sector = bioc->stripes[bioc->mirror_num - 1].physical >> 9; > bio->bi_iter.bi_sector = sector; > - dev = bbio->stripes[bbio->mirror_num - 1].dev; > - btrfs_put_bbio(bbio); > + dev = bioc->stripes[bioc->mirror_num - 1].dev; > + btrfs_put_bioc(bioc); > if (!dev || !dev->bdev || > !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state)) { > btrfs_bio_counter_dec(fs_info); > diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c > index 4a8e02f7b6c7..5a36add21305 100644 > --- a/fs/btrfs/extent_map.c > +++ b/fs/btrfs/extent_map.c > @@ -360,7 +360,7 @@ static void extent_map_device_set_bits(struct extent_map *em, unsigned bits) > int i; > > for (i = 0; i < map->num_stripes; i++) { > - struct btrfs_bio_stripe *stripe = &map->stripes[i]; > + struct btrfs_io_stripe *stripe = &map->stripes[i]; > struct btrfs_device *device = stripe->dev; > > set_extent_bits_nowait(&device->alloc_state, stripe->physical, > @@ -375,7 +375,7 @@ static void extent_map_device_clear_bits(struct extent_map *em, unsigned bits) > int i; > > for (i = 0; i < map->num_stripes; i++) { > - struct btrfs_bio_stripe *stripe = &map->stripes[i]; > + struct btrfs_io_stripe *stripe = &map->stripes[i]; > struct btrfs_device *device = stripe->dev; > > __clear_extent_bit(&device->alloc_state, stripe->physical, > diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c > index d8d268ca8aa7..386de5a59900 100644 > --- a/fs/btrfs/raid56.c > +++ b/fs/btrfs/raid56.c > @@ -61,7 +61,7 @@ enum btrfs_rbio_ops { > > struct btrfs_raid_bio { > struct btrfs_fs_info *fs_info; > - struct btrfs_bio *bbio; > + struct btrfs_io_context *bioc; Regarding the naming, using 'bioc' as a new and unique scheme sounds ok, we had 'bbio' before. > > /* while we're doing rmw on a stripe > * we put it into a hash table so we can > @@ -271,7 +271,7 @@ static void cache_rbio_pages(struct btrfs_raid_bio *rbio) > */ > static int rbio_bucket(struct btrfs_raid_bio *rbio) > { > - u64 num = rbio->bbio->raid_map[0]; > + u64 num = rbio->bioc->raid_map[0]; > > /* > * we shift down quite a bit. We're using byte > @@ -559,8 +559,8 @@ static int rbio_can_merge(struct btrfs_raid_bio *last, > test_bit(RBIO_CACHE_BIT, &cur->flags)) > return 0; > > - if (last->bbio->raid_map[0] != > - cur->bbio->raid_map[0]) > + if (last->bioc->raid_map[0] != > + cur->bioc->raid_map[0]) You can reformat code that gets changed so this fits on one line. > return 0; > > /* we can't merge with different operations */ > @@ -673,7 +673,7 @@ static noinline int lock_stripe_add(struct btrfs_raid_bio *rbio) > > spin_lock_irqsave(&h->lock, flags); > list_for_each_entry(cur, &h->hash_list, hash_list) { > - if (cur->bbio->raid_map[0] != rbio->bbio->raid_map[0]) > + if (cur->bioc->raid_map[0] != rbio->bioc->raid_map[0]) > continue; > > spin_lock(&cur->bio_list_lock); > @@ -838,7 +838,7 @@ static void __free_raid_bio(struct btrfs_raid_bio *rbio) > } > } > > - btrfs_put_bbio(rbio->bbio); > + btrfs_put_bioc(rbio->bioc); > kfree(rbio); > } > > @@ -906,7 +906,7 @@ static void raid_write_end_io(struct bio *bio) > > /* OK, we have read all the stripes we need to. */ > max_errors = (rbio->operation == BTRFS_RBIO_PARITY_SCRUB) ? > - 0 : rbio->bbio->max_errors; > + 0 : rbio->bioc->max_errors; > if (atomic_read(&rbio->error) > max_errors) > err = BLK_STS_IOERR; > > @@ -961,12 +961,12 @@ static unsigned long rbio_nr_pages(unsigned long stripe_len, int nr_stripes) > * this does not allocate any pages for rbio->pages. > */ > static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, > - struct btrfs_bio *bbio, > + struct btrfs_io_context *bioc, > u64 stripe_len) > { > struct btrfs_raid_bio *rbio; > int nr_data = 0; > - int real_stripes = bbio->num_stripes - bbio->num_tgtdevs; > + int real_stripes = bioc->num_stripes - bioc->num_tgtdevs; > int num_pages = rbio_nr_pages(stripe_len, real_stripes); > int stripe_npages = DIV_ROUND_UP(stripe_len, PAGE_SIZE); > void *p; > @@ -987,7 +987,7 @@ static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, > spin_lock_init(&rbio->bio_list_lock); > INIT_LIST_HEAD(&rbio->stripe_cache); > INIT_LIST_HEAD(&rbio->hash_list); > - rbio->bbio = bbio; > + rbio->bioc = bioc; > rbio->fs_info = fs_info; > rbio->stripe_len = stripe_len; > rbio->nr_pages = num_pages; > @@ -1015,9 +1015,9 @@ static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, > CONSUME_ALLOC(rbio->finish_pbitmap, BITS_TO_LONGS(stripe_npages)); > #undef CONSUME_ALLOC > > - if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID5) > + if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID5) > nr_data = real_stripes - 1; > - else if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID6) > + else if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID6) > nr_data = real_stripes - 2; > else > BUG(); > @@ -1077,10 +1077,10 @@ static int rbio_add_io_page(struct btrfs_raid_bio *rbio, > struct bio *last = bio_list->tail; > int ret; > struct bio *bio; > - struct btrfs_bio_stripe *stripe; > + struct btrfs_io_stripe *stripe; > u64 disk_start; > > - stripe = &rbio->bbio->stripes[stripe_nr]; > + stripe = &rbio->bioc->stripes[stripe_nr]; > disk_start = stripe->physical + (page_index << PAGE_SHIFT); > > /* if the device is missing, just fail this stripe */ > @@ -1155,7 +1155,7 @@ static void index_rbio_pages(struct btrfs_raid_bio *rbio) > int i = 0; > > start = bio->bi_iter.bi_sector << 9; > - stripe_offset = start - rbio->bbio->raid_map[0]; > + stripe_offset = start - rbio->bioc->raid_map[0]; > page_index = stripe_offset >> PAGE_SHIFT; > > if (bio_flagged(bio, BIO_CLONED)) > @@ -1179,7 +1179,7 @@ static void index_rbio_pages(struct btrfs_raid_bio *rbio) > */ > static noinline void finish_rmw(struct btrfs_raid_bio *rbio) > { > - struct btrfs_bio *bbio = rbio->bbio; > + struct btrfs_io_context *bioc= rbio->bioc; bioc = rbio->bioc > void **pointers = rbio->finish_pointers; > int nr_data = rbio->nr_data; > int stripe; > @@ -1284,11 +1284,11 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio) > } > } > > - if (likely(!bbio->num_tgtdevs)) > + if (likely(!bioc->num_tgtdevs)) > goto write_data; > > for (stripe = 0; stripe < rbio->real_stripes; stripe++) { > - if (!bbio->tgtdev_map[stripe]) > + if (!bioc->tgtdev_map[stripe]) > continue; > > for (pagenr = 0; pagenr < rbio->stripe_npages; pagenr++) { > @@ -1302,7 +1302,7 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio) > } > > ret = rbio_add_io_page(rbio, &bio_list, page, > - rbio->bbio->tgtdev_map[stripe], > + rbio->bioc->tgtdev_map[stripe], > pagenr, rbio->stripe_len); > if (ret) > goto cleanup; > @@ -1339,12 +1339,12 @@ static int find_bio_stripe(struct btrfs_raid_bio *rbio, > { > u64 physical = bio->bi_iter.bi_sector; > int i; > - struct btrfs_bio_stripe *stripe; > + struct btrfs_io_stripe *stripe; > > physical <<= 9; > > - for (i = 0; i < rbio->bbio->num_stripes; i++) { > - stripe = &rbio->bbio->stripes[i]; > + for (i = 0; i < rbio->bioc->num_stripes; i++) { > + stripe = &rbio->bioc->stripes[i]; > if (in_range(physical, stripe->physical, rbio->stripe_len) && > stripe->dev->bdev && bio->bi_bdev == stripe->dev->bdev) { > return i; > @@ -1365,7 +1365,7 @@ static int find_logical_bio_stripe(struct btrfs_raid_bio *rbio, > int i; > > for (i = 0; i < rbio->nr_data; i++) { > - u64 stripe_start = rbio->bbio->raid_map[i]; > + u64 stripe_start = rbio->bioc->raid_map[i]; > > if (in_range(logical, stripe_start, rbio->stripe_len)) > return i; > @@ -1456,7 +1456,7 @@ static void raid_rmw_end_io(struct bio *bio) > if (!atomic_dec_and_test(&rbio->stripes_pending)) > return; > > - if (atomic_read(&rbio->error) > rbio->bbio->max_errors) > + if (atomic_read(&rbio->error) > rbio->bioc->max_errors) > goto cleanup; > > /* > @@ -1538,7 +1538,7 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio) > } > > /* > - * the bbio may be freed once we submit the last bio. Make sure > + * the bioc may be freed once we submit the last bio. Make sure > * not to touch it after that > */ > atomic_set(&rbio->stripes_pending, bios_to_read); > @@ -1720,16 +1720,16 @@ static void btrfs_raid_unplug(struct blk_plug_cb *cb, bool from_schedule) > * our main entry point for writes from the rest of the FS. > */ > int raid56_parity_write(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 stripe_len) > + struct btrfs_io_context *bioc, u64 stripe_len) > { > struct btrfs_raid_bio *rbio; > struct btrfs_plug_cb *plug = NULL; > struct blk_plug_cb *cb; > int ret; > > - rbio = alloc_rbio(fs_info, bbio, stripe_len); > + rbio = alloc_rbio(fs_info, bioc, stripe_len); > if (IS_ERR(rbio)) { > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > return PTR_ERR(rbio); > } > bio_list_add(&rbio->bio_list, bio); > @@ -1842,7 +1842,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio) > } > > /* all raid6 handling here */ > - if (rbio->bbio->map_type & BTRFS_BLOCK_GROUP_RAID6) { > + if (rbio->bioc->map_type & BTRFS_BLOCK_GROUP_RAID6) { > /* > * single failure, rebuild from parity raid5 > * style > @@ -1874,8 +1874,8 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio) > * here due to a crc mismatch and we can't give them the > * data they want > */ > - if (rbio->bbio->raid_map[failb] == RAID6_Q_STRIPE) { > - if (rbio->bbio->raid_map[faila] == > + if (rbio->bioc->raid_map[failb] == RAID6_Q_STRIPE) { > + if (rbio->bioc->raid_map[faila] == > RAID5_P_STRIPE) { > err = BLK_STS_IOERR; > goto cleanup; > @@ -1887,7 +1887,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio) > goto pstripe; > } > > - if (rbio->bbio->raid_map[failb] == RAID5_P_STRIPE) { > + if (rbio->bioc->raid_map[failb] == RAID5_P_STRIPE) { > raid6_datap_recov(rbio->real_stripes, > PAGE_SIZE, faila, pointers); > } else { > @@ -2006,7 +2006,7 @@ static void raid_recover_end_io(struct bio *bio) > if (!atomic_dec_and_test(&rbio->stripes_pending)) > return; > > - if (atomic_read(&rbio->error) > rbio->bbio->max_errors) > + if (atomic_read(&rbio->error) > rbio->bioc->max_errors) > rbio_orig_end_io(rbio, BLK_STS_IOERR); > else > __raid_recover_end_io(rbio); > @@ -2074,7 +2074,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) > * were up to date, or we might have no bios to read because > * the devices were gone. > */ > - if (atomic_read(&rbio->error) <= rbio->bbio->max_errors) { > + if (atomic_read(&rbio->error) <= rbio->bioc->max_errors) { > __raid_recover_end_io(rbio); > return 0; > } else { > @@ -2083,7 +2083,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) > } > > /* > - * the bbio may be freed once we submit the last bio. Make sure > + * the bioc may be freed once we submit the last bio. Make sure Comments that get changed (even partially) can be reformatted or reworded. > * not to touch it after that > */ > atomic_set(&rbio->stripes_pending, bios_to_read); > @@ -2117,21 +2117,21 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) > * of the drive. > */ > int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 stripe_len, > + struct btrfs_io_context *bioc, u64 stripe_len, > int mirror_num, int generic_io) > { > struct btrfs_raid_bio *rbio; > int ret; > > if (generic_io) { > - ASSERT(bbio->mirror_num == mirror_num); > + ASSERT(bioc->mirror_num == mirror_num); > btrfs_io_bio(bio)->mirror_num = mirror_num; > } > > - rbio = alloc_rbio(fs_info, bbio, stripe_len); > + rbio = alloc_rbio(fs_info, bioc, stripe_len); > if (IS_ERR(rbio)) { > if (generic_io) > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > return PTR_ERR(rbio); > } > > @@ -2142,11 +2142,11 @@ int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, > rbio->faila = find_logical_bio_stripe(rbio, bio); > if (rbio->faila == -1) { > btrfs_warn(fs_info, > - "%s could not find the bad stripe in raid56 so that we cannot recover any more (bio has logical %llu len %llu, bbio has map_type %llu)", > + "%s could not find the bad stripe in raid56 so that we cannot recover any more (bio has logical %llu len %llu, bioc has map_type %llu)", > __func__, bio->bi_iter.bi_sector << 9, > - (u64)bio->bi_iter.bi_size, bbio->map_type); > + (u64)bio->bi_iter.bi_size, bioc->map_type); > if (generic_io) > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > kfree(rbio); > return -EIO; > } > @@ -2155,7 +2155,7 @@ int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, > btrfs_bio_counter_inc_noblocked(fs_info); > rbio->generic_bio_cnt = 1; > } else { > - btrfs_get_bbio(bbio); > + btrfs_get_bioc(bioc); > } > > /* > @@ -2214,7 +2214,7 @@ static void read_rebuild_work(struct btrfs_work *work) > /* > * The following code is used to scrub/replace the parity stripe > * > - * Caller must have already increased bio_counter for getting @bbio. > + * Caller must have already increased bio_counter for getting @bioc. > * > * Note: We need make sure all the pages that add into the scrub/replace > * raid bio are correct and not be changed during the scrub/replace. That > @@ -2223,14 +2223,14 @@ static void read_rebuild_work(struct btrfs_work *work) > > struct btrfs_raid_bio * > raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 stripe_len, > + struct btrfs_io_context *bioc, u64 stripe_len, > struct btrfs_device *scrub_dev, > unsigned long *dbitmap, int stripe_nsectors) > { > struct btrfs_raid_bio *rbio; > int i; > > - rbio = alloc_rbio(fs_info, bbio, stripe_len); > + rbio = alloc_rbio(fs_info, bioc, stripe_len); > if (IS_ERR(rbio)) > return NULL; > bio_list_add(&rbio->bio_list, bio); > @@ -2242,12 +2242,12 @@ raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > rbio->operation = BTRFS_RBIO_PARITY_SCRUB; > > /* > - * After mapping bbio with BTRFS_MAP_WRITE, parities have been sorted > + * After mapping bioc with BTRFS_MAP_WRITE, parities have been sorted > * to the end position, so this search can start from the first parity > * stripe. > */ > for (i = rbio->nr_data; i < rbio->real_stripes; i++) { > - if (bbio->stripes[i].dev == scrub_dev) { > + if (bioc->stripes[i].dev == scrub_dev) { > rbio->scrubp = i; > break; > } > @@ -2260,7 +2260,7 @@ raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > bitmap_copy(rbio->dbitmap, dbitmap, stripe_nsectors); > > /* > - * We have already increased bio_counter when getting bbio, record it > + * We have already increased bio_counter when getting bioc, record it > * so we can free it at rbio_orig_end_io(). > */ > rbio->generic_bio_cnt = 1; > @@ -2275,10 +2275,10 @@ void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, > int stripe_offset; > int index; > > - ASSERT(logical >= rbio->bbio->raid_map[0]); > - ASSERT(logical + PAGE_SIZE <= rbio->bbio->raid_map[0] + > + ASSERT(logical >= rbio->bioc->raid_map[0]); > + ASSERT(logical + PAGE_SIZE <= rbio->bioc->raid_map[0] + > rbio->stripe_len * rbio->nr_data); > - stripe_offset = (int)(logical - rbio->bbio->raid_map[0]); > + stripe_offset = (int)(logical - rbio->bioc->raid_map[0]); > index = stripe_offset >> PAGE_SHIFT; > rbio->bio_pages[index] = page; > } > @@ -2312,7 +2312,7 @@ static int alloc_rbio_essential_pages(struct btrfs_raid_bio *rbio) > static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio, > int need_check) > { > - struct btrfs_bio *bbio = rbio->bbio; > + struct btrfs_io_context *bioc= rbio->bioc; This looks like a systematic error with some replacement expression missing the space before '=' > void **pointers = rbio->finish_pointers; > unsigned long *pbitmap = rbio->finish_pbitmap; > int nr_data = rbio->nr_data; > @@ -2335,7 +2335,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio, > else > BUG(); > > - if (bbio->num_tgtdevs && bbio->tgtdev_map[rbio->scrubp]) { > + if (bioc->num_tgtdevs && bioc->tgtdev_map[rbio->scrubp]) { > is_replace = 1; > bitmap_copy(pbitmap, rbio->dbitmap, rbio->stripe_npages); > } > @@ -2435,7 +2435,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio, > > page = rbio_stripe_page(rbio, rbio->scrubp, pagenr); > ret = rbio_add_io_page(rbio, &bio_list, page, > - bbio->tgtdev_map[rbio->scrubp], > + bioc->tgtdev_map[rbio->scrubp], > pagenr, rbio->stripe_len); > if (ret) > goto cleanup; > @@ -2483,7 +2483,7 @@ static inline int is_data_stripe(struct btrfs_raid_bio *rbio, int stripe) > */ > static void validate_rbio_for_parity_scrub(struct btrfs_raid_bio *rbio) > { > - if (atomic_read(&rbio->error) > rbio->bbio->max_errors) > + if (atomic_read(&rbio->error) > rbio->bioc->max_errors) > goto cleanup; > > if (rbio->faila >= 0 || rbio->failb >= 0) { > @@ -2504,7 +2504,7 @@ static void validate_rbio_for_parity_scrub(struct btrfs_raid_bio *rbio) > * the data, so the capability of the repair is declined. > * (In the case of RAID5, we can not repair anything) > */ > - if (dfail > rbio->bbio->max_errors - 1) > + if (dfail > rbio->bioc->max_errors - 1) > goto cleanup; > > /* > @@ -2625,7 +2625,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) > } > > /* > - * the bbio may be freed once we submit the last bio. Make sure > + * the bioc may be freed once we submit the last bio. Make sure Comment can be updated > * not to touch it after that > */ > atomic_set(&rbio->stripes_pending, bios_to_read); > @@ -2671,11 +2671,11 @@ void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio) > > struct btrfs_raid_bio * > raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 length) > + struct btrfs_io_context *bioc, u64 length) > { > struct btrfs_raid_bio *rbio; > > - rbio = alloc_rbio(fs_info, bbio, length); > + rbio = alloc_rbio(fs_info, bioc, length); > if (IS_ERR(rbio)) > return NULL; > > @@ -2695,7 +2695,7 @@ raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > } > > /* > - * When we get bbio, we have already increased bio_counter, record it > + * When we get bioc, we have already increased bio_counter, record it > * so we can free it at rbio_orig_end_io() > */ > rbio->generic_bio_cnt = 1; > diff --git a/fs/btrfs/raid56.h b/fs/btrfs/raid56.h > index 2503485db859..838d3a5e07ef 100644 > --- a/fs/btrfs/raid56.h > +++ b/fs/btrfs/raid56.h > @@ -31,24 +31,24 @@ struct btrfs_raid_bio; > struct btrfs_device; > > int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 stripe_len, > + struct btrfs_io_context *bioc, u64 stripe_len, > int mirror_num, int generic_io); > int raid56_parity_write(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 stripe_len); > + struct btrfs_io_context *bioc, u64 stripe_len); > > void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, > u64 logical); > > struct btrfs_raid_bio * > raid56_parity_alloc_scrub_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 stripe_len, > + struct btrfs_io_context *bioc, u64 stripe_len, > struct btrfs_device *scrub_dev, > unsigned long *dbitmap, int stripe_nsectors); > void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio); > > struct btrfs_raid_bio * > raid56_alloc_missing_rbio(struct btrfs_fs_info *fs_info, struct bio *bio, > - struct btrfs_bio *bbio, u64 length); > + struct btrfs_io_context *bioc, u64 length); > void raid56_submit_missing_rbio(struct btrfs_raid_bio *rbio); > > int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info); > diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c > index 06713a8fe26b..eb96c45f205c 100644 > --- a/fs/btrfs/reada.c > +++ b/fs/btrfs/reada.c > @@ -227,7 +227,7 @@ int btree_readahead_hook(struct extent_buffer *eb, int err) > } > > static struct reada_zone *reada_find_zone(struct btrfs_device *dev, u64 logical, > - struct btrfs_bio *bbio) > + struct btrfs_io_context *bioc) > { > struct btrfs_fs_info *fs_info = dev->fs_info; > int ret; > @@ -275,11 +275,11 @@ static struct reada_zone *reada_find_zone(struct btrfs_device *dev, u64 logical, > kref_init(&zone->refcnt); > zone->elems = 0; > zone->device = dev; /* our device always sits at index 0 */ > - for (i = 0; i < bbio->num_stripes; ++i) { > + for (i = 0; i < bioc->num_stripes; ++i) { > /* bounds have already been checked */ > - zone->devs[i] = bbio->stripes[i].dev; > + zone->devs[i] = bioc->stripes[i].dev; > } > - zone->ndevs = bbio->num_stripes; > + zone->ndevs = bioc->num_stripes; > > spin_lock(&fs_info->reada_lock); > ret = radix_tree_insert(&dev->reada_zones, > @@ -309,7 +309,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, > int ret; > struct reada_extent *re = NULL; > struct reada_extent *re_exist = NULL; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc = NULL; > struct btrfs_device *dev; > struct btrfs_device *prev_dev; > u64 length; > @@ -345,28 +345,28 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, > */ > length = fs_info->nodesize; > ret = btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical, > - &length, &bbio, 0); > - if (ret || !bbio || length < fs_info->nodesize) > + &length, &bioc, 0); > + if (ret || !bioc || length < fs_info->nodesize) > goto error; > > - if (bbio->num_stripes > BTRFS_MAX_MIRRORS) { > + if (bioc->num_stripes > BTRFS_MAX_MIRRORS) { > btrfs_err(fs_info, > "readahead: more than %d copies not supported", > BTRFS_MAX_MIRRORS); > goto error; > } > > - real_stripes = bbio->num_stripes - bbio->num_tgtdevs; > + real_stripes = bioc->num_stripes - bioc->num_tgtdevs; > for (nzones = 0; nzones < real_stripes; ++nzones) { > struct reada_zone *zone; > > - dev = bbio->stripes[nzones].dev; > + dev = bioc->stripes[nzones].dev; > > /* cannot read ahead on missing device. */ > if (!dev->bdev) > continue; > > - zone = reada_find_zone(dev, logical, bbio); > + zone = reada_find_zone(dev, logical, bioc); > if (!zone) > continue; > > @@ -464,7 +464,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, > if (!have_zone) > goto error; > > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > return re; > > error: > @@ -488,7 +488,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, > kref_put(&zone->refcnt, reada_zone_release); > spin_unlock(&fs_info->reada_lock); > } > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > kfree(re); > return re_exist; > } > diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c > index 088641ba7a8e..d83ccec89aa7 100644 > --- a/fs/btrfs/scrub.c > +++ b/fs/btrfs/scrub.c > @@ -57,7 +57,7 @@ struct scrub_ctx; > > struct scrub_recover { > refcount_t refs; > - struct btrfs_bio *bbio; > + struct btrfs_io_context *bioc; > u64 map_length; > }; > > @@ -254,7 +254,7 @@ static void scrub_put_ctx(struct scrub_ctx *sctx); > static inline int scrub_is_page_on_raid56(struct scrub_page *spage) > { > return spage->recover && > - (spage->recover->bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK); > + (spage->recover->bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK); > } > > static void scrub_pending_bio_inc(struct scrub_ctx *sctx) > @@ -798,7 +798,7 @@ static inline void scrub_put_recover(struct btrfs_fs_info *fs_info, > { > if (refcount_dec_and_test(&recover->refs)) { > btrfs_bio_counter_dec(fs_info); > - btrfs_put_bbio(recover->bbio); > + btrfs_put_bioc(recover->bioc); > kfree(recover); > } > } > @@ -1027,8 +1027,8 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) > sblock_other = sblocks_for_recheck + mirror_index; > } else { > struct scrub_recover *r = sblock_bad->pagev[0]->recover; > - int max_allowed = r->bbio->num_stripes - > - r->bbio->num_tgtdevs; > + int max_allowed = r->bioc->num_stripes - > + r->bioc->num_tgtdevs; > > if (mirror_index >= max_allowed) > break; > @@ -1218,14 +1218,14 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) > return 0; > } > > -static inline int scrub_nr_raid_mirrors(struct btrfs_bio *bbio) > +static inline int scrub_nr_raid_mirrors(struct btrfs_io_context *bioc) > { > - if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID5) > + if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID5) > return 2; > - else if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID6) > + else if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID6) > return 3; > else > - return (int)bbio->num_stripes; > + return (int)bioc->num_stripes; > } > > static inline void scrub_stripe_index_and_offset(u64 logical, u64 map_type, > @@ -1269,7 +1269,7 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, > u64 flags = original_sblock->pagev[0]->flags; > u64 have_csum = original_sblock->pagev[0]->have_csum; > struct scrub_recover *recover; > - struct btrfs_bio *bbio; > + struct btrfs_io_context *bioc; > u64 sublen; > u64 mapped_length; > u64 stripe_offset; > @@ -1288,7 +1288,7 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, > while (length > 0) { > sublen = min_t(u64, length, fs_info->sectorsize); > mapped_length = sublen; > - bbio = NULL; > + bioc = NULL; > > /* > * With a length of sectorsize, each returned stripe represents > @@ -1296,27 +1296,27 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, > */ > btrfs_bio_counter_inc_blocked(fs_info); > ret = btrfs_map_sblock(fs_info, BTRFS_MAP_GET_READ_MIRRORS, > - logical, &mapped_length, &bbio); > - if (ret || !bbio || mapped_length < sublen) { > - btrfs_put_bbio(bbio); > + logical, &mapped_length, &bioc); > + if (ret || !bioc|| mapped_length < sublen) { > + btrfs_put_bioc(bioc); > btrfs_bio_counter_dec(fs_info); > return -EIO; > } > > recover = kzalloc(sizeof(struct scrub_recover), GFP_NOFS); > if (!recover) { > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > btrfs_bio_counter_dec(fs_info); > return -ENOMEM; > } > > refcount_set(&recover->refs, 1); > - recover->bbio = bbio; > + recover->bioc = bioc; > recover->map_length = mapped_length; > > BUG_ON(page_index >= SCRUB_MAX_PAGES_PER_BLOCK); > > - nmirrors = min(scrub_nr_raid_mirrors(bbio), BTRFS_MAX_MIRRORS); > + nmirrors = min(scrub_nr_raid_mirrors(bioc), BTRFS_MAX_MIRRORS); > > for (mirror_index = 0; mirror_index < nmirrors; > mirror_index++) { > @@ -1348,17 +1348,17 @@ static int scrub_setup_recheck_block(struct scrub_block *original_sblock, > sctx->fs_info->csum_size); > > scrub_stripe_index_and_offset(logical, > - bbio->map_type, > - bbio->raid_map, > + bioc->map_type, > + bioc->raid_map, > mapped_length, > - bbio->num_stripes - > - bbio->num_tgtdevs, > + bioc->num_stripes - > + bioc->num_tgtdevs, > mirror_index, > &stripe_index, > &stripe_offset); > - spage->physical = bbio->stripes[stripe_index].physical + > + spage->physical = bioc->stripes[stripe_index].physical + > stripe_offset; > - spage->dev = bbio->stripes[stripe_index].dev; > + spage->dev = bioc->stripes[stripe_index].dev; > > BUG_ON(page_index >= original_sblock->page_count); > spage->physical_for_dev_replace = > @@ -1401,7 +1401,7 @@ static int scrub_submit_raid56_bio_wait(struct btrfs_fs_info *fs_info, > bio->bi_end_io = scrub_bio_wait_endio; > > mirror_num = spage->sblock->pagev[0]->mirror_num; > - ret = raid56_parity_recover(fs_info, bio, spage->recover->bbio, > + ret = raid56_parity_recover(fs_info, bio, spage->recover->bioc, > spage->recover->map_length, > mirror_num, 0); > if (ret) > @@ -2203,7 +2203,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) > struct btrfs_fs_info *fs_info = sctx->fs_info; > u64 length = sblock->page_count * PAGE_SIZE; > u64 logical = sblock->pagev[0]->logical; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = NULL > struct bio *bio; > struct btrfs_raid_bio *rbio; > int ret; > @@ -2211,19 +2211,19 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) > > btrfs_bio_counter_inc_blocked(fs_info); > ret = btrfs_map_sblock(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical, > - &length, &bbio); > - if (ret || !bbio || !bbio->raid_map) > - goto bbio_out; > + &length, &bioc); > + if (ret || !bioc || !bioc->raid_map) > + goto bioc_out; > > if (WARN_ON(!sctx->is_dev_replace || > - !(bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK))) { > + !(bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK))) { > /* > * We shouldn't be scrubbing a missing device. Even for dev > * replace, we should only get here for RAID 5/6. We either > * managed to mount something with no mirrors remaining or > * there's a bug in scrub_remap_extent()/btrfs_map_block(). > */ > - goto bbio_out; > + goto bioc_out; > } > > bio = btrfs_io_bio_alloc(0); > @@ -2231,7 +2231,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) > bio->bi_private = sblock; > bio->bi_end_io = scrub_missing_raid56_end_io; > > - rbio = raid56_alloc_missing_rbio(fs_info, bio, bbio, length); > + rbio = raid56_alloc_missing_rbio(fs_info, bio, bioc, length); > if (!rbio) > goto rbio_out; > > @@ -2249,9 +2249,9 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) > > rbio_out: > bio_put(bio); > -bbio_out: > +bioc_out: > btrfs_bio_counter_dec(fs_info); > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > spin_lock(&sctx->stat_lock); > sctx->stat.malloc_errors++; > spin_unlock(&sctx->stat_lock); > @@ -2826,7 +2826,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) > struct btrfs_fs_info *fs_info = sctx->fs_info; > struct bio *bio; > struct btrfs_raid_bio *rbio; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = NULL > u64 length; > int ret; > > @@ -2838,16 +2838,16 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) > > btrfs_bio_counter_inc_blocked(fs_info); > ret = btrfs_map_sblock(fs_info, BTRFS_MAP_WRITE, sparity->logic_start, > - &length, &bbio); > - if (ret || !bbio || !bbio->raid_map) > - goto bbio_out; > + &length, &bioc); > + if (ret || !bioc || !bioc->raid_map) > + goto bioc_out; > > bio = btrfs_io_bio_alloc(0); > bio->bi_iter.bi_sector = sparity->logic_start >> 9; > bio->bi_private = sparity; > bio->bi_end_io = scrub_parity_bio_endio; > > - rbio = raid56_parity_alloc_scrub_rbio(fs_info, bio, bbio, > + rbio = raid56_parity_alloc_scrub_rbio(fs_info, bio, bioc, > length, sparity->scrub_dev, > sparity->dbitmap, > sparity->nsectors); > @@ -2860,9 +2860,9 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) > > rbio_out: > bio_put(bio); > -bbio_out: > +bioc_out: > btrfs_bio_counter_dec(fs_info); > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > bitmap_or(sparity->ebitmap, sparity->ebitmap, sparity->dbitmap, > sparity->nsectors); > spin_lock(&sctx->stat_lock); > @@ -2901,7 +2901,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, > struct btrfs_root *root = fs_info->extent_root; > struct btrfs_root *csum_root = fs_info->csum_root; > struct btrfs_extent_item *extent; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc = NULL; > u64 flags; > int ret; > int slot; > @@ -3044,22 +3044,22 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx, > extent_len); > > mapped_length = extent_len; > - bbio = NULL; > + bioc = NULL; > ret = btrfs_map_block(fs_info, BTRFS_MAP_READ, > - extent_logical, &mapped_length, &bbio, > + extent_logical, &mapped_length, &bioc, > 0); > if (!ret) { > - if (!bbio || mapped_length < extent_len) > + if (!bioc || mapped_length < extent_len) > ret = -EIO; > } > if (ret) { > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > goto out; > } > - extent_physical = bbio->stripes[0].physical; > - extent_mirror_num = bbio->mirror_num; > - extent_dev = bbio->stripes[0].dev; > - btrfs_put_bbio(bbio); > + extent_physical = bioc->stripes[0].physical; > + extent_mirror_num = bioc->mirror_num; > + extent_dev = bioc->stripes[0].dev; > + btrfs_put_bioc(bioc); > > ret = btrfs_lookup_csums_range(csum_root, > extent_logical, > @@ -4309,20 +4309,20 @@ static void scrub_remap_extent(struct btrfs_fs_info *fs_info, > int *extent_mirror_num) > { > u64 mapped_length; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; > int ret; > > mapped_length = extent_len; > ret = btrfs_map_block(fs_info, BTRFS_MAP_READ, extent_logical, > - &mapped_length, &bbio, 0); > - if (ret || !bbio || mapped_length < extent_len || > - !bbio->stripes[0].dev->bdev) { > - btrfs_put_bbio(bbio); > + &mapped_length, &bioc, 0); > + if (ret || !bioc || mapped_length < extent_len || > + !bioc->stripes[0].dev->bdev) { > + btrfs_put_bioc(bioc); > return; > } > > - *extent_physical = bbio->stripes[0].physical; > - *extent_mirror_num = bbio->mirror_num; > - *extent_dev = bbio->stripes[0].dev; > - btrfs_put_bbio(bbio); > + *extent_physical = bioc->stripes[0].physical; > + *extent_mirror_num = bioc->mirror_num; > + *extent_dev = bioc->stripes[0].dev; > + btrfs_put_bioc(bioc); > } > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index b81f25eed298..0cb1d5bad09d 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -250,7 +250,7 @@ static void btrfs_dev_stat_print_on_load(struct btrfs_device *device); > static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > enum btrfs_map_op op, > u64 logical, u64 *length, > - struct btrfs_bio **bbio_ret, > + struct btrfs_io_context **bioc_ret, > int mirror_num, int need_raid_map); > > /* > @@ -5776,7 +5776,7 @@ static int find_live_mirror(struct btrfs_fs_info *fs_info, > } > > /* Bubble-sort the stripe set to put the parity/syndrome stripes last */ > -static void sort_parity_stripes(struct btrfs_bio *bbio, int num_stripes) > +static void sort_parity_stripes(struct btrfs_io_context *bioc, int num_stripes) > { > int i; > int again = 1; > @@ -5785,22 +5785,23 @@ static void sort_parity_stripes(struct btrfs_bio *bbio, int num_stripes) > again = 0; > for (i = 0; i < num_stripes - 1; i++) { > /* Swap if parity is on a smaller index */ > - if (bbio->raid_map[i] > bbio->raid_map[i + 1]) { > - swap(bbio->stripes[i], bbio->stripes[i + 1]); > - swap(bbio->raid_map[i], bbio->raid_map[i + 1]); > + if (bioc->raid_map[i] > bioc->raid_map[i + 1]) { > + swap(bioc->stripes[i], bioc->stripes[i + 1]); > + swap(bioc->raid_map[i], bioc->raid_map[i + 1]); > again = 1; > } > } > } > } > > -static struct btrfs_bio *alloc_btrfs_bio(int total_stripes, int real_stripes) > +static struct btrfs_io_context *alloc_btrfs_io_context(int total_stripes, > + int real_stripes) > { > - struct btrfs_bio *bbio = kzalloc( > - /* the size of the btrfs_bio */ > - sizeof(struct btrfs_bio) + > + struct btrfs_io_context *bioc = kzalloc( > + /* the size of the btrfs_io_context */ Comment update > + sizeof(struct btrfs_io_context) + > /* plus the variable array for the stripes */ > - sizeof(struct btrfs_bio_stripe) * (total_stripes) + > + sizeof(struct btrfs_io_stripe) * (total_stripes) + > /* plus the variable array for the tgt dev */ > sizeof(int) * (real_stripes) + > /* > @@ -5810,27 +5811,27 @@ static struct btrfs_bio *alloc_btrfs_bio(int total_stripes, int real_stripes) > sizeof(u64) * (total_stripes), > GFP_NOFS|__GFP_NOFAIL); > > - atomic_set(&bbio->error, 0); > - refcount_set(&bbio->refs, 1); > + atomic_set(&bioc->error, 0); > + refcount_set(&bioc->refs, 1); > > - bbio->tgtdev_map = (int *)(bbio->stripes + total_stripes); > - bbio->raid_map = (u64 *)(bbio->tgtdev_map + real_stripes); > + bioc->tgtdev_map = (int *)(bioc->stripes + total_stripes); > + bioc->raid_map = (u64 *)(bioc->tgtdev_map + real_stripes); > > - return bbio; > + return bioc; > } > > -void btrfs_get_bbio(struct btrfs_bio *bbio) > +void btrfs_get_bioc(struct btrfs_io_context *bioc) > { > - WARN_ON(!refcount_read(&bbio->refs)); > - refcount_inc(&bbio->refs); > + WARN_ON(!refcount_read(&bioc->refs)); > + refcount_inc(&bioc->refs); > } > > -void btrfs_put_bbio(struct btrfs_bio *bbio) > +void btrfs_put_bioc(struct btrfs_io_context *bioc) > { > - if (!bbio) > + if (!bioc) > return; > - if (refcount_dec_and_test(&bbio->refs)) > - kfree(bbio); > + if (refcount_dec_and_test(&bioc->refs)) > + kfree(bioc); > } > > /* can REQ_OP_DISCARD be sent with other REQ like REQ_OP_WRITE? */ > @@ -5840,11 +5841,11 @@ void btrfs_put_bbio(struct btrfs_bio *bbio) > */ > static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, > u64 logical, u64 *length_ret, > - struct btrfs_bio **bbio_ret) > + struct btrfs_io_context **bioc_ret) > { > struct extent_map *em; > struct map_lookup *map; > - struct btrfs_bio *bbio; > + struct btrfs_io_context *bioc; > u64 length = *length_ret; > u64 offset; > u64 stripe_nr; > @@ -5863,8 +5864,8 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, > int ret = 0; > int i; > > - /* discard always return a bbio */ > - ASSERT(bbio_ret); > + /* discard always return a bioc */ Comment update > + ASSERT(bioc_ret); > > em = btrfs_get_chunk_map(fs_info, logical, length); > if (IS_ERR(em)) > @@ -5927,26 +5928,25 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, > &stripe_index); > } > > - bbio = alloc_btrfs_bio(num_stripes, 0); > - if (!bbio) { > + bioc = alloc_btrfs_io_context(num_stripes, 0); > + if (!bioc) { > ret = -ENOMEM; > goto out; > } > > for (i = 0; i < num_stripes; i++) { > - bbio->stripes[i].physical = > + bioc->stripes[i].physical = > map->stripes[stripe_index].physical + > stripe_offset + stripe_nr * map->stripe_len; > - bbio->stripes[i].dev = map->stripes[stripe_index].dev; > + bioc->stripes[i].dev = map->stripes[stripe_index].dev; > > if (map->type & (BTRFS_BLOCK_GROUP_RAID0 | > BTRFS_BLOCK_GROUP_RAID10)) { > - bbio->stripes[i].length = stripes_per_dev * > + bioc->stripes[i].length = stripes_per_dev * > map->stripe_len; > > if (i / sub_stripes < remaining_stripes) > - bbio->stripes[i].length += > - map->stripe_len; > + bioc->stripes[i].length += map->stripe_len; > > /* > * Special for the first stripe and > @@ -5957,19 +5957,17 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, > * off end_off > */ > if (i < sub_stripes) > - bbio->stripes[i].length -= > - stripe_offset; > + bioc->stripes[i].length -= stripe_offset; > > if (stripe_index >= last_stripe && > stripe_index <= (last_stripe + > sub_stripes - 1)) > - bbio->stripes[i].length -= > - stripe_end_offset; > + bioc->stripes[i].length -= stripe_end_offset; > > if (i == sub_stripes - 1) > stripe_offset = 0; > } else { > - bbio->stripes[i].length = length; > + bioc->stripes[i].length = length; > } > > stripe_index++; > @@ -5979,9 +5977,9 @@ static int __btrfs_map_block_for_discard(struct btrfs_fs_info *fs_info, > } > } > > - *bbio_ret = bbio; > - bbio->map_type = map->type; > - bbio->num_stripes = num_stripes; > + *bioc_ret = bioc; > + bioc->map_type = map->type; > + bioc->num_stripes = num_stripes; > out: > free_extent_map(em); > return ret; > @@ -6005,7 +6003,7 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, > u64 srcdev_devid, int *mirror_num, > u64 *physical) > { > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = NULL > int num_stripes; > int index_srcdev = 0; > int found = 0; > @@ -6014,20 +6012,20 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, > int ret = 0; > > ret = __btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS, > - logical, &length, &bbio, 0, 0); > + logical, &length, &bioc, 0, 0); > if (ret) { > - ASSERT(bbio == NULL); > + ASSERT(bioc== NULL); bioc == NULL > return ret; > } > > - num_stripes = bbio->num_stripes; > + num_stripes = bioc->num_stripes; > if (*mirror_num > num_stripes) { > /* > * BTRFS_MAP_GET_READ_MIRRORS does not contain this mirror, > * that means that the requested area is not left of the left > * cursor > */ > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > return -EIO; > } > > @@ -6037,7 +6035,7 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, > * pointer to the one of the target drive. > */ > for (i = 0; i < num_stripes; i++) { > - if (bbio->stripes[i].dev->devid != srcdev_devid) > + if (bioc->stripes[i].dev->devid != srcdev_devid) > continue; > > /* > @@ -6045,15 +6043,15 @@ static int get_extra_mirror_from_replace(struct btrfs_fs_info *fs_info, > * mirror with the lowest physical address > */ > if (found && > - physical_of_found <= bbio->stripes[i].physical) > + physical_of_found <= bioc->stripes[i].physical) > continue; > > index_srcdev = i; > found = 1; > - physical_of_found = bbio->stripes[i].physical; > + physical_of_found = bioc->stripes[i].physical; > } > > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > > ASSERT(found); > if (!found) > @@ -6084,12 +6082,12 @@ static bool is_block_group_to_copy(struct btrfs_fs_info *fs_info, u64 logical) > } > > static void handle_ops_on_dev_replace(enum btrfs_map_op op, > - struct btrfs_bio **bbio_ret, > + struct btrfs_io_context **bioc_ret, > struct btrfs_dev_replace *dev_replace, > u64 logical, > int *num_stripes_ret, int *max_errors_ret) > { > - struct btrfs_bio *bbio = *bbio_ret; > + struct btrfs_io_context *bioc = *bioc_ret; > u64 srcdev_devid = dev_replace->srcdev->devid; > int tgtdev_indexes = 0; > int num_stripes = *num_stripes_ret; > @@ -6119,17 +6117,17 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, > */ > index_where_to_add = num_stripes; > for (i = 0; i < num_stripes; i++) { > - if (bbio->stripes[i].dev->devid == srcdev_devid) { > + if (bioc->stripes[i].dev->devid == srcdev_devid) { > /* write to new disk, too */ > - struct btrfs_bio_stripe *new = > - bbio->stripes + index_where_to_add; > - struct btrfs_bio_stripe *old = > - bbio->stripes + i; > + struct btrfs_io_stripe *new = > + bioc->stripes + index_where_to_add; > + struct btrfs_io_stripe *old = > + bioc->stripes + i; > > new->physical = old->physical; > new->length = old->length; > new->dev = dev_replace->tgtdev; > - bbio->tgtdev_map[i] = index_where_to_add; > + bioc->tgtdev_map[i] = index_where_to_add; > index_where_to_add++; > max_errors++; > tgtdev_indexes++; > @@ -6149,7 +6147,7 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, > * full copy of the source drive. > */ > for (i = 0; i < num_stripes; i++) { > - if (bbio->stripes[i].dev->devid == srcdev_devid) { > + if (bioc->stripes[i].dev->devid == srcdev_devid) { > /* > * In case of DUP, in order to keep it simple, > * only add the mirror with the lowest physical > @@ -6157,22 +6155,22 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, > */ > if (found && > physical_of_found <= > - bbio->stripes[i].physical) > + bioc->stripes[i].physical) > continue; > index_srcdev = i; > found = 1; > - physical_of_found = bbio->stripes[i].physical; > + physical_of_found = bioc->stripes[i].physical; > } > } > if (found) { > - struct btrfs_bio_stripe *tgtdev_stripe = > - bbio->stripes + num_stripes; > + struct btrfs_io_stripe *tgtdev_stripe = > + bioc->stripes + num_stripes; > > tgtdev_stripe->physical = physical_of_found; > tgtdev_stripe->length = > - bbio->stripes[index_srcdev].length; > + bioc->stripes[index_srcdev].length; > tgtdev_stripe->dev = dev_replace->tgtdev; > - bbio->tgtdev_map[index_srcdev] = num_stripes; > + bioc->tgtdev_map[index_srcdev] = num_stripes; > > tgtdev_indexes++; > num_stripes++; > @@ -6181,8 +6179,8 @@ static void handle_ops_on_dev_replace(enum btrfs_map_op op, > > *num_stripes_ret = num_stripes; > *max_errors_ret = max_errors; > - bbio->num_tgtdevs = tgtdev_indexes; > - *bbio_ret = bbio; > + bioc->num_tgtdevs = tgtdev_indexes; > + *bioc_ret = bioc; > } > > static bool need_full_stripe(enum btrfs_map_op op) > @@ -6285,7 +6283,7 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *em, > static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > enum btrfs_map_op op, > u64 logical, u64 *length, > - struct btrfs_bio **bbio_ret, > + struct btrfs_io_context **bioc_ret, > int mirror_num, int need_raid_map) > { > struct extent_map *em; > @@ -6300,7 +6298,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > int num_stripes; > int max_errors = 0; > int tgtdev_indexes = 0; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = NULL > struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; > int dev_replace_is_ongoing = 0; > int num_alloc_stripes; > @@ -6309,7 +6307,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > u64 raid56_full_stripe_start = (u64)-1; > struct btrfs_io_geometry geom; > > - ASSERT(bbio_ret); > + ASSERT(bioc_ret); > ASSERT(op != BTRFS_MAP_DISCARD); > > em = btrfs_get_chunk_map(fs_info, logical, *length); > @@ -6453,16 +6451,16 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > tgtdev_indexes = num_stripes; > } > > - bbio = alloc_btrfs_bio(num_alloc_stripes, tgtdev_indexes); > - if (!bbio) { > + bioc = alloc_btrfs_io_context(num_alloc_stripes, tgtdev_indexes); > + if (!bioc) { > ret = -ENOMEM; > goto out; > } > > for (i = 0; i < num_stripes; i++) { > - bbio->stripes[i].physical = map->stripes[stripe_index].physical + > + bioc->stripes[i].physical = map->stripes[stripe_index].physical + > stripe_offset + stripe_nr * map->stripe_len; > - bbio->stripes[i].dev = map->stripes[stripe_index].dev; > + bioc->stripes[i].dev = map->stripes[stripe_index].dev; > stripe_index++; > } > > @@ -6478,15 +6476,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > /* Fill in the logical address of each stripe */ > tmp = stripe_nr * data_stripes; > for (i = 0; i < data_stripes; i++) > - bbio->raid_map[(i+rot) % num_stripes] = > + bioc->raid_map[(i+rot) % num_stripes] = (i + rot) % num_stripes > em->start + (tmp + i) * map->stripe_len; > > - bbio->raid_map[(i+rot) % map->num_stripes] = RAID5_P_STRIPE; > + bioc->raid_map[(i+rot) % map->num_stripes] = RAID5_P_STRIPE; > if (map->type & BTRFS_BLOCK_GROUP_RAID6) > - bbio->raid_map[(i+rot+1) % num_stripes] = > + bioc->raid_map[(i+rot+1) % num_stripes] = (i + rot + 1) % num_stripes > RAID6_Q_STRIPE; > > - sort_parity_stripes(bbio, num_stripes); > + sort_parity_stripes(bioc, num_stripes); > } > > if (need_full_stripe(op)) > @@ -6494,15 +6492,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > > if (dev_replace_is_ongoing && dev_replace->tgtdev != NULL && > need_full_stripe(op)) { > - handle_ops_on_dev_replace(op, &bbio, dev_replace, logical, > + handle_ops_on_dev_replace(op, &bioc, dev_replace, logical, > &num_stripes, &max_errors); > } > > - *bbio_ret = bbio; > - bbio->map_type = map->type; > - bbio->num_stripes = num_stripes; > - bbio->max_errors = max_errors; > - bbio->mirror_num = mirror_num; > + *bioc_ret = bioc; > + bioc->map_type = map->type; > + bioc->num_stripes = num_stripes; > + bioc->max_errors = max_errors; > + bioc->mirror_num = mirror_num; > > /* > * this is the case that REQ_READ && dev_replace_is_ongoing && > @@ -6511,9 +6509,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > */ > if (patch_the_first_stripe_for_dev_replace && num_stripes > 0) { > WARN_ON(num_stripes > 1); > - bbio->stripes[0].dev = dev_replace->tgtdev; > - bbio->stripes[0].physical = physical_to_patch_in_first_stripe; > - bbio->mirror_num = map->num_stripes + 1; > + bioc->stripes[0].dev = dev_replace->tgtdev; > + bioc->stripes[0].physical = physical_to_patch_in_first_stripe; > + bioc->mirror_num = map->num_stripes + 1; > } > out: > if (dev_replace_is_ongoing) { > @@ -6527,40 +6525,40 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, > > int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, > u64 logical, u64 *length, > - struct btrfs_bio **bbio_ret, int mirror_num) > + struct btrfs_io_context **bioc_ret, int mirror_num) > { > if (op == BTRFS_MAP_DISCARD) > return __btrfs_map_block_for_discard(fs_info, logical, > - length, bbio_ret); > + length, bioc_ret); > > - return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, > + return __btrfs_map_block(fs_info, op, logical, length, bioc_ret, > mirror_num, 0); > } > > /* For Scrub/replace */ > int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, > u64 logical, u64 *length, > - struct btrfs_bio **bbio_ret) > + struct btrfs_io_context **bioc_ret) > { > - return __btrfs_map_block(fs_info, op, logical, length, bbio_ret, 0, 1); > + return __btrfs_map_block(fs_info, op, logical, length, bioc_ret, 0, 1); > } > > -static inline void btrfs_end_bbio(struct btrfs_bio *bbio, struct bio *bio) > +static inline void btrfs_end_bioc(struct btrfs_io_context *bioc, struct bio *bio) > { > - bio->bi_private = bbio->private; > - bio->bi_end_io = bbio->end_io; > + bio->bi_private = bioc->private; > + bio->bi_end_io = bioc->end_io; > bio_endio(bio); > > - btrfs_put_bbio(bbio); > + btrfs_put_bioc(bioc); > } > > static void btrfs_end_bio(struct bio *bio) > { > - struct btrfs_bio *bbio = bio->bi_private; > + struct btrfs_io_context *bioc= bio->bi_private; bioc = ... > int is_orig_bio = 0; > > if (bio->bi_status) { > - atomic_inc(&bbio->error); > + atomic_inc(&bioc->error); > if (bio->bi_status == BLK_STS_IOERR || > bio->bi_status == BLK_STS_TARGET) { > struct btrfs_device *dev = btrfs_io_bio(bio)->device; > @@ -6578,22 +6576,22 @@ static void btrfs_end_bio(struct bio *bio) > } > } > > - if (bio == bbio->orig_bio) > + if (bio == bioc->orig_bio) > is_orig_bio = 1; > > - btrfs_bio_counter_dec(bbio->fs_info); > + btrfs_bio_counter_dec(bioc->fs_info); > > - if (atomic_dec_and_test(&bbio->stripes_pending)) { > + if (atomic_dec_and_test(&bioc->stripes_pending)) { > if (!is_orig_bio) { > bio_put(bio); > - bio = bbio->orig_bio; > + bio = bioc->orig_bio; > } > > - btrfs_io_bio(bio)->mirror_num = bbio->mirror_num; > + btrfs_io_bio(bio)->mirror_num = bioc->mirror_num; > /* only send an error to the higher layers if it is > * beyond the tolerance of the btrfs bio > */ > - if (atomic_read(&bbio->error) > bbio->max_errors) { > + if (atomic_read(&bioc->error) > bioc->max_errors) { > bio->bi_status = BLK_STS_IOERR; > } else { > /* > @@ -6603,18 +6601,18 @@ static void btrfs_end_bio(struct bio *bio) > bio->bi_status = BLK_STS_OK; > } > > - btrfs_end_bbio(bbio, bio); > + btrfs_end_bioc(bioc, bio); > } else if (!is_orig_bio) { > bio_put(bio); > } > } > > -static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio, > +static void submit_stripe_bio(struct btrfs_io_context *bioc, struct bio *bio, > u64 physical, struct btrfs_device *dev) > { > - struct btrfs_fs_info *fs_info = bbio->fs_info; > + struct btrfs_fs_info *fs_info = bioc->fs_info; > > - bio->bi_private = bbio; > + bio->bi_private = bioc; > btrfs_io_bio(bio)->device = dev; > bio->bi_end_io = btrfs_end_bio; > bio->bi_iter.bi_sector = physical >> 9; > @@ -6644,20 +6642,20 @@ static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio, > btrfsic_submit_bio(bio); > } > > -static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) > +static void bioc_error(struct btrfs_io_context *bioc, struct bio *bio, u64 logical) > { > - atomic_inc(&bbio->error); > - if (atomic_dec_and_test(&bbio->stripes_pending)) { > + atomic_inc(&bioc->error); > + if (atomic_dec_and_test(&bioc->stripes_pending)) { > /* Should be the original bio. */ > - WARN_ON(bio != bbio->orig_bio); > + WARN_ON(bio != bioc->orig_bio); > > - btrfs_io_bio(bio)->mirror_num = bbio->mirror_num; > + btrfs_io_bio(bio)->mirror_num = bioc->mirror_num; > bio->bi_iter.bi_sector = logical >> 9; > - if (atomic_read(&bbio->error) > bbio->max_errors) > + if (atomic_read(&bioc->error) > bioc->max_errors) > bio->bi_status = BLK_STS_IOERR; > else > bio->bi_status = BLK_STS_OK; > - btrfs_end_bbio(bbio, bio); > + btrfs_end_bioc(bioc, bio); > } > } > > @@ -6672,35 +6670,35 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, > int ret; > int dev_nr; > int total_devs; > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = ... > > length = bio->bi_iter.bi_size; > map_length = length; > > btrfs_bio_counter_inc_blocked(fs_info); > ret = __btrfs_map_block(fs_info, btrfs_op(bio), logical, > - &map_length, &bbio, mirror_num, 1); > + &map_length, &bioc, mirror_num, 1); > if (ret) { > btrfs_bio_counter_dec(fs_info); > return errno_to_blk_status(ret); > } > > - total_devs = bbio->num_stripes; > - bbio->orig_bio = first_bio; > - bbio->private = first_bio->bi_private; > - bbio->end_io = first_bio->bi_end_io; > - bbio->fs_info = fs_info; > - atomic_set(&bbio->stripes_pending, bbio->num_stripes); > + total_devs = bioc->num_stripes; > + bioc->orig_bio = first_bio; > + bioc->private = first_bio->bi_private; > + bioc->end_io = first_bio->bi_end_io; > + bioc->fs_info = fs_info; > + atomic_set(&bioc->stripes_pending, bioc->num_stripes); > > - if ((bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && > + if ((bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && > ((btrfs_op(bio) == BTRFS_MAP_WRITE) || (mirror_num > 1))) { > /* In this case, map_length has been set to the length of > a single stripe; not the whole write */ > if (btrfs_op(bio) == BTRFS_MAP_WRITE) { > - ret = raid56_parity_write(fs_info, bio, bbio, > + ret = raid56_parity_write(fs_info, bio, bioc, > map_length); > } else { > - ret = raid56_parity_recover(fs_info, bio, bbio, > + ret = raid56_parity_recover(fs_info, bio, bioc, > map_length, mirror_num, 1); > } > > @@ -6716,12 +6714,12 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, > } > > for (dev_nr = 0; dev_nr < total_devs; dev_nr++) { > - dev = bbio->stripes[dev_nr].dev; > + dev = bioc->stripes[dev_nr].dev; > if (!dev || !dev->bdev || test_bit(BTRFS_DEV_STATE_MISSING, > &dev->dev_state) || > (btrfs_op(first_bio) == BTRFS_MAP_WRITE && > !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))) { > - bbio_error(bbio, first_bio, logical); > + bioc_error(bioc, first_bio, logical); > continue; > } > > @@ -6730,7 +6728,7 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, > else > bio = first_bio; > > - submit_stripe_bio(bbio, bio, bbio->stripes[dev_nr].physical, dev); > + submit_stripe_bio(bioc, bio, bioc->stripes[dev_nr].physical, dev); > } > btrfs_bio_counter_dec(fs_info); > return BLK_STS_OK; > diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h > index 7e8f205978d9..1e3bbdf7be94 100644 > --- a/fs/btrfs/volumes.h > +++ b/fs/btrfs/volumes.h > @@ -306,11 +306,11 @@ struct btrfs_fs_devices { > /* > * we need the mirror number and stripe index to be passed around > * the call chain while we are processing end_io (especially errors). > - * Really, what we need is a btrfs_bio structure that has this info > + * Really, what we need is a btrfs_io_context structure that has this info > * and is properly sized with its stripe array, but we're not there > * quite yet. We have our own btrfs bioset, and all of the bios > * we allocate are actually btrfs_io_bios. We'll cram as much of > - * struct btrfs_bio as we can into this over time. > + * struct btrfs_io_context as we can into this over time. > */ > struct btrfs_io_bio { > unsigned int mirror_num; > @@ -339,13 +339,14 @@ static inline void btrfs_io_bio_free_csum(struct btrfs_io_bio *io_bio) > } > } > > -struct btrfs_bio_stripe { > +struct btrfs_io_stripe { > struct btrfs_device *dev; > u64 physical; > u64 length; /* only used for discard mappings */ > }; > > -struct btrfs_bio { > +/* Context for IO subsmission for device stripe. */ Maybe it would be good to describe on which layer it is > +struct btrfs_io_context { > refcount_t refs; > atomic_t stripes_pending; > struct btrfs_fs_info *fs_info; > @@ -365,7 +366,7 @@ struct btrfs_bio { > * so raid_map[0] is the start of our full stripe > */ > u64 *raid_map; > - struct btrfs_bio_stripe stripes[]; > + struct btrfs_io_stripe stripes[]; > }; > > struct btrfs_device_info { > @@ -400,11 +401,11 @@ struct map_lookup { > int num_stripes; > int sub_stripes; > int verified_stripes; /* For mount time dev extent verification */ > - struct btrfs_bio_stripe stripes[]; > + struct btrfs_io_stripe stripes[]; > }; > > #define map_lookup_size(n) (sizeof(struct map_lookup) + \ > - (sizeof(struct btrfs_bio_stripe) * (n))) > + (sizeof(struct btrfs_io_stripe) * (n))) > > struct btrfs_balance_args; > struct btrfs_balance_progress; > @@ -441,14 +442,14 @@ static inline enum btrfs_map_op btrfs_op(struct bio *bio) > } > } > > -void btrfs_get_bbio(struct btrfs_bio *bbio); > -void btrfs_put_bbio(struct btrfs_bio *bbio); > +void btrfs_get_bioc(struct btrfs_io_context *bioc); > +void btrfs_put_bioc(struct btrfs_io_context *bioc); > int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, > u64 logical, u64 *length, > - struct btrfs_bio **bbio_ret, int mirror_num); > + struct btrfs_io_context **bioc_ret, int mirror_num); > int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, > u64 logical, u64 *length, > - struct btrfs_bio **bbio_ret); > + struct btrfs_io_context **bioc_ret); > int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *map, > enum btrfs_map_op op, u64 logical, > struct btrfs_io_geometry *io_geom); > diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c > index 28a06c2d80ad..759668f0569c 100644 > --- a/fs/btrfs/zoned.c > +++ b/fs/btrfs/zoned.c > @@ -1626,27 +1626,27 @@ int btrfs_zoned_issue_zeroout(struct btrfs_device *device, u64 physical, u64 len > static int read_zone_info(struct btrfs_fs_info *fs_info, u64 logical, > struct blk_zone *zone) > { > - struct btrfs_bio *bbio = NULL; > + struct btrfs_io_context *bioc= NULL; bioc = ... > u64 mapped_length = PAGE_SIZE; > unsigned int nofs_flag; > int nmirrors; > int i, ret; > > ret = btrfs_map_sblock(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical, > - &mapped_length, &bbio); > - if (ret || !bbio || mapped_length < PAGE_SIZE) { > - btrfs_put_bbio(bbio); > + &mapped_length, &bioc); > + if (ret || !bioc || mapped_length < PAGE_SIZE) { > + btrfs_put_bioc(bioc); > return -EIO; > } > > - if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) > + if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) > return -EINVAL; > > nofs_flag = memalloc_nofs_save(); > - nmirrors = (int)bbio->num_stripes; > + nmirrors = (int)bioc->num_stripes; > for (i = 0; i < nmirrors; i++) { > - u64 physical = bbio->stripes[i].physical; > - struct btrfs_device *dev = bbio->stripes[i].dev; > + u64 physical = bioc->stripes[i].physical; > + struct btrfs_device *dev = bioc->stripes[i].dev; > > /* Missing device */ > if (!dev->bdev) > -- > 2.33.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context 2021-09-14 16:42 ` David Sterba @ 2021-09-15 6:02 ` Qu Wenruo 0 siblings, 0 replies; 10+ messages in thread From: Qu Wenruo @ 2021-09-15 6:02 UTC (permalink / raw) To: dsterba, Qu Wenruo, linux-btrfs On 2021/9/15 上午12:42, David Sterba wrote: > On Tue, Sep 14, 2021 at 09:25:41AM +0800, Qu Wenruo wrote: >> The structure btrfs_bio is mostly used for stripe submission, and it its >> used by SINGLE/DUP/RAID1*/RAID10, while only parse stripe map layout for >> RAID56. >> >> Currently it's not always bind to a bio, and contains more info for IO >> context, thus renaming it will make the naming less confusing. >> >> Signed-off-by: Qu Wenruo <wqu@suse.com> [...] >> { >> - struct btrfs_bio *bbio = rbio->bbio; >> + struct btrfs_io_context *bioc= rbio->bioc; > > This looks like a systematic error with some replacement expression > missing the space before '=' All my bad. I get too used to "dw" of vim, which will also delete the space after the current word. I should use "de" instead... Thanks, Qu ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 2/3] btrfs: remove btrfs_bio_alloc() helper 2021-09-14 1:25 [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename Qu Wenruo 2021-09-14 1:25 ` [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context Qu Wenruo @ 2021-09-14 1:25 ` Qu Wenruo 2021-09-14 16:45 ` David Sterba 2021-09-14 1:25 ` [PATCH v2 3/3] btrfs: rename struct btrfs_io_bio to btrfs_bio Qu Wenruo 2021-09-14 16:25 ` [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename David Sterba 3 siblings, 1 reply; 10+ messages in thread From: Qu Wenruo @ 2021-09-14 1:25 UTC (permalink / raw) To: linux-btrfs The helper btrfs_bio_alloc() is almost the same as btrfs_io_bio_alloc(), except it's allocating using BIO_MAX_VECS as @nr_iovecs, and initialize bio->bi_iter.bi_sector. However the naming itself is not using "btrfs_io_bio" to indicate its parameter is "strcut btrfs_io_bio" and can be easily confused with "struct btrfs_bio". Considering assigned bio->bi_iter.bi_sector is such a simple work and there are already tons of call sites doing that manually, there is no need to do that in a helper. Remove btrfs_bio_alloc() helper, and enhance btrfs_io_bio_alloc() function to provide a fail-safe value for its @nr_iovecs. And then replace all btrfs_bio_alloc() callers with btrfs_io_bio_alloc(). Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/compression.c | 12 ++++++++---- fs/btrfs/extent_io.c | 30 ++++++++++++------------------ fs/btrfs/extent_io.h | 1 - 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 7869ad12bc6e..2475dc0b1c22 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -418,7 +418,8 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start, cb->orig_bio = NULL; cb->nr_pages = nr_pages; - bio = btrfs_bio_alloc(first_byte); + bio = btrfs_io_bio_alloc(0); + bio->bi_iter.bi_sector = first_byte >> SECTOR_SHIFT; bio->bi_opf = bio_op | write_flags; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; @@ -490,7 +491,8 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start, bio_endio(bio); } - bio = btrfs_bio_alloc(first_byte); + bio = btrfs_io_bio_alloc(0); + bio->bi_iter.bi_sector = first_byte >> SECTOR_SHIFT; bio->bi_opf = bio_op | write_flags; bio->bi_private = cb; bio->bi_end_io = end_compressed_bio_write; @@ -748,7 +750,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, /* include any pages we added in add_ra-bio_pages */ cb->len = bio->bi_iter.bi_size; - comp_bio = btrfs_bio_alloc(cur_disk_byte); + comp_bio = btrfs_io_bio_alloc(0); + comp_bio->bi_iter.bi_sector = cur_disk_byte >> SECTOR_SHIFT; comp_bio->bi_opf = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; @@ -806,7 +809,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, bio_endio(comp_bio); } - comp_bio = btrfs_bio_alloc(cur_disk_byte); + comp_bio = btrfs_io_bio_alloc(0); + comp_bio->bi_iter.bi_sector = cur_disk_byte >> SECTOR_SHIFT; comp_bio->bi_opf = REQ_OP_READ; comp_bio->bi_private = cb; comp_bio->bi_end_io = end_compressed_bio_read; diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 1aed03ef5f49..5ef7c506aee6 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3121,16 +3121,19 @@ static inline void btrfs_io_bio_init(struct btrfs_io_bio *btrfs_bio) } /* - * The following helpers allocate a bio. As it's backed by a bioset, it'll - * never fail. We're returning a bio right now but you can call btrfs_io_bio - * for the appropriate container_of magic + * Allocate a btrfs_io_bio, with @nr_iovecs as maxinum iovecs. + * + * If @nr_iovecs is 0, it will use BIO_MAX_VECS as @nr_iovces instead. + * This behavior is to provide a fail-safe default value. */ -struct bio *btrfs_bio_alloc(u64 first_byte) +struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs) { struct bio *bio; - bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_VECS, &btrfs_bioset); - bio->bi_iter.bi_sector = first_byte >> 9; + ASSERT(nr_iovecs <= BIO_MAX_VECS); + if (nr_iovecs == 0) + nr_iovecs = BIO_MAX_VECS; + bio = bio_alloc_bioset(GFP_NOFS, nr_iovecs, &btrfs_bioset); btrfs_io_bio_init(btrfs_io_bio(bio)); return bio; } @@ -3148,16 +3151,6 @@ struct bio *btrfs_bio_clone(struct bio *bio) return new; } -struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs) -{ - struct bio *bio; - - /* Bio allocation backed by a bioset does not fail */ - bio = bio_alloc_bioset(GFP_NOFS, nr_iovecs, &btrfs_bioset); - btrfs_io_bio_init(btrfs_io_bio(bio)); - return bio; -} - struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size) { struct bio *bio; @@ -3307,14 +3300,15 @@ static int alloc_new_bio(struct btrfs_inode *inode, struct bio *bio; int ret; + bio = btrfs_io_bio_alloc(0); /* * For compressed page range, its disk_bytenr is always @disk_bytenr * passed in, no matter if we have added any range into previous bio. */ if (bio_flags & EXTENT_BIO_COMPRESSED) - bio = btrfs_bio_alloc(disk_bytenr); + bio->bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT; else - bio = btrfs_bio_alloc(disk_bytenr + offset); + bio->bi_iter.bi_sector = (disk_bytenr + offset) >> SECTOR_SHIFT; bio_ctrl->bio = bio; bio_ctrl->bio_flags = bio_flags; bio->bi_end_io = end_io_func; diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index ba471f2063a7..81fa68eaa699 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -278,7 +278,6 @@ void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end); void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end, struct page *locked_page, u32 bits_to_clear, unsigned long page_ops); -struct bio *btrfs_bio_alloc(u64 first_byte); struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs); struct bio *btrfs_bio_clone(struct bio *bio); struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size); -- 2.33.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/3] btrfs: remove btrfs_bio_alloc() helper 2021-09-14 1:25 ` [PATCH v2 2/3] btrfs: remove btrfs_bio_alloc() helper Qu Wenruo @ 2021-09-14 16:45 ` David Sterba 0 siblings, 0 replies; 10+ messages in thread From: David Sterba @ 2021-09-14 16:45 UTC (permalink / raw) To: Qu Wenruo; +Cc: linux-btrfs On Tue, Sep 14, 2021 at 09:25:42AM +0800, Qu Wenruo wrote: > comp_bio->bi_end_io = end_compressed_bio_read; > diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c > index 1aed03ef5f49..5ef7c506aee6 100644 > --- a/fs/btrfs/extent_io.c > +++ b/fs/btrfs/extent_io.c > @@ -3121,16 +3121,19 @@ static inline void btrfs_io_bio_init(struct btrfs_io_bio *btrfs_bio) > } > > /* > - * The following helpers allocate a bio. As it's backed by a bioset, it'll > - * never fail. This note should stay, it's not obvious why we don't need to handle the allocation failure. > We're returning a bio right now but you can call btrfs_io_bio > - * for the appropriate container_of magic > + * Allocate a btrfs_io_bio, with @nr_iovecs as maxinum iovecs. maximum > + * > + * If @nr_iovecs is 0, it will use BIO_MAX_VECS as @nr_iovces instead. > + * This behavior is to provide a fail-safe default value. > */ > -struct bio *btrfs_bio_alloc(u64 first_byte) > +struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs) > { > struct bio *bio; > > - bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_VECS, &btrfs_bioset); > - bio->bi_iter.bi_sector = first_byte >> 9; > + ASSERT(nr_iovecs <= BIO_MAX_VECS); > + if (nr_iovecs == 0) > + nr_iovecs = BIO_MAX_VECS; > + bio = bio_alloc_bioset(GFP_NOFS, nr_iovecs, &btrfs_bioset); > btrfs_io_bio_init(btrfs_io_bio(bio)); > return bio; > } ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 3/3] btrfs: rename struct btrfs_io_bio to btrfs_bio 2021-09-14 1:25 [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename Qu Wenruo 2021-09-14 1:25 ` [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context Qu Wenruo 2021-09-14 1:25 ` [PATCH v2 2/3] btrfs: remove btrfs_bio_alloc() helper Qu Wenruo @ 2021-09-14 1:25 ` Qu Wenruo 2021-09-14 16:49 ` David Sterba 2021-09-14 16:25 ` [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename David Sterba 3 siblings, 1 reply; 10+ messages in thread From: Qu Wenruo @ 2021-09-14 1:25 UTC (permalink / raw) To: linux-btrfs Previously we have "struct btrfs_bio", which records IO context for stripe IO, and "strcut btrfs_io_bio", which records extra btrfs specific info for logical bytenr bio. With "strcut btrfs_bio" renamed to "struct btrfs_io_context", we are safe to rename "strcut btrfs_io_bio" to "strcut btrfs_bio" which is a more suitable name now. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/check-integrity.c | 2 +- fs/btrfs/compression.c | 16 +++++----- fs/btrfs/ctree.h | 3 +- fs/btrfs/disk-io.c | 2 +- fs/btrfs/disk-io.h | 2 +- fs/btrfs/extent_io.c | 64 +++++++++++++++++++------------------- fs/btrfs/extent_io.h | 2 +- fs/btrfs/file-item.c | 12 +++---- fs/btrfs/inode.c | 42 ++++++++++++------------- fs/btrfs/raid56.c | 8 ++--- fs/btrfs/scrub.c | 14 ++++----- fs/btrfs/volumes.c | 8 ++--- fs/btrfs/volumes.h | 29 +++++++++-------- 13 files changed, 102 insertions(+), 102 deletions(-) diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 81b11124b67a..ed646f2b46f4 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1561,7 +1561,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, struct bio *bio; unsigned int j; - bio = btrfs_io_bio_alloc(num_pages - i); + bio = btrfs_bio_alloc(num_pages - i); bio_set_dev(bio, block_ctx->dev->bdev); bio->bi_iter.bi_sector = dev_bytenr >> 9; bio->bi_opf = REQ_OP_READ; diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 2475dc0b1c22..a2dbdea899bc 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -179,9 +179,9 @@ static int check_compressed_csum(struct btrfs_inode *inode, struct bio *bio, if (memcmp(&csum, cb_sum, csum_size) != 0) { btrfs_print_data_csum_error(inode, disk_start, csum, cb_sum, cb->mirror_num); - if (btrfs_io_bio(bio)->device) + if (btrfs_bio(bio)->device) btrfs_dev_stat_inc_and_print( - btrfs_io_bio(bio)->device, + btrfs_bio(bio)->device, BTRFS_DEV_STAT_CORRUPTION_ERRS); return -EIO; } @@ -208,7 +208,7 @@ static void end_compressed_bio_read(struct bio *bio) struct inode *inode; struct page *page; unsigned int index; - unsigned int mirror = btrfs_io_bio(bio)->mirror_num; + unsigned int mirror = btrfs_bio(bio)->mirror_num; int ret = 0; if (bio->bi_status) @@ -224,7 +224,7 @@ static void end_compressed_bio_read(struct bio *bio) * Record the correct mirror_num in cb->orig_bio so that * read-repair can work properly. */ - btrfs_io_bio(cb->orig_bio)->mirror_num = mirror; + btrfs_bio(cb->orig_bio)->mirror_num = mirror; cb->mirror_num = mirror; /* @@ -418,7 +418,7 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start, cb->orig_bio = NULL; cb->nr_pages = nr_pages; - bio = btrfs_io_bio_alloc(0); + bio = btrfs_bio_alloc(0); bio->bi_iter.bi_sector = first_byte >> SECTOR_SHIFT; bio->bi_opf = bio_op | write_flags; bio->bi_private = cb; @@ -491,7 +491,7 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start, bio_endio(bio); } - bio = btrfs_io_bio_alloc(0); + bio = btrfs_bio_alloc(0); bio->bi_iter.bi_sector = first_byte >> SECTOR_SHIFT; bio->bi_opf = bio_op | write_flags; bio->bi_private = cb; @@ -750,7 +750,7 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, /* include any pages we added in add_ra-bio_pages */ cb->len = bio->bi_iter.bi_size; - comp_bio = btrfs_io_bio_alloc(0); + comp_bio = btrfs_bio_alloc(0); comp_bio->bi_iter.bi_sector = cur_disk_byte >> SECTOR_SHIFT; comp_bio->bi_opf = REQ_OP_READ; comp_bio->bi_private = cb; @@ -809,7 +809,7 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, bio_endio(comp_bio); } - comp_bio = btrfs_io_bio_alloc(0); + comp_bio = btrfs_bio_alloc(0); comp_bio->bi_iter.bi_sector = cur_disk_byte >> SECTOR_SHIFT; comp_bio->bi_opf = REQ_OP_READ; comp_bio->bi_private = cb; diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 38870ae46cbb..8c6ee947a68d 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -48,6 +48,7 @@ extern struct kmem_cache *btrfs_free_space_cachep; extern struct kmem_cache *btrfs_free_space_bitmap_cachep; struct btrfs_ordered_sum; struct btrfs_ref; +struct btrfs_bio; #define BTRFS_MAGIC 0x4D5F53665248425FULL /* ascii _BHRfS_M, no null */ @@ -3133,7 +3134,7 @@ u64 btrfs_file_extent_end(const struct btrfs_path *path); /* inode.c */ blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio, int mirror_num, unsigned long bio_flags); -unsigned int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset, +unsigned int btrfs_verify_data_csum(struct btrfs_bio *bbio, u32 bio_offset, struct page *page, u64 start, u64 end); struct extent_map *btrfs_get_extent_fiemap(struct btrfs_inode *inode, u64 start, u64 len); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 7d80e5b22d32..d294b28d5c63 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -683,7 +683,7 @@ static int validate_subpage_buffer(struct page *page, u64 start, u64 end, return ret; } -int btrfs_validate_metadata_buffer(struct btrfs_io_bio *io_bio, +int btrfs_validate_metadata_buffer(struct btrfs_bio *bbio, struct page *page, u64 start, u64 end, int mirror) { diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index 0e7e9526b6a8..1d3b749c405a 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h @@ -81,7 +81,7 @@ void btrfs_btree_balance_dirty(struct btrfs_fs_info *fs_info); void btrfs_btree_balance_dirty_nodelay(struct btrfs_fs_info *fs_info); void btrfs_drop_and_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root); -int btrfs_validate_metadata_buffer(struct btrfs_io_bio *io_bio, +int btrfs_validate_metadata_buffer(struct btrfs_bio *bbio, struct page *page, u64 start, u64 end, int mirror); blk_status_t btrfs_submit_metadata_bio(struct inode *inode, struct bio *bio, diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 5ef7c506aee6..4025897b1f86 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -241,7 +241,7 @@ int __init extent_io_init(void) return -ENOMEM; if (bioset_init(&btrfs_bioset, BIO_POOL_SIZE, - offsetof(struct btrfs_io_bio, bio), + offsetof(struct btrfs_bio, bio), BIOSET_NEED_BVECS)) goto free_buffer_cache; @@ -2299,7 +2299,7 @@ static int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, if (btrfs_is_zoned(fs_info)) return btrfs_repair_one_zone(fs_info, logical); - bio = btrfs_io_bio_alloc(1); + bio = btrfs_bio_alloc(1); bio->bi_iter.bi_size = 0; map_length = length; @@ -2618,10 +2618,10 @@ int btrfs_repair_one_sector(struct inode *inode, struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree; - struct btrfs_io_bio *failed_io_bio = btrfs_io_bio(failed_bio); + struct btrfs_bio *failed_bbio = btrfs_bio(failed_bio); const int icsum = bio_offset >> fs_info->sectorsize_bits; struct bio *repair_bio; - struct btrfs_io_bio *repair_io_bio; + struct btrfs_bio *repair_bbio; blk_status_t status; btrfs_debug(fs_info, @@ -2639,24 +2639,24 @@ int btrfs_repair_one_sector(struct inode *inode, return -EIO; } - repair_bio = btrfs_io_bio_alloc(1); - repair_io_bio = btrfs_io_bio(repair_bio); + repair_bio = btrfs_bio_alloc(1); + repair_bbio = btrfs_bio(repair_bio); repair_bio->bi_opf = REQ_OP_READ; repair_bio->bi_end_io = failed_bio->bi_end_io; repair_bio->bi_iter.bi_sector = failrec->logical >> 9; repair_bio->bi_private = failed_bio->bi_private; - if (failed_io_bio->csum) { + if (failed_bbio->csum) { const u32 csum_size = fs_info->csum_size; - repair_io_bio->csum = repair_io_bio->csum_inline; - memcpy(repair_io_bio->csum, - failed_io_bio->csum + csum_size * icsum, csum_size); + repair_bbio->csum = repair_bbio->csum_inline; + memcpy(repair_bbio->csum, + failed_bbio->csum + csum_size * icsum, csum_size); } bio_add_page(repair_bio, page, failrec->len, pgoff); - repair_io_bio->logical = failrec->start; - repair_io_bio->iter = repair_bio->bi_iter; + repair_bbio->logical = failrec->start; + repair_bbio->iter = repair_bio->bi_iter; btrfs_debug(btrfs_sb(inode->i_sb), "repair read error: submitting new read to mirror %d", @@ -2976,7 +2976,7 @@ static struct extent_buffer *find_extent_buffer_readpage( static void end_bio_extent_readpage(struct bio *bio) { struct bio_vec *bvec; - struct btrfs_io_bio *io_bio = btrfs_io_bio(bio); + struct btrfs_bio *bbio = btrfs_bio(bio); struct extent_io_tree *tree, *failure_tree; struct processed_extent processed = { 0 }; /* @@ -3003,7 +3003,7 @@ static void end_bio_extent_readpage(struct bio *bio) btrfs_debug(fs_info, "end_bio_extent_readpage: bi_sector=%llu, err=%d, mirror=%u", bio->bi_iter.bi_sector, bio->bi_status, - io_bio->mirror_num); + bbio->mirror_num); tree = &BTRFS_I(inode)->io_tree; failure_tree = &BTRFS_I(inode)->io_failure_tree; @@ -3028,14 +3028,14 @@ static void end_bio_extent_readpage(struct bio *bio) end = start + bvec->bv_len - 1; len = bvec->bv_len; - mirror = io_bio->mirror_num; + mirror = bbio->mirror_num; if (likely(uptodate)) { if (is_data_inode(inode)) { - error_bitmap = btrfs_verify_data_csum(io_bio, + error_bitmap = btrfs_verify_data_csum(bbio, bio_offset, page, start, end); ret = error_bitmap; } else { - ret = btrfs_validate_metadata_buffer(io_bio, + ret = btrfs_validate_metadata_buffer(bbio, page, start, end, mirror); } if (ret) @@ -3106,7 +3106,7 @@ static void end_bio_extent_readpage(struct bio *bio) } /* Release the last extent */ endio_readpage_release_extent(&processed, NULL, 0, 0, false); - btrfs_io_bio_free_csum(io_bio); + btrfs_bio_free_csum(bbio); bio_put(bio); } @@ -3115,9 +3115,9 @@ static void end_bio_extent_readpage(struct bio *bio) * new bio by bio_alloc_bioset as it does not initialize the bytes outside of * 'bio' because use of __GFP_ZERO is not supported. */ -static inline void btrfs_io_bio_init(struct btrfs_io_bio *btrfs_bio) +static inline void btrfs_bio_init(struct btrfs_bio *btrfs_bio) { - memset(btrfs_bio, 0, offsetof(struct btrfs_io_bio, bio)); + memset(btrfs_bio, 0, offsetof(struct btrfs_bio, bio)); } /* @@ -3126,7 +3126,7 @@ static inline void btrfs_io_bio_init(struct btrfs_io_bio *btrfs_bio) * If @nr_iovecs is 0, it will use BIO_MAX_VECS as @nr_iovces instead. * This behavior is to provide a fail-safe default value. */ -struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs) +struct bio *btrfs_bio_alloc(unsigned int nr_iovecs) { struct bio *bio; @@ -3134,27 +3134,27 @@ struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs) if (nr_iovecs == 0) nr_iovecs = BIO_MAX_VECS; bio = bio_alloc_bioset(GFP_NOFS, nr_iovecs, &btrfs_bioset); - btrfs_io_bio_init(btrfs_io_bio(bio)); + btrfs_bio_init(btrfs_bio(bio)); return bio; } struct bio *btrfs_bio_clone(struct bio *bio) { - struct btrfs_io_bio *btrfs_bio; + struct btrfs_bio *bbio; struct bio *new; /* Bio allocation backed by a bioset does not fail */ new = bio_clone_fast(bio, GFP_NOFS, &btrfs_bioset); - btrfs_bio = btrfs_io_bio(new); - btrfs_io_bio_init(btrfs_bio); - btrfs_bio->iter = bio->bi_iter; + bbio = btrfs_bio(new); + btrfs_bio_init(bbio); + bbio->iter = bio->bi_iter; return new; } struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size) { struct bio *bio; - struct btrfs_io_bio *btrfs_bio; + struct btrfs_bio *bbio; ASSERT(offset <= UINT_MAX && size <= UINT_MAX); @@ -3162,11 +3162,11 @@ struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size) bio = bio_clone_fast(orig, GFP_NOFS, &btrfs_bioset); ASSERT(bio); - btrfs_bio = btrfs_io_bio(bio); - btrfs_io_bio_init(btrfs_bio); + bbio = btrfs_bio(bio); + btrfs_bio_init(bbio); bio_trim(bio, offset >> 9, size >> 9); - btrfs_bio->iter = bio->bi_iter; + bbio->iter = bio->bi_iter; return bio; } @@ -3300,7 +3300,7 @@ static int alloc_new_bio(struct btrfs_inode *inode, struct bio *bio; int ret; - bio = btrfs_io_bio_alloc(0); + bio = btrfs_bio_alloc(0); /* * For compressed page range, its disk_bytenr is always @disk_bytenr * passed in, no matter if we have added any range into previous bio. @@ -3335,7 +3335,7 @@ static int alloc_new_bio(struct btrfs_inode *inode, goto error; } - btrfs_io_bio(bio)->device = device; + btrfs_bio(bio)->device = device; } return 0; error: diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 81fa68eaa699..a3ecfd4f37ac 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -278,7 +278,7 @@ void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end); void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end, struct page *locked_page, u32 bits_to_clear, unsigned long page_ops); -struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs); +struct bio *btrfs_bio_alloc(unsigned int nr_iovecs); struct bio *btrfs_bio_clone(struct bio *bio); struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size); diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 2673c6ba7a4e..47fe65921387 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -358,7 +358,7 @@ static int search_file_offset_in_bio(struct bio *bio, struct inode *inode, * @dst: Buffer of size nblocks * btrfs_super_csum_size() used to return * checksum (nblocks = bio->bi_iter.bi_size / fs_info->sectorsize). If * NULL, the checksum buffer is allocated and returned in - * btrfs_io_bio(bio)->csum instead. + * btrfs_bio(bio)->csum instead. * * Return: BLK_STS_RESOURCE if allocating memory fails, BLK_STS_OK otherwise. */ @@ -397,19 +397,19 @@ blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, u8 *dst return BLK_STS_RESOURCE; if (!dst) { - struct btrfs_io_bio *btrfs_bio = btrfs_io_bio(bio); + struct btrfs_bio *btrfs_bbio = btrfs_bio(bio); if (nblocks * csum_size > BTRFS_BIO_INLINE_CSUM_SIZE) { - btrfs_bio->csum = kmalloc_array(nblocks, csum_size, + btrfs_bbio->csum = kmalloc_array(nblocks, csum_size, GFP_NOFS); - if (!btrfs_bio->csum) { + if (!btrfs_bbio->csum) { btrfs_free_path(path); return BLK_STS_RESOURCE; } } else { - btrfs_bio->csum = btrfs_bio->csum_inline; + btrfs_bbio->csum = btrfs_bbio->csum_inline; } - csum = btrfs_bio->csum; + csum = btrfs_bbio->csum; } else { csum = dst; } diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a3ce50289888..a1f5cd993112 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3212,7 +3212,7 @@ void btrfs_writepage_endio_finish_ordered(struct btrfs_inode *inode, * * The length of such check is always one sector size. */ -static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio, +static int check_data_csum(struct inode *inode, struct btrfs_bio *bbio, u32 bio_offset, struct page *page, u32 pgoff, u64 start) { @@ -3228,7 +3228,7 @@ static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio, ASSERT(pgoff + len <= PAGE_SIZE); offset_sectors = bio_offset >> fs_info->sectorsize_bits; - csum_expected = ((u8 *)io_bio->csum) + offset_sectors * csum_size; + csum_expected = ((u8 *)bbio->csum) + offset_sectors * csum_size; kaddr = kmap_atomic(page); shash->tfm = fs_info->csum_shash; @@ -3242,9 +3242,9 @@ static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio, return 0; zeroit: btrfs_print_data_csum_error(BTRFS_I(inode), start, csum, csum_expected, - io_bio->mirror_num); - if (io_bio->device) - btrfs_dev_stat_inc_and_print(io_bio->device, + bbio->mirror_num); + if (bbio->device) + btrfs_dev_stat_inc_and_print(bbio->device, BTRFS_DEV_STAT_CORRUPTION_ERRS); memset(kaddr + pgoff, 1, len); flush_dcache_page(page); @@ -3264,7 +3264,7 @@ static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio, * Return a bitmap where bit set means a csum mismatch, and bit not set means * csum match. */ -unsigned int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset, +unsigned int btrfs_verify_data_csum(struct btrfs_bio *bbio, u32 bio_offset, struct page *page, u64 start, u64 end) { struct inode *inode = page->mapping->host; @@ -3283,14 +3283,14 @@ unsigned int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset, * For subpage case, above PageChecked is not safe as it's not subpage * compatible. * But for now only cow fixup and compressed read utilize PageChecked - * flag, while in this context we can easily use io_bio->csum to + * flag, while in this context we can easily use bbio->csum to * determine if we really need to do csum verification. * - * So for now, just exit if io_bio->csum is NULL, as it means it's + * So for now, just exit if bbio->csum is NULL, as it means it's * compressed read, and its compressed data csum has already been * verified. */ - if (io_bio->csum == NULL) + if (bbio->csum == NULL) return 0; if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) @@ -3317,7 +3317,7 @@ unsigned int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset, EXTENT_NODATASUM); continue; } - ret = check_data_csum(inode, io_bio, bio_offset, page, pg_off, + ret = check_data_csum(inode, bbio, bio_offset, page, pg_off, page_offset(page) + pg_off); if (ret < 0) { const int nr_bit = (pg_off - offset_in_page(start)) >> @@ -8077,7 +8077,7 @@ static blk_status_t submit_dio_repair_bio(struct inode *inode, struct bio *bio, } static blk_status_t btrfs_check_read_dio_bio(struct inode *inode, - struct btrfs_io_bio *io_bio, + struct btrfs_bio *bbio, const bool uptodate) { struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; @@ -8087,11 +8087,11 @@ static blk_status_t btrfs_check_read_dio_bio(struct inode *inode, const bool csum = !(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM); struct bio_vec bvec; struct bvec_iter iter; - u64 start = io_bio->logical; + u64 start = bbio->logical; u32 bio_offset = 0; blk_status_t err = BLK_STS_OK; - __bio_for_each_segment(bvec, &io_bio->bio, iter, io_bio->iter) { + __bio_for_each_segment(bvec, &bbio->bio, iter, bbio->iter) { unsigned int i, nr_sectors, pgoff; nr_sectors = BTRFS_BYTES_TO_BLKS(fs_info, bvec.bv_len); @@ -8099,7 +8099,7 @@ static blk_status_t btrfs_check_read_dio_bio(struct inode *inode, for (i = 0; i < nr_sectors; i++) { ASSERT(pgoff < PAGE_SIZE); if (uptodate && - (!csum || !check_data_csum(inode, io_bio, + (!csum || !check_data_csum(inode, bbio, bio_offset, bvec.bv_page, pgoff, start))) { clean_io_failure(fs_info, failure_tree, io_tree, @@ -8109,12 +8109,12 @@ static blk_status_t btrfs_check_read_dio_bio(struct inode *inode, } else { int ret; - ASSERT((start - io_bio->logical) < UINT_MAX); + ASSERT((start - bbio->logical) < UINT_MAX); ret = btrfs_repair_one_sector(inode, - &io_bio->bio, - start - io_bio->logical, + &bbio->bio, + start - bbio->logical, bvec.bv_page, pgoff, - start, io_bio->mirror_num, + start, bbio->mirror_num, submit_dio_repair_bio); if (ret) err = errno_to_blk_status(ret); @@ -8156,7 +8156,7 @@ static void btrfs_end_dio_bio(struct bio *bio) bio->bi_iter.bi_size, err); if (bio_op(bio) == REQ_OP_READ) { - err = btrfs_check_read_dio_bio(dip->inode, btrfs_io_bio(bio), + err = btrfs_check_read_dio_bio(dip->inode, btrfs_bio(bio), !err); } @@ -8208,7 +8208,7 @@ static inline blk_status_t btrfs_submit_dio_bio(struct bio *bio, csum_offset = file_offset - dip->logical_offset; csum_offset >>= fs_info->sectorsize_bits; csum_offset *= fs_info->csum_size; - btrfs_io_bio(bio)->csum = dip->csums + csum_offset; + btrfs_bio(bio)->csum = dip->csums + csum_offset; } map: ret = btrfs_map_bio(fs_info, bio, 0); @@ -8323,7 +8323,7 @@ static blk_qc_t btrfs_submit_direct(struct inode *inode, struct iomap *iomap, bio = btrfs_bio_clone_partial(dio_bio, clone_offset, clone_len); bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio; - btrfs_io_bio(bio)->logical = file_offset; + btrfs_bio(bio)->logical = file_offset; if (bio_op(bio) == REQ_OP_ZONE_APPEND) { status = extract_ordered_extent(BTRFS_I(inode), bio, diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 386de5a59900..c0a7e846777a 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -1105,8 +1105,8 @@ static int rbio_add_io_page(struct btrfs_raid_bio *rbio, } /* put a new bio on the list */ - bio = btrfs_io_bio_alloc(bio_max_len >> PAGE_SHIFT ?: 1); - btrfs_io_bio(bio)->device = stripe->dev; + bio = btrfs_bio_alloc(bio_max_len >> PAGE_SHIFT ?: 1); + btrfs_bio(bio)->device = stripe->dev; bio->bi_iter.bi_size = 0; bio_set_dev(bio, stripe->dev->bdev); bio->bi_iter.bi_sector = disk_start >> 9; @@ -1159,7 +1159,7 @@ static void index_rbio_pages(struct btrfs_raid_bio *rbio) page_index = stripe_offset >> PAGE_SHIFT; if (bio_flagged(bio, BIO_CLONED)) - bio->bi_iter = btrfs_io_bio(bio)->iter; + bio->bi_iter = btrfs_bio(bio)->iter; bio_for_each_segment(bvec, bio, iter) { rbio->bio_pages[page_index + i] = bvec.bv_page; @@ -2125,7 +2125,7 @@ int raid56_parity_recover(struct btrfs_fs_info *fs_info, struct bio *bio, if (generic_io) { ASSERT(bioc->mirror_num == mirror_num); - btrfs_io_bio(bio)->mirror_num = mirror_num; + btrfs_bio(bio)->mirror_num = mirror_num; } rbio = alloc_rbio(fs_info, bioc, stripe_len); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index d83ccec89aa7..4e89b6f0c262 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1423,7 +1423,7 @@ static void scrub_recheck_block_on_raid56(struct btrfs_fs_info *fs_info, if (!first_page->dev->bdev) goto out; - bio = btrfs_io_bio_alloc(BIO_MAX_VECS); + bio = btrfs_bio_alloc(BIO_MAX_VECS); bio_set_dev(bio, first_page->dev->bdev); for (page_num = 0; page_num < sblock->page_count; page_num++) { @@ -1480,7 +1480,7 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, } WARN_ON(!spage->page); - bio = btrfs_io_bio_alloc(1); + bio = btrfs_bio_alloc(1); bio_set_dev(bio, spage->dev->bdev); bio_add_page(bio, spage->page, fs_info->sectorsize, 0); @@ -1562,7 +1562,7 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, return -EIO; } - bio = btrfs_io_bio_alloc(1); + bio = btrfs_bio_alloc(1); bio_set_dev(bio, spage_bad->dev->bdev); bio->bi_iter.bi_sector = spage_bad->physical >> 9; bio->bi_opf = REQ_OP_WRITE; @@ -1676,7 +1676,7 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx, sbio->dev = sctx->wr_tgtdev; bio = sbio->bio; if (!bio) { - bio = btrfs_io_bio_alloc(sctx->pages_per_wr_bio); + bio = btrfs_bio_alloc(sctx->pages_per_wr_bio); sbio->bio = bio; } @@ -2102,7 +2102,7 @@ static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx, sbio->dev = spage->dev; bio = sbio->bio; if (!bio) { - bio = btrfs_io_bio_alloc(sctx->pages_per_rd_bio); + bio = btrfs_bio_alloc(sctx->pages_per_rd_bio); sbio->bio = bio; } @@ -2226,7 +2226,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) goto bioc_out; } - bio = btrfs_io_bio_alloc(0); + bio = btrfs_bio_alloc(0); bio->bi_iter.bi_sector = logical >> 9; bio->bi_private = sblock; bio->bi_end_io = scrub_missing_raid56_end_io; @@ -2842,7 +2842,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity) if (ret || !bioc || !bioc->raid_map) goto bioc_out; - bio = btrfs_io_bio_alloc(0); + bio = btrfs_bio_alloc(0); bio->bi_iter.bi_sector = sparity->logic_start >> 9; bio->bi_private = sparity; bio->bi_end_io = scrub_parity_bio_endio; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 0cb1d5bad09d..3c0f20a8dfec 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -6561,7 +6561,7 @@ static void btrfs_end_bio(struct bio *bio) atomic_inc(&bioc->error); if (bio->bi_status == BLK_STS_IOERR || bio->bi_status == BLK_STS_TARGET) { - struct btrfs_device *dev = btrfs_io_bio(bio)->device; + struct btrfs_device *dev = btrfs_bio(bio)->device; ASSERT(dev->bdev); if (btrfs_op(bio) == BTRFS_MAP_WRITE) @@ -6587,7 +6587,7 @@ static void btrfs_end_bio(struct bio *bio) bio = bioc->orig_bio; } - btrfs_io_bio(bio)->mirror_num = bioc->mirror_num; + btrfs_bio(bio)->mirror_num = bioc->mirror_num; /* only send an error to the higher layers if it is * beyond the tolerance of the btrfs bio */ @@ -6613,7 +6613,7 @@ static void submit_stripe_bio(struct btrfs_io_context *bioc, struct bio *bio, struct btrfs_fs_info *fs_info = bioc->fs_info; bio->bi_private = bioc; - btrfs_io_bio(bio)->device = dev; + btrfs_bio(bio)->device = dev; bio->bi_end_io = btrfs_end_bio; bio->bi_iter.bi_sector = physical >> 9; /* @@ -6649,7 +6649,7 @@ static void bioc_error(struct btrfs_io_context *bioc, struct bio *bio, u64 logic /* Should be the original bio. */ WARN_ON(bio != bioc->orig_bio); - btrfs_io_bio(bio)->mirror_num = bioc->mirror_num; + btrfs_bio(bio)->mirror_num = bioc->mirror_num; bio->bi_iter.bi_sector = logical >> 9; if (atomic_read(&bioc->error) > bioc->max_errors) bio->bi_status = BLK_STS_IOERR; diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 1e3bbdf7be94..8d2478daf4c3 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -304,38 +304,37 @@ struct btrfs_fs_devices { / sizeof(struct btrfs_stripe) + 1) /* - * we need the mirror number and stripe index to be passed around - * the call chain while we are processing end_io (especially errors). - * Really, what we need is a btrfs_io_context structure that has this info - * and is properly sized with its stripe array, but we're not there - * quite yet. We have our own btrfs bioset, and all of the bios - * we allocate are actually btrfs_io_bios. We'll cram as much of - * struct btrfs_io_context as we can into this over time. + * Extra info to pass along bio. + * + * Mostly for btrfs specific feature like csum and mirror_num. */ -struct btrfs_io_bio { +struct btrfs_bio { unsigned int mirror_num; + + /* @device is for stripe IO submission. */ struct btrfs_device *device; u64 logical; u8 *csum; u8 csum_inline[BTRFS_BIO_INLINE_CSUM_SIZE]; struct bvec_iter iter; + /* * This member must come last, bio_alloc_bioset will allocate enough - * bytes for entire btrfs_io_bio but relies on bio being last. + * bytes for entire btrfs_bio but relies on bio being last. */ struct bio bio; }; -static inline struct btrfs_io_bio *btrfs_io_bio(struct bio *bio) +static inline struct btrfs_bio *btrfs_bio(struct bio *bio) { - return container_of(bio, struct btrfs_io_bio, bio); + return container_of(bio, struct btrfs_bio, bio); } -static inline void btrfs_io_bio_free_csum(struct btrfs_io_bio *io_bio) +static inline void btrfs_bio_free_csum(struct btrfs_bio *bbio) { - if (io_bio->csum != io_bio->csum_inline) { - kfree(io_bio->csum); - io_bio->csum = NULL; + if (bbio->csum != bbio->csum_inline) { + kfree(bbio->csum); + bbio->csum = NULL; } } -- 2.33.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 3/3] btrfs: rename struct btrfs_io_bio to btrfs_bio 2021-09-14 1:25 ` [PATCH v2 3/3] btrfs: rename struct btrfs_io_bio to btrfs_bio Qu Wenruo @ 2021-09-14 16:49 ` David Sterba 0 siblings, 0 replies; 10+ messages in thread From: David Sterba @ 2021-09-14 16:49 UTC (permalink / raw) To: Qu Wenruo; +Cc: linux-btrfs On Tue, Sep 14, 2021 at 09:25:43AM +0800, Qu Wenruo wrote: > --- a/fs/btrfs/scrub.c > +++ b/fs/btrfs/scrub.c > @@ -1423,7 +1423,7 @@ static void scrub_recheck_block_on_raid56(struct btrfs_fs_info *fs_info, > if (!first_page->dev->bdev) > goto out; > > - bio = btrfs_io_bio_alloc(BIO_MAX_VECS); > + bio = btrfs_bio_alloc(BIO_MAX_VECS); As BIO_MAX_VECS is the default value, this should take 0 so it's consistent with the rest. > bio_set_dev(bio, first_page->dev->bdev); > > for (page_num = 0; page_num < sblock->page_count; page_num++) { ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename 2021-09-14 1:25 [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename Qu Wenruo ` (2 preceding siblings ...) 2021-09-14 1:25 ` [PATCH v2 3/3] btrfs: rename struct btrfs_io_bio to btrfs_bio Qu Wenruo @ 2021-09-14 16:25 ` David Sterba 2021-09-14 22:20 ` Qu Wenruo 3 siblings, 1 reply; 10+ messages in thread From: David Sterba @ 2021-09-14 16:25 UTC (permalink / raw) To: Qu Wenruo; +Cc: linux-btrfs On Tue, Sep 14, 2021 at 09:25:40AM +0800, Qu Wenruo wrote: > The branch can be fetched from github, and is the preferred way to grab > the code, as this patchset changed quite a lot of code. > https://github.com/adam900710/linux/tree/chunk_refactor > > There are two structure, btrfs_io_bio and btrfs_bio, which have very > similar names but completely different meanings. > > Btrfs_io_bio mostly works at logical bytenr layer (its > bio->bi_iter.bi_sector points to btrfs logical bytenr), and just > contains extra info like csum and mirror_num. > > And btrfs_io_bio is in fact the most utilized bio, as all data/metadata > IO is using btrfs_io_bio. > > While btrfs_bio is completely a helper structure for stripe IO > submission (RAID56 doesn't utilize it for IO submission). > > Such naming is completely anti-human. > > So this patchset will do the following renaming: > > - btrfs_bio -> btrfs_io_context > Since it's not really used by all bios (only mirrored profiles utilize > it), and it contains extra info for RAID56, it's not proper to name it > with _bio suffix. > > Later we can integrate btrfs_io_context pointer into the new > btrfs_bio. > > - btrfs_io_bio -> btrfs_bio > I originally plan to rename it to btrfs_logical_bio, but it's a little > too long for a lot of functions. This sounds all good. The only dangerous thing is that btrfs_bio now means something else, so that can become problem with backports or requiring to do a mental switch when reading before/after the version it appears. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename 2021-09-14 16:25 ` [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename David Sterba @ 2021-09-14 22:20 ` Qu Wenruo 0 siblings, 0 replies; 10+ messages in thread From: Qu Wenruo @ 2021-09-14 22:20 UTC (permalink / raw) To: dsterba, Qu Wenruo, linux-btrfs On 2021/9/15 上午12:25, David Sterba wrote: > On Tue, Sep 14, 2021 at 09:25:40AM +0800, Qu Wenruo wrote: >> The branch can be fetched from github, and is the preferred way to grab >> the code, as this patchset changed quite a lot of code. >> https://github.com/adam900710/linux/tree/chunk_refactor >> >> There are two structure, btrfs_io_bio and btrfs_bio, which have very >> similar names but completely different meanings. >> >> Btrfs_io_bio mostly works at logical bytenr layer (its >> bio->bi_iter.bi_sector points to btrfs logical bytenr), and just >> contains extra info like csum and mirror_num. >> >> And btrfs_io_bio is in fact the most utilized bio, as all data/metadata >> IO is using btrfs_io_bio. >> >> While btrfs_bio is completely a helper structure for stripe IO >> submission (RAID56 doesn't utilize it for IO submission). >> >> Such naming is completely anti-human. >> >> So this patchset will do the following renaming: >> >> - btrfs_bio -> btrfs_io_context >> Since it's not really used by all bios (only mirrored profiles utilize >> it), and it contains extra info for RAID56, it's not proper to name it >> with _bio suffix. >> >> Later we can integrate btrfs_io_context pointer into the new >> btrfs_bio. >> >> - btrfs_io_bio -> btrfs_bio >> I originally plan to rename it to btrfs_logical_bio, but it's a little >> too long for a lot of functions. > > This sounds all good. The only dangerous thing is that btrfs_bio now > means something else, so that can become problem with backports or > requiring to do a mental switch when reading before/after the version it > appears. > So the original idea of btrfs_io_bio->btrfs_logical_bio would be better in this particular case, right? Thanks, Qu ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2021-09-15 6:02 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-09-14 1:25 [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename Qu Wenruo 2021-09-14 1:25 ` [PATCH v2 1/3] btrfs: rename btrfs_bio to btrfs_io_context Qu Wenruo 2021-09-14 16:42 ` David Sterba 2021-09-15 6:02 ` Qu Wenruo 2021-09-14 1:25 ` [PATCH v2 2/3] btrfs: remove btrfs_bio_alloc() helper Qu Wenruo 2021-09-14 16:45 ` David Sterba 2021-09-14 1:25 ` [PATCH v2 3/3] btrfs: rename struct btrfs_io_bio to btrfs_bio Qu Wenruo 2021-09-14 16:49 ` David Sterba 2021-09-14 16:25 ` [PATCH v2 0/3] btrfs: btrfs_bio and btrfs_io_bio rename David Sterba 2021-09-14 22:20 ` Qu Wenruo
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.