Lines Matching refs:ios

124 static u8 *_ios_cred(struct ore_io_state *ios, unsigned index)  in _ios_cred()  argument
126 return ios->oc->comps[index & ios->oc->single_comp].cred; in _ios_cred()
129 static struct osd_obj_id *_ios_obj(struct ore_io_state *ios, unsigned index) in _ios_obj() argument
131 return &ios->oc->comps[index & ios->oc->single_comp].obj; in _ios_obj()
134 static struct osd_dev *_ios_od(struct ore_io_state *ios, unsigned index) in _ios_od() argument
137 ios->oc->first_dev, ios->oc->numdevs, index, in _ios_od()
138 ios->oc->ods); in _ios_od()
140 return ore_comp_dev(ios->oc, index); in _ios_od()
148 struct ore_io_state *ios; in _ore_get_io_state() local
174 if (numdevs > (INT_MAX - sizeof(*ios)) / in _ore_get_io_state()
177 size_ios = sizeof(*ios) + sizeof(struct ore_per_dev_state) * numdevs; in _ore_get_io_state()
189 ios = kzalloc(size_total, GFP_KERNEL); in _ore_get_io_state()
190 if (unlikely(!ios)) { in _ore_get_io_state()
195 ios_extra = (char *)ios + size_ios; in _ore_get_io_state()
197 ios = kzalloc(size_ios, GFP_KERNEL); in _ore_get_io_state()
198 if (unlikely(!ios)) { in _ore_get_io_state()
208 kfree(ios); in _ore_get_io_state()
216 ios->extra_part_alloc = true; in _ore_get_io_state()
220 ios->parity_pages = ios_extra; in _ore_get_io_state()
221 ios->max_par_pages = num_par_pages; in _ore_get_io_state()
228 ios->per_dev[d].sglist = sgilist; in _ore_get_io_state()
231 ios->sgs_per_dev = sgs_per_dev; in _ore_get_io_state()
234 ios->layout = layout; in _ore_get_io_state()
235 ios->oc = oc; in _ore_get_io_state()
236 *pios = ios; in _ore_get_io_state()
260 struct ore_io_state *ios; in ore_get_rw_state() local
301 ios = *pios; in ore_get_rw_state()
302 ios->reading = is_reading; in ore_get_rw_state()
303 ios->offset = offset; in ore_get_rw_state()
306 ore_calc_stripe_info(layout, offset, length, &ios->si); in ore_get_rw_state()
307 ios->length = ios->si.length; in ore_get_rw_state()
308 ios->nr_pages = ((ios->offset & (PAGE_SIZE - 1)) + in ore_get_rw_state()
309 ios->length + PAGE_SIZE - 1) / PAGE_SIZE; in ore_get_rw_state()
311 _ore_post_alloc_raid_stuff(ios); in ore_get_rw_state()
332 void ore_put_io_state(struct ore_io_state *ios) in ore_put_io_state() argument
334 if (ios) { in ore_put_io_state()
337 for (i = 0; i < ios->numdevs; i++) { in ore_put_io_state()
338 struct ore_per_dev_state *per_dev = &ios->per_dev[i]; in ore_put_io_state()
346 _ore_free_raid_stuff(ios); in ore_put_io_state()
347 kfree(ios); in ore_put_io_state()
352 static void _sync_done(struct ore_io_state *ios, void *p) in _sync_done() argument
361 struct ore_io_state *ios = container_of( in _last_io() local
364 ios->done(ios, ios->private); in _last_io()
369 struct ore_io_state *ios = p; in _done_io() local
371 kref_put(&ios->kref, _last_io); in _done_io()
374 int ore_io_execute(struct ore_io_state *ios) in ore_io_execute() argument
377 bool sync = (ios->done == NULL); in ore_io_execute()
381 ios->done = _sync_done; in ore_io_execute()
382 ios->private = &wait; in ore_io_execute()
385 for (i = 0; i < ios->numdevs; i++) { in ore_io_execute()
386 struct osd_request *or = ios->per_dev[i].or; in ore_io_execute()
390 ret = osd_finalize_request(or, 0, _ios_cred(ios, i), NULL); in ore_io_execute()
398 kref_init(&ios->kref); in ore_io_execute()
400 for (i = 0; i < ios->numdevs; i++) { in ore_io_execute()
401 struct osd_request *or = ios->per_dev[i].or; in ore_io_execute()
405 kref_get(&ios->kref); in ore_io_execute()
406 osd_execute_request_async(or, _done_io, ios); in ore_io_execute()
409 kref_put(&ios->kref, _last_io); in ore_io_execute()
414 ret = ore_check_io(ios, NULL); in ore_io_execute()
434 int ore_check_io(struct ore_io_state *ios, ore_on_dev_error on_dev_error) in ore_check_io() argument
440 for (i = 0; i < ios->numdevs; i++) { in ore_check_io()
442 struct ore_per_dev_state *per_dev = &ios->per_dev[i]; in ore_check_io()
469 u64 residual = ios->reading ? in ore_check_io()
471 u64 offset = (ios->offset + ios->length) - residual; in ore_check_io()
472 unsigned dev = per_dev->dev - ios->oc->first_dev; in ore_check_io()
473 struct ore_dev *od = ios->oc->ods[dev]; in ore_check_io()
475 on_dev_error(ios, od, dev, osi.osd_err_pri, in ore_check_io()
607 int _ore_add_stripe_unit(struct ore_io_state *ios, unsigned *cur_pg, in _ore_add_stripe_unit() argument
613 osd_request_queue(_ios_od(ios, per_dev->dev)); in _ore_add_stripe_unit()
620 if (!ios->reading) { in _ore_add_stripe_unit()
621 bio_size = ios->si.maxdevUnits; in _ore_add_stripe_unit()
623 bio_size = (ios->si.maxdevUnits + 1) * in _ore_add_stripe_unit()
624 (ios->layout->group_width - ios->layout->parity) / in _ore_add_stripe_unit()
625 ios->layout->group_width; in _ore_add_stripe_unit()
627 bio_size *= (ios->layout->stripe_unit / PAGE_SIZE); in _ore_add_stripe_unit()
656 _add_stripe_page(ios->sp2d, &ios->si, pages[pg]); in _ore_add_stripe_unit()
674 static int _add_parity_units(struct ore_io_state *ios, in _add_parity_units() argument
683 for (do_parity = ios->layout->parity; do_parity; --do_parity) { in _add_parity_units()
686 per_dev = &ios->per_dev[dev - first_dev]; in _add_parity_units()
696 ret = _ore_add_parity_unit(ios, si, per_dev, cur_len, in _add_parity_units()
704 ios->layout->group_width; in _add_parity_units()
711 static int _prepare_for_striping(struct ore_io_state *ios) in _prepare_for_striping() argument
713 struct ore_striping_info *si = &ios->si; in _prepare_for_striping()
714 unsigned stripe_unit = ios->layout->stripe_unit; in _prepare_for_striping()
715 unsigned mirrors_p1 = ios->layout->mirrors_p1; in _prepare_for_striping()
716 unsigned group_width = ios->layout->group_width; in _prepare_for_striping()
720 unsigned cur_pg = ios->pages_consumed; in _prepare_for_striping()
721 u64 length = ios->length; in _prepare_for_striping()
724 if (!ios->pages) { in _prepare_for_striping()
725 ios->numdevs = ios->layout->mirrors_p1; in _prepare_for_striping()
733 &ios->per_dev[dev - first_dev]; in _prepare_for_striping()
744 BUG_ON(page_off && (page_off != ios->pgbase)); in _prepare_for_striping()
755 ret = _ore_add_stripe_unit(ios, &cur_pg, page_off, ios->pages, in _prepare_for_striping()
764 if (unlikely((dev == si->par_dev) || (!length && ios->sp2d))) { in _prepare_for_striping()
765 if (!length && ios->sp2d) { in _prepare_for_striping()
771 si->cur_comp = group_width - ios->layout->parity; in _prepare_for_striping()
777 ret = _add_parity_units(ios, si, dev, first_dev, in _prepare_for_striping()
779 ios->sp2d ? length : cur_len); in _prepare_for_striping()
785 ios->layout->parity * mirrors_p1) % in _prepare_for_striping()
795 ios->numdevs = devs_in_group; in _prepare_for_striping()
796 ios->pages_consumed = cur_pg; in _prepare_for_striping()
800 int ore_create(struct ore_io_state *ios) in ore_create() argument
804 for (i = 0; i < ios->oc->numdevs; i++) { in ore_create()
807 or = osd_start_request(_ios_od(ios, i)); in ore_create()
813 ios->per_dev[i].or = or; in ore_create()
814 ios->numdevs++; in ore_create()
816 osd_req_create_object(or, _ios_obj(ios, i)); in ore_create()
818 ret = ore_io_execute(ios); in ore_create()
825 int ore_remove(struct ore_io_state *ios) in ore_remove() argument
829 for (i = 0; i < ios->oc->numdevs; i++) { in ore_remove()
832 or = osd_start_request(_ios_od(ios, i)); in ore_remove()
838 ios->per_dev[i].or = or; in ore_remove()
839 ios->numdevs++; in ore_remove()
841 osd_req_remove_object(or, _ios_obj(ios, i)); in ore_remove()
843 ret = ore_io_execute(ios); in ore_remove()
850 static int _write_mirror(struct ore_io_state *ios, int cur_comp) in _write_mirror() argument
852 struct ore_per_dev_state *master_dev = &ios->per_dev[cur_comp]; in _write_mirror()
853 unsigned dev = ios->per_dev[cur_comp].dev; in _write_mirror()
854 unsigned last_comp = cur_comp + ios->layout->mirrors_p1; in _write_mirror()
857 if (ios->pages && !master_dev->length) in _write_mirror()
861 struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; in _write_mirror()
864 or = osd_start_request(_ios_od(ios, dev)); in _write_mirror()
872 if (ios->pages) { in _write_mirror()
898 osd_req_write(or, _ios_obj(ios, cur_comp), in _write_mirror()
902 _LLU(_ios_obj(ios, cur_comp)->id), in _write_mirror()
905 } else if (ios->kern_buff) { in _write_mirror()
906 per_dev->offset = ios->si.obj_offset; in _write_mirror()
907 per_dev->dev = ios->si.dev + dev; in _write_mirror()
910 BUG_ON((ios->layout->group_width > 1) && in _write_mirror()
911 (ios->si.unit_off + ios->length > in _write_mirror()
912 ios->layout->stripe_unit)); in _write_mirror()
914 ret = osd_req_write_kern(or, _ios_obj(ios, cur_comp), in _write_mirror()
916 ios->kern_buff, ios->length); in _write_mirror()
921 _LLU(_ios_obj(ios, cur_comp)->id), in _write_mirror()
923 _LLU(ios->length), per_dev->dev); in _write_mirror()
925 osd_req_set_attributes(or, _ios_obj(ios, cur_comp)); in _write_mirror()
927 _LLU(_ios_obj(ios, cur_comp)->id), in _write_mirror()
928 ios->out_attr_len, dev); in _write_mirror()
931 if (ios->out_attr) in _write_mirror()
932 osd_req_add_set_attr_list(or, ios->out_attr, in _write_mirror()
933 ios->out_attr_len); in _write_mirror()
935 if (ios->in_attr) in _write_mirror()
936 osd_req_add_get_attr_list(or, ios->in_attr, in _write_mirror()
937 ios->in_attr_len); in _write_mirror()
944 int ore_write(struct ore_io_state *ios) in ore_write() argument
949 if (unlikely(ios->sp2d && !ios->r4w)) { in ore_write()
957 ret = _prepare_for_striping(ios); in ore_write()
961 for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { in ore_write()
962 ret = _write_mirror(ios, i); in ore_write()
967 ret = ore_io_execute(ios); in ore_write()
972 int _ore_read_mirror(struct ore_io_state *ios, unsigned cur_comp) in _ore_read_mirror() argument
975 struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; in _ore_read_mirror()
976 struct osd_obj_id *obj = _ios_obj(ios, cur_comp); in _ore_read_mirror()
979 if (ios->pages && !per_dev->length) in _ore_read_mirror()
982 first_dev = per_dev->dev + first_dev % ios->layout->mirrors_p1; in _ore_read_mirror()
983 or = osd_start_request(_ios_od(ios, first_dev)); in _ore_read_mirror()
990 if (ios->pages) { in _ore_read_mirror()
1010 BUG_ON(ios->kern_buff); in _ore_read_mirror()
1015 ios->in_attr_len, first_dev); in _ore_read_mirror()
1017 if (ios->out_attr) in _ore_read_mirror()
1018 osd_req_add_set_attr_list(or, ios->out_attr, ios->out_attr_len); in _ore_read_mirror()
1020 if (ios->in_attr) in _ore_read_mirror()
1021 osd_req_add_get_attr_list(or, ios->in_attr, ios->in_attr_len); in _ore_read_mirror()
1026 int ore_read(struct ore_io_state *ios) in ore_read() argument
1031 ret = _prepare_for_striping(ios); in ore_read()
1035 for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { in ore_read()
1036 ret = _ore_read_mirror(ios, i); in ore_read()
1041 ret = ore_io_execute(ios); in ore_read()
1046 int extract_attr_from_ios(struct ore_io_state *ios, struct osd_attr *attr) in extract_attr_from_ios() argument
1054 osd_req_decode_get_attr_list(ios->per_dev[0].or, in extract_attr_from_ios()
1068 static int _truncate_mirrors(struct ore_io_state *ios, unsigned cur_comp, in _truncate_mirrors() argument
1071 int last_comp = cur_comp + ios->layout->mirrors_p1; in _truncate_mirrors()
1074 struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; in _truncate_mirrors()
1077 or = osd_start_request(_ios_od(ios, cur_comp)); in _truncate_mirrors()
1084 osd_req_set_attributes(or, _ios_obj(ios, cur_comp)); in _truncate_mirrors()
1117 struct ore_io_state *ios; in ore_truncate() local
1125 ret = ore_get_io_state(layout, oc, &ios); in ore_truncate()
1129 _calc_trunk_info(ios->layout, size, &ti); in ore_truncate()
1131 size_attrs = kcalloc(ios->oc->numdevs, sizeof(*size_attrs), in ore_truncate()
1138 ios->numdevs = ios->oc->numdevs; in ore_truncate()
1140 for (i = 0; i < ios->numdevs; ++i) { in ore_truncate()
1150 ios->layout->stripe_unit - ti.si.unit_off; in ore_truncate()
1162 ret = _truncate_mirrors(ios, i * ios->layout->mirrors_p1, in ore_truncate()
1167 ret = ore_io_execute(ios); in ore_truncate()
1171 ore_put_io_state(ios); in ore_truncate()