Lines Matching refs:bbio
5575 static void sort_parity_stripes(struct btrfs_bio *bbio, int num_stripes) in sort_parity_stripes() argument
5584 if (bbio->raid_map[i] > bbio->raid_map[i + 1]) { in sort_parity_stripes()
5585 swap(bbio->stripes[i], bbio->stripes[i + 1]); in sort_parity_stripes()
5586 swap(bbio->raid_map[i], bbio->raid_map[i + 1]); in sort_parity_stripes()
5595 struct btrfs_bio *bbio = kzalloc( in alloc_btrfs_bio() local
5609 atomic_set(&bbio->error, 0); in alloc_btrfs_bio()
5610 refcount_set(&bbio->refs, 1); in alloc_btrfs_bio()
5612 bbio->tgtdev_map = (int *)(bbio->stripes + total_stripes); in alloc_btrfs_bio()
5613 bbio->raid_map = (u64 *)(bbio->tgtdev_map + real_stripes); in alloc_btrfs_bio()
5615 return bbio; in alloc_btrfs_bio()
5618 void btrfs_get_bbio(struct btrfs_bio *bbio) in btrfs_get_bbio() argument
5620 WARN_ON(!refcount_read(&bbio->refs)); in btrfs_get_bbio()
5621 refcount_inc(&bbio->refs); in btrfs_get_bbio()
5624 void btrfs_put_bbio(struct btrfs_bio *bbio) in btrfs_put_bbio() argument
5626 if (!bbio) in btrfs_put_bbio()
5628 if (refcount_dec_and_test(&bbio->refs)) in btrfs_put_bbio()
5629 kfree(bbio); in btrfs_put_bbio()
5643 struct btrfs_bio *bbio; in __btrfs_map_block_for_discard() local
5726 bbio = alloc_btrfs_bio(num_stripes, 0); in __btrfs_map_block_for_discard()
5727 if (!bbio) { in __btrfs_map_block_for_discard()
5733 bbio->stripes[i].physical = in __btrfs_map_block_for_discard()
5736 bbio->stripes[i].dev = map->stripes[stripe_index].dev; in __btrfs_map_block_for_discard()
5740 bbio->stripes[i].length = stripes_per_dev * in __btrfs_map_block_for_discard()
5744 bbio->stripes[i].length += in __btrfs_map_block_for_discard()
5756 bbio->stripes[i].length -= in __btrfs_map_block_for_discard()
5762 bbio->stripes[i].length -= in __btrfs_map_block_for_discard()
5768 bbio->stripes[i].length = length; in __btrfs_map_block_for_discard()
5778 *bbio_ret = bbio; in __btrfs_map_block_for_discard()
5779 bbio->map_type = map->type; in __btrfs_map_block_for_discard()
5780 bbio->num_stripes = num_stripes; in __btrfs_map_block_for_discard()
5804 struct btrfs_bio *bbio = NULL; in get_extra_mirror_from_replace() local
5813 logical, &length, &bbio, 0, 0); in get_extra_mirror_from_replace()
5815 ASSERT(bbio == NULL); in get_extra_mirror_from_replace()
5819 num_stripes = bbio->num_stripes; in get_extra_mirror_from_replace()
5826 btrfs_put_bbio(bbio); in get_extra_mirror_from_replace()
5836 if (bbio->stripes[i].dev->devid != srcdev_devid) in get_extra_mirror_from_replace()
5844 physical_of_found <= bbio->stripes[i].physical) in get_extra_mirror_from_replace()
5849 physical_of_found = bbio->stripes[i].physical; in get_extra_mirror_from_replace()
5852 btrfs_put_bbio(bbio); in get_extra_mirror_from_replace()
5868 struct btrfs_bio *bbio = *bbio_ret; in handle_ops_on_dev_replace() local
5891 if (bbio->stripes[i].dev->devid == srcdev_devid) { in handle_ops_on_dev_replace()
5894 bbio->stripes + index_where_to_add; in handle_ops_on_dev_replace()
5896 bbio->stripes + i; in handle_ops_on_dev_replace()
5901 bbio->tgtdev_map[i] = index_where_to_add; in handle_ops_on_dev_replace()
5921 if (bbio->stripes[i].dev->devid == srcdev_devid) { in handle_ops_on_dev_replace()
5929 bbio->stripes[i].physical) in handle_ops_on_dev_replace()
5933 physical_of_found = bbio->stripes[i].physical; in handle_ops_on_dev_replace()
5938 bbio->stripes + num_stripes; in handle_ops_on_dev_replace()
5942 bbio->stripes[index_srcdev].length; in handle_ops_on_dev_replace()
5944 bbio->tgtdev_map[index_srcdev] = num_stripes; in handle_ops_on_dev_replace()
5953 bbio->num_tgtdevs = tgtdev_indexes; in handle_ops_on_dev_replace()
5954 *bbio_ret = bbio; in handle_ops_on_dev_replace()
6080 struct btrfs_bio *bbio = NULL; in __btrfs_map_block() local
6232 bbio = alloc_btrfs_bio(num_alloc_stripes, tgtdev_indexes); in __btrfs_map_block()
6233 if (!bbio) { in __btrfs_map_block()
6239 bbio->stripes[i].physical = map->stripes[stripe_index].physical + in __btrfs_map_block()
6241 bbio->stripes[i].dev = map->stripes[stripe_index].dev; in __btrfs_map_block()
6257 bbio->raid_map[(i+rot) % num_stripes] = in __btrfs_map_block()
6260 bbio->raid_map[(i+rot) % map->num_stripes] = RAID5_P_STRIPE; in __btrfs_map_block()
6262 bbio->raid_map[(i+rot+1) % num_stripes] = in __btrfs_map_block()
6265 sort_parity_stripes(bbio, num_stripes); in __btrfs_map_block()
6273 handle_ops_on_dev_replace(op, &bbio, dev_replace, &num_stripes, in __btrfs_map_block()
6277 *bbio_ret = bbio; in __btrfs_map_block()
6278 bbio->map_type = map->type; in __btrfs_map_block()
6279 bbio->num_stripes = num_stripes; in __btrfs_map_block()
6280 bbio->max_errors = max_errors; in __btrfs_map_block()
6281 bbio->mirror_num = mirror_num; in __btrfs_map_block()
6290 bbio->stripes[0].dev = dev_replace->tgtdev; in __btrfs_map_block()
6291 bbio->stripes[0].physical = physical_to_patch_in_first_stripe; in __btrfs_map_block()
6292 bbio->mirror_num = map->num_stripes + 1; in __btrfs_map_block()
6324 static inline void btrfs_end_bbio(struct btrfs_bio *bbio, struct bio *bio) in btrfs_end_bbio() argument
6326 bio->bi_private = bbio->private; in btrfs_end_bbio()
6327 bio->bi_end_io = bbio->end_io; in btrfs_end_bbio()
6330 btrfs_put_bbio(bbio); in btrfs_end_bbio()
6335 struct btrfs_bio *bbio = bio->bi_private; in btrfs_end_bio() local
6339 atomic_inc(&bbio->error); in btrfs_end_bio()
6357 if (bio == bbio->orig_bio) in btrfs_end_bio()
6360 btrfs_bio_counter_dec(bbio->fs_info); in btrfs_end_bio()
6362 if (atomic_dec_and_test(&bbio->stripes_pending)) { in btrfs_end_bio()
6365 bio = bbio->orig_bio; in btrfs_end_bio()
6368 btrfs_io_bio(bio)->mirror_num = bbio->mirror_num; in btrfs_end_bio()
6372 if (atomic_read(&bbio->error) > bbio->max_errors) { in btrfs_end_bio()
6382 btrfs_end_bbio(bbio, bio); in btrfs_end_bio()
6388 static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio, in submit_stripe_bio() argument
6391 struct btrfs_fs_info *fs_info = bbio->fs_info; in submit_stripe_bio()
6393 bio->bi_private = bbio; in submit_stripe_bio()
6409 static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical) in bbio_error() argument
6411 atomic_inc(&bbio->error); in bbio_error()
6412 if (atomic_dec_and_test(&bbio->stripes_pending)) { in bbio_error()
6414 WARN_ON(bio != bbio->orig_bio); in bbio_error()
6416 btrfs_io_bio(bio)->mirror_num = bbio->mirror_num; in bbio_error()
6418 if (atomic_read(&bbio->error) > bbio->max_errors) in bbio_error()
6422 btrfs_end_bbio(bbio, bio); in bbio_error()
6437 struct btrfs_bio *bbio = NULL; in btrfs_map_bio() local
6444 &map_length, &bbio, mirror_num, 1); in btrfs_map_bio()
6450 total_devs = bbio->num_stripes; in btrfs_map_bio()
6451 bbio->orig_bio = first_bio; in btrfs_map_bio()
6452 bbio->private = first_bio->bi_private; in btrfs_map_bio()
6453 bbio->end_io = first_bio->bi_end_io; in btrfs_map_bio()
6454 bbio->fs_info = fs_info; in btrfs_map_bio()
6455 atomic_set(&bbio->stripes_pending, bbio->num_stripes); in btrfs_map_bio()
6457 if ((bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && in btrfs_map_bio()
6462 ret = raid56_parity_write(fs_info, bio, bbio, in btrfs_map_bio()
6465 ret = raid56_parity_recover(fs_info, bio, bbio, in btrfs_map_bio()
6481 dev = bbio->stripes[dev_nr].dev; in btrfs_map_bio()
6486 bbio_error(bbio, first_bio, logical); in btrfs_map_bio()
6495 submit_stripe_bio(bbio, bio, bbio->stripes[dev_nr].physical, dev); in btrfs_map_bio()