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
152 struct ore_io_state ios; in _ore_get_io_state() member
170 ios = &_aios->ios; in _ore_get_io_state()
173 struct ore_io_state ios; in _ore_get_io_state() member
202 ios = &_aio_small->ios; in _ore_get_io_state()
203 ios->extra_part_alloc = true; in _ore_get_io_state()
207 ios->parity_pages = pages; in _ore_get_io_state()
208 ios->max_par_pages = num_par_pages; in _ore_get_io_state()
214 ios->per_dev[d].sglist = sgilist; in _ore_get_io_state()
217 ios->sgs_per_dev = sgs_per_dev; in _ore_get_io_state()
220 ios->layout = layout; in _ore_get_io_state()
221 ios->oc = oc; in _ore_get_io_state()
222 *pios = ios; in _ore_get_io_state()
246 struct ore_io_state *ios; in ore_get_rw_state() local
287 ios = *pios; in ore_get_rw_state()
288 ios->reading = is_reading; in ore_get_rw_state()
289 ios->offset = offset; in ore_get_rw_state()
292 ore_calc_stripe_info(layout, offset, length, &ios->si); in ore_get_rw_state()
293 ios->length = ios->si.length; in ore_get_rw_state()
294 ios->nr_pages = ((ios->offset & (PAGE_SIZE - 1)) + in ore_get_rw_state()
295 ios->length + PAGE_SIZE - 1) / PAGE_SIZE; in ore_get_rw_state()
297 _ore_post_alloc_raid_stuff(ios); in ore_get_rw_state()
318 void ore_put_io_state(struct ore_io_state *ios) in ore_put_io_state() argument
320 if (ios) { in ore_put_io_state()
323 for (i = 0; i < ios->numdevs; i++) { in ore_put_io_state()
324 struct ore_per_dev_state *per_dev = &ios->per_dev[i]; in ore_put_io_state()
332 _ore_free_raid_stuff(ios); in ore_put_io_state()
333 kfree(ios); in ore_put_io_state()
338 static void _sync_done(struct ore_io_state *ios, void *p) in _sync_done() argument
347 struct ore_io_state *ios = container_of( in _last_io() local
350 ios->done(ios, ios->private); in _last_io()
355 struct ore_io_state *ios = p; in _done_io() local
357 kref_put(&ios->kref, _last_io); in _done_io()
360 int ore_io_execute(struct ore_io_state *ios) in ore_io_execute() argument
363 bool sync = (ios->done == NULL); in ore_io_execute()
367 ios->done = _sync_done; in ore_io_execute()
368 ios->private = &wait; in ore_io_execute()
371 for (i = 0; i < ios->numdevs; i++) { in ore_io_execute()
372 struct osd_request *or = ios->per_dev[i].or; in ore_io_execute()
376 ret = osd_finalize_request(or, 0, _ios_cred(ios, i), NULL); in ore_io_execute()
384 kref_init(&ios->kref); in ore_io_execute()
386 for (i = 0; i < ios->numdevs; i++) { in ore_io_execute()
387 struct osd_request *or = ios->per_dev[i].or; in ore_io_execute()
391 kref_get(&ios->kref); in ore_io_execute()
392 osd_execute_request_async(or, _done_io, ios); in ore_io_execute()
395 kref_put(&ios->kref, _last_io); in ore_io_execute()
400 ret = ore_check_io(ios, NULL); in ore_io_execute()
420 int ore_check_io(struct ore_io_state *ios, ore_on_dev_error on_dev_error) in ore_check_io() argument
426 for (i = 0; i < ios->numdevs; i++) { in ore_check_io()
428 struct ore_per_dev_state *per_dev = &ios->per_dev[i]; in ore_check_io()
455 u64 residual = ios->reading ? in ore_check_io()
457 u64 offset = (ios->offset + ios->length) - residual; in ore_check_io()
458 unsigned dev = per_dev->dev - ios->oc->first_dev; in ore_check_io()
459 struct ore_dev *od = ios->oc->ods[dev]; in ore_check_io()
461 on_dev_error(ios, od, dev, osi.osd_err_pri, in ore_check_io()
593 int _ore_add_stripe_unit(struct ore_io_state *ios, unsigned *cur_pg, in _ore_add_stripe_unit() argument
599 osd_request_queue(_ios_od(ios, per_dev->dev)); in _ore_add_stripe_unit()
606 if (!ios->reading) { in _ore_add_stripe_unit()
607 bio_size = ios->si.maxdevUnits; in _ore_add_stripe_unit()
609 bio_size = (ios->si.maxdevUnits + 1) * in _ore_add_stripe_unit()
610 (ios->layout->group_width - ios->layout->parity) / in _ore_add_stripe_unit()
611 ios->layout->group_width; in _ore_add_stripe_unit()
613 bio_size *= (ios->layout->stripe_unit / PAGE_SIZE); in _ore_add_stripe_unit()
642 _add_stripe_page(ios->sp2d, &ios->si, pages[pg]); in _ore_add_stripe_unit()
660 static int _add_parity_units(struct ore_io_state *ios, in _add_parity_units() argument
669 for (do_parity = ios->layout->parity; do_parity; --do_parity) { in _add_parity_units()
672 per_dev = &ios->per_dev[dev - first_dev]; in _add_parity_units()
682 ret = _ore_add_parity_unit(ios, si, per_dev, cur_len, in _add_parity_units()
690 ios->layout->group_width; in _add_parity_units()
697 static int _prepare_for_striping(struct ore_io_state *ios) in _prepare_for_striping() argument
699 struct ore_striping_info *si = &ios->si; in _prepare_for_striping()
700 unsigned stripe_unit = ios->layout->stripe_unit; in _prepare_for_striping()
701 unsigned mirrors_p1 = ios->layout->mirrors_p1; in _prepare_for_striping()
702 unsigned group_width = ios->layout->group_width; in _prepare_for_striping()
706 unsigned cur_pg = ios->pages_consumed; in _prepare_for_striping()
707 u64 length = ios->length; in _prepare_for_striping()
710 if (!ios->pages) { in _prepare_for_striping()
711 ios->numdevs = ios->layout->mirrors_p1; in _prepare_for_striping()
719 &ios->per_dev[dev - first_dev]; in _prepare_for_striping()
730 BUG_ON(page_off && (page_off != ios->pgbase)); in _prepare_for_striping()
741 ret = _ore_add_stripe_unit(ios, &cur_pg, page_off, ios->pages, in _prepare_for_striping()
750 if (unlikely((dev == si->par_dev) || (!length && ios->sp2d))) { in _prepare_for_striping()
751 if (!length && ios->sp2d) { in _prepare_for_striping()
757 si->cur_comp = group_width - ios->layout->parity; in _prepare_for_striping()
763 ret = _add_parity_units(ios, si, dev, first_dev, in _prepare_for_striping()
765 ios->sp2d ? length : cur_len); in _prepare_for_striping()
771 ios->layout->parity * mirrors_p1) % in _prepare_for_striping()
781 ios->numdevs = devs_in_group; in _prepare_for_striping()
782 ios->pages_consumed = cur_pg; in _prepare_for_striping()
786 int ore_create(struct ore_io_state *ios) in ore_create() argument
790 for (i = 0; i < ios->oc->numdevs; i++) { in ore_create()
793 or = osd_start_request(_ios_od(ios, i), GFP_KERNEL); in ore_create()
799 ios->per_dev[i].or = or; in ore_create()
800 ios->numdevs++; in ore_create()
802 osd_req_create_object(or, _ios_obj(ios, i)); in ore_create()
804 ret = ore_io_execute(ios); in ore_create()
811 int ore_remove(struct ore_io_state *ios) in ore_remove() argument
815 for (i = 0; i < ios->oc->numdevs; i++) { in ore_remove()
818 or = osd_start_request(_ios_od(ios, i), GFP_KERNEL); in ore_remove()
824 ios->per_dev[i].or = or; in ore_remove()
825 ios->numdevs++; in ore_remove()
827 osd_req_remove_object(or, _ios_obj(ios, i)); in ore_remove()
829 ret = ore_io_execute(ios); in ore_remove()
836 static int _write_mirror(struct ore_io_state *ios, int cur_comp) in _write_mirror() argument
838 struct ore_per_dev_state *master_dev = &ios->per_dev[cur_comp]; in _write_mirror()
839 unsigned dev = ios->per_dev[cur_comp].dev; in _write_mirror()
840 unsigned last_comp = cur_comp + ios->layout->mirrors_p1; in _write_mirror()
843 if (ios->pages && !master_dev->length) in _write_mirror()
847 struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; in _write_mirror()
850 or = osd_start_request(_ios_od(ios, dev), GFP_KERNEL); in _write_mirror()
858 if (ios->pages) { in _write_mirror()
884 osd_req_write(or, _ios_obj(ios, cur_comp), in _write_mirror()
888 _LLU(_ios_obj(ios, cur_comp)->id), in _write_mirror()
891 } else if (ios->kern_buff) { in _write_mirror()
892 per_dev->offset = ios->si.obj_offset; in _write_mirror()
893 per_dev->dev = ios->si.dev + dev; in _write_mirror()
896 BUG_ON((ios->layout->group_width > 1) && in _write_mirror()
897 (ios->si.unit_off + ios->length > in _write_mirror()
898 ios->layout->stripe_unit)); in _write_mirror()
900 ret = osd_req_write_kern(or, _ios_obj(ios, cur_comp), in _write_mirror()
902 ios->kern_buff, ios->length); in _write_mirror()
907 _LLU(_ios_obj(ios, cur_comp)->id), in _write_mirror()
909 _LLU(ios->length), per_dev->dev); in _write_mirror()
911 osd_req_set_attributes(or, _ios_obj(ios, cur_comp)); in _write_mirror()
913 _LLU(_ios_obj(ios, cur_comp)->id), in _write_mirror()
914 ios->out_attr_len, dev); in _write_mirror()
917 if (ios->out_attr) in _write_mirror()
918 osd_req_add_set_attr_list(or, ios->out_attr, in _write_mirror()
919 ios->out_attr_len); in _write_mirror()
921 if (ios->in_attr) in _write_mirror()
922 osd_req_add_get_attr_list(or, ios->in_attr, in _write_mirror()
923 ios->in_attr_len); in _write_mirror()
930 int ore_write(struct ore_io_state *ios) in ore_write() argument
935 if (unlikely(ios->sp2d && !ios->r4w)) { in ore_write()
943 ret = _prepare_for_striping(ios); in ore_write()
947 for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { in ore_write()
948 ret = _write_mirror(ios, i); in ore_write()
953 ret = ore_io_execute(ios); in ore_write()
958 int _ore_read_mirror(struct ore_io_state *ios, unsigned cur_comp) in _ore_read_mirror() argument
961 struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; in _ore_read_mirror()
962 struct osd_obj_id *obj = _ios_obj(ios, cur_comp); in _ore_read_mirror()
965 if (ios->pages && !per_dev->length) in _ore_read_mirror()
968 first_dev = per_dev->dev + first_dev % ios->layout->mirrors_p1; in _ore_read_mirror()
969 or = osd_start_request(_ios_od(ios, first_dev), GFP_KERNEL); in _ore_read_mirror()
976 if (ios->pages) { in _ore_read_mirror()
996 BUG_ON(ios->kern_buff); in _ore_read_mirror()
1001 ios->in_attr_len, first_dev); in _ore_read_mirror()
1003 if (ios->out_attr) in _ore_read_mirror()
1004 osd_req_add_set_attr_list(or, ios->out_attr, ios->out_attr_len); in _ore_read_mirror()
1006 if (ios->in_attr) in _ore_read_mirror()
1007 osd_req_add_get_attr_list(or, ios->in_attr, ios->in_attr_len); in _ore_read_mirror()
1012 int ore_read(struct ore_io_state *ios) in ore_read() argument
1017 ret = _prepare_for_striping(ios); in ore_read()
1021 for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { in ore_read()
1022 ret = _ore_read_mirror(ios, i); in ore_read()
1027 ret = ore_io_execute(ios); in ore_read()
1032 int extract_attr_from_ios(struct ore_io_state *ios, struct osd_attr *attr) in extract_attr_from_ios() argument
1040 osd_req_decode_get_attr_list(ios->per_dev[0].or, in extract_attr_from_ios()
1054 static int _truncate_mirrors(struct ore_io_state *ios, unsigned cur_comp, in _truncate_mirrors() argument
1057 int last_comp = cur_comp + ios->layout->mirrors_p1; in _truncate_mirrors()
1060 struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; in _truncate_mirrors()
1063 or = osd_start_request(_ios_od(ios, cur_comp), GFP_KERNEL); in _truncate_mirrors()
1070 osd_req_set_attributes(or, _ios_obj(ios, cur_comp)); in _truncate_mirrors()
1103 struct ore_io_state *ios; in ore_truncate() local
1111 ret = ore_get_io_state(layout, oc, &ios); in ore_truncate()
1115 _calc_trunk_info(ios->layout, size, &ti); in ore_truncate()
1117 size_attrs = kcalloc(ios->oc->numdevs, sizeof(*size_attrs), in ore_truncate()
1124 ios->numdevs = ios->oc->numdevs; in ore_truncate()
1126 for (i = 0; i < ios->numdevs; ++i) { in ore_truncate()
1136 ios->layout->stripe_unit - ti.si.unit_off; in ore_truncate()
1148 ret = _truncate_mirrors(ios, i * ios->layout->mirrors_p1, in ore_truncate()
1153 ret = ore_io_execute(ios); in ore_truncate()
1157 ore_put_io_state(ios); in ore_truncate()