Lines Matching refs:bioc

5855 static void sort_parity_stripes(struct btrfs_io_context *bioc, int num_stripes)  in sort_parity_stripes()  argument
5864 if (bioc->raid_map[i] > bioc->raid_map[i + 1]) { in sort_parity_stripes()
5865 swap(bioc->stripes[i], bioc->stripes[i + 1]); in sort_parity_stripes()
5866 swap(bioc->raid_map[i], bioc->raid_map[i + 1]); in sort_parity_stripes()
5877 struct btrfs_io_context *bioc = kzalloc( in alloc_btrfs_io_context() local
5891 atomic_set(&bioc->error, 0); in alloc_btrfs_io_context()
5892 refcount_set(&bioc->refs, 1); in alloc_btrfs_io_context()
5894 bioc->fs_info = fs_info; in alloc_btrfs_io_context()
5895 bioc->tgtdev_map = (int *)(bioc->stripes + total_stripes); in alloc_btrfs_io_context()
5896 bioc->raid_map = (u64 *)(bioc->tgtdev_map + real_stripes); in alloc_btrfs_io_context()
5898 return bioc; in alloc_btrfs_io_context()
5901 void btrfs_get_bioc(struct btrfs_io_context *bioc) in btrfs_get_bioc() argument
5903 WARN_ON(!refcount_read(&bioc->refs)); in btrfs_get_bioc()
5904 refcount_inc(&bioc->refs); in btrfs_get_bioc()
5907 void btrfs_put_bioc(struct btrfs_io_context *bioc) in btrfs_put_bioc() argument
5909 if (!bioc) in btrfs_put_bioc()
5911 if (refcount_dec_and_test(&bioc->refs)) in btrfs_put_bioc()
5912 kfree(bioc); in btrfs_put_bioc()
5926 struct btrfs_io_context *bioc; in __btrfs_map_block_for_discard() local
6009 bioc = alloc_btrfs_io_context(fs_info, num_stripes, 0); in __btrfs_map_block_for_discard()
6010 if (!bioc) { in __btrfs_map_block_for_discard()
6016 bioc->stripes[i].physical = in __btrfs_map_block_for_discard()
6019 bioc->stripes[i].dev = map->stripes[stripe_index].dev; in __btrfs_map_block_for_discard()
6023 bioc->stripes[i].length = stripes_per_dev * in __btrfs_map_block_for_discard()
6027 bioc->stripes[i].length += map->stripe_len; in __btrfs_map_block_for_discard()
6038 bioc->stripes[i].length -= stripe_offset; in __btrfs_map_block_for_discard()
6043 bioc->stripes[i].length -= stripe_end_offset; in __btrfs_map_block_for_discard()
6048 bioc->stripes[i].length = length; in __btrfs_map_block_for_discard()
6058 *bioc_ret = bioc; in __btrfs_map_block_for_discard()
6059 bioc->map_type = map->type; in __btrfs_map_block_for_discard()
6060 bioc->num_stripes = num_stripes; in __btrfs_map_block_for_discard()
6084 struct btrfs_io_context *bioc = NULL; in get_extra_mirror_from_replace() local
6093 logical, &length, &bioc, 0, 0); in get_extra_mirror_from_replace()
6095 ASSERT(bioc == NULL); in get_extra_mirror_from_replace()
6099 num_stripes = bioc->num_stripes; in get_extra_mirror_from_replace()
6106 btrfs_put_bioc(bioc); in get_extra_mirror_from_replace()
6116 if (bioc->stripes[i].dev->devid != srcdev_devid) in get_extra_mirror_from_replace()
6124 physical_of_found <= bioc->stripes[i].physical) in get_extra_mirror_from_replace()
6129 physical_of_found = bioc->stripes[i].physical; in get_extra_mirror_from_replace()
6132 btrfs_put_bioc(bioc); in get_extra_mirror_from_replace()
6168 struct btrfs_io_context *bioc = *bioc_ret; in handle_ops_on_dev_replace() local
6198 if (bioc->stripes[i].dev->devid == srcdev_devid) { in handle_ops_on_dev_replace()
6201 bioc->stripes + index_where_to_add; in handle_ops_on_dev_replace()
6203 bioc->stripes + i; in handle_ops_on_dev_replace()
6208 bioc->tgtdev_map[i] = index_where_to_add; in handle_ops_on_dev_replace()
6228 if (bioc->stripes[i].dev->devid == srcdev_devid) { in handle_ops_on_dev_replace()
6235 physical_of_found <= bioc->stripes[i].physical) in handle_ops_on_dev_replace()
6239 physical_of_found = bioc->stripes[i].physical; in handle_ops_on_dev_replace()
6244 bioc->stripes + num_stripes; in handle_ops_on_dev_replace()
6248 bioc->stripes[index_srcdev].length; in handle_ops_on_dev_replace()
6250 bioc->tgtdev_map[index_srcdev] = num_stripes; in handle_ops_on_dev_replace()
6259 bioc->num_tgtdevs = tgtdev_indexes; in handle_ops_on_dev_replace()
6260 *bioc_ret = bioc; in handle_ops_on_dev_replace()
6378 struct btrfs_io_context *bioc = NULL; in __btrfs_map_block() local
6531 bioc = alloc_btrfs_io_context(fs_info, num_alloc_stripes, tgtdev_indexes); in __btrfs_map_block()
6532 if (!bioc) { in __btrfs_map_block()
6538 bioc->stripes[i].physical = map->stripes[stripe_index].physical + in __btrfs_map_block()
6540 bioc->stripes[i].dev = map->stripes[stripe_index].dev; in __btrfs_map_block()
6556 bioc->raid_map[(i + rot) % num_stripes] = in __btrfs_map_block()
6559 bioc->raid_map[(i + rot) % map->num_stripes] = RAID5_P_STRIPE; in __btrfs_map_block()
6561 bioc->raid_map[(i + rot + 1) % num_stripes] = in __btrfs_map_block()
6564 sort_parity_stripes(bioc, num_stripes); in __btrfs_map_block()
6572 handle_ops_on_dev_replace(op, &bioc, dev_replace, logical, in __btrfs_map_block()
6576 *bioc_ret = bioc; in __btrfs_map_block()
6577 bioc->map_type = map->type; in __btrfs_map_block()
6578 bioc->num_stripes = num_stripes; in __btrfs_map_block()
6579 bioc->max_errors = max_errors; in __btrfs_map_block()
6580 bioc->mirror_num = mirror_num; in __btrfs_map_block()
6589 bioc->stripes[0].dev = dev_replace->tgtdev; in __btrfs_map_block()
6590 bioc->stripes[0].physical = physical_to_patch_in_first_stripe; in __btrfs_map_block()
6591 bioc->mirror_num = map->num_stripes + 1; in __btrfs_map_block()
6623 static inline void btrfs_end_bioc(struct btrfs_io_context *bioc, struct bio *bio) in btrfs_end_bioc() argument
6625 bio->bi_private = bioc->private; in btrfs_end_bioc()
6626 bio->bi_end_io = bioc->end_io; in btrfs_end_bioc()
6629 btrfs_put_bioc(bioc); in btrfs_end_bioc()
6634 struct btrfs_io_context *bioc = bio->bi_private; in btrfs_end_bio() local
6638 atomic_inc(&bioc->error); in btrfs_end_bio()
6656 if (bio == bioc->orig_bio) in btrfs_end_bio()
6659 btrfs_bio_counter_dec(bioc->fs_info); in btrfs_end_bio()
6661 if (atomic_dec_and_test(&bioc->stripes_pending)) { in btrfs_end_bio()
6664 bio = bioc->orig_bio; in btrfs_end_bio()
6667 btrfs_bio(bio)->mirror_num = bioc->mirror_num; in btrfs_end_bio()
6671 if (atomic_read(&bioc->error) > bioc->max_errors) { in btrfs_end_bio()
6681 btrfs_end_bioc(bioc, bio); in btrfs_end_bio()
6687 static void submit_stripe_bio(struct btrfs_io_context *bioc, struct bio *bio, in submit_stripe_bio() argument
6690 struct btrfs_fs_info *fs_info = bioc->fs_info; in submit_stripe_bio()
6692 bio->bi_private = bioc; in submit_stripe_bio()
6722 static void bioc_error(struct btrfs_io_context *bioc, struct bio *bio, u64 logical) in bioc_error() argument
6724 atomic_inc(&bioc->error); in bioc_error()
6725 if (atomic_dec_and_test(&bioc->stripes_pending)) { in bioc_error()
6727 WARN_ON(bio != bioc->orig_bio); in bioc_error()
6729 btrfs_bio(bio)->mirror_num = bioc->mirror_num; in bioc_error()
6731 if (atomic_read(&bioc->error) > bioc->max_errors) in bioc_error()
6735 btrfs_end_bioc(bioc, bio); in bioc_error()
6750 struct btrfs_io_context *bioc = NULL; in btrfs_map_bio() local
6757 &map_length, &bioc, mirror_num, 1); in btrfs_map_bio()
6763 total_devs = bioc->num_stripes; in btrfs_map_bio()
6764 bioc->orig_bio = first_bio; in btrfs_map_bio()
6765 bioc->private = first_bio->bi_private; in btrfs_map_bio()
6766 bioc->end_io = first_bio->bi_end_io; in btrfs_map_bio()
6767 atomic_set(&bioc->stripes_pending, bioc->num_stripes); in btrfs_map_bio()
6769 if ((bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) && in btrfs_map_bio()
6774 ret = raid56_parity_write(bio, bioc, map_length); in btrfs_map_bio()
6776 ret = raid56_parity_recover(bio, bioc, map_length, in btrfs_map_bio()
6792 dev = bioc->stripes[dev_nr].dev; in btrfs_map_bio()
6797 bioc_error(bioc, first_bio, logical); in btrfs_map_bio()
6806 submit_stripe_bio(bioc, bio, bioc->stripes[dev_nr].physical, dev); in btrfs_map_bio()