H A D | lov_io.c | 59 static void lov_io_sub_fini(const struct lu_env *env, struct lov_io *lio, lov_io_sub_fini() argument 68 lio->lis_active_subios--; lov_io_sub_fini() 70 if (sub->sub_stripe == lio->lis_single_subio_index) lov_io_sub_fini() 71 lio->lis_single_subio_index = -1; lov_io_sub_fini() 83 static void lov_io_sub_inherit(struct cl_io *io, struct lov_io *lio, lov_io_sub_inherit() argument 86 struct lov_stripe_md *lsm = lio->lis_object->lo_lsm; lov_io_sub_inherit() 87 struct cl_io *parent = lio->lis_cl.cis_io; lov_io_sub_inherit() 135 static int lov_io_sub_init(const struct lu_env *env, struct lov_io *lio, lov_io_sub_init() argument 138 struct lov_object *lov = lio->lis_object; lov_io_sub_init() 142 struct cl_io *io = lio->lis_cl.cis_io; lov_io_sub_init() 149 LASSERT(sub->sub_stripe < lio->lis_stripe_count); lov_io_sub_init() 158 if (lio->lis_mem_frozen) { lov_io_sub_init() 178 if (lio->lis_active_subios == 0) { lov_io_sub_init() 179 sub->sub_io = &lio->lis_single_subio; lov_io_sub_init() 180 lio->lis_single_subio_index = stripe; lov_io_sub_init() 207 lio->lis_active_subios++; lov_io_sub_init() 213 lov_io_sub_fini(env, lio, sub); lov_io_sub_init() 218 struct lov_io *lio, int stripe) lov_sub_get() 221 struct lov_io_sub *sub = &lio->lis_subs[stripe]; lov_sub_get() 223 LASSERT(stripe < lio->lis_stripe_count); lov_sub_get() 227 rc = lov_io_sub_init(env, lio, sub); lov_sub_get() 259 struct lov_io_sub *lov_page_subio(const struct lu_env *env, struct lov_io *lio, lov_page_subio() argument 262 struct lov_stripe_md *lsm = lio->lis_object->lo_lsm; lov_page_subio() 266 LASSERT(lio->lis_cl.cis_io != NULL); lov_page_subio() 267 LASSERT(cl2lov(slice->cpl_obj) == lio->lis_object); lov_page_subio() 269 LASSERT(lio->lis_nr_subios > 0); lov_page_subio() 272 return lov_sub_get(env, lio, stripe); lov_page_subio() 276 static int lov_io_subio_init(const struct lu_env *env, struct lov_io *lio, lov_io_subio_init() argument 279 struct lov_stripe_md *lsm = lio->lis_object->lo_lsm; lov_io_subio_init() 282 LASSERT(lio->lis_object != NULL); lov_io_subio_init() 288 OBD_ALLOC_LARGE(lio->lis_subs, lov_io_subio_init() 289 lsm->lsm_stripe_count * sizeof(lio->lis_subs[0])); lov_io_subio_init() 290 if (lio->lis_subs != NULL) { lov_io_subio_init() 291 lio->lis_nr_subios = lio->lis_stripe_count; lov_io_subio_init() 292 lio->lis_single_subio_index = -1; lov_io_subio_init() 293 lio->lis_active_subios = 0; lov_io_subio_init() 300 static void lov_io_slice_init(struct lov_io *lio, lov_io_slice_init() argument 304 lio->lis_object = obj; lov_io_slice_init() 307 lio->lis_stripe_count = obj->lo_lsm->lsm_stripe_count; lov_io_slice_init() 312 lio->lis_pos = io->u.ci_rw.crw_pos; lov_io_slice_init() 313 lio->lis_endpos = io->u.ci_rw.crw_pos + io->u.ci_rw.crw_count; lov_io_slice_init() 314 lio->lis_io_endpos = lio->lis_endpos; lov_io_slice_init() 317 lio->lis_pos = 0; lov_io_slice_init() 318 lio->lis_endpos = OBD_OBJECT_EOF; lov_io_slice_init() 324 lio->lis_pos = io->u.ci_setattr.sa_attr.lvb_size; lov_io_slice_init() 326 lio->lis_pos = 0; lov_io_slice_init() 327 lio->lis_endpos = OBD_OBJECT_EOF; lov_io_slice_init() 332 lio->lis_pos = cl_offset(io->ci_obj, index); lov_io_slice_init() 333 lio->lis_endpos = cl_offset(io->ci_obj, index + 1); lov_io_slice_init() 338 lio->lis_pos = io->u.ci_fsync.fi_start; lov_io_slice_init() 339 lio->lis_endpos = io->u.ci_fsync.fi_end; lov_io_slice_init() 344 lio->lis_pos = 0; lov_io_slice_init() 345 lio->lis_endpos = OBD_OBJECT_EOF; lov_io_slice_init() 355 struct lov_io *lio = cl2lov_io(env, ios); lov_io_fini() local 359 if (lio->lis_subs != NULL) { lov_io_fini() 360 for (i = 0; i < lio->lis_nr_subios; i++) lov_io_fini() 361 lov_io_sub_fini(env, lio, &lio->lis_subs[i]); lov_io_fini() 362 OBD_FREE_LARGE(lio->lis_subs, lov_io_fini() 363 lio->lis_nr_subios * sizeof(lio->lis_subs[0])); lov_io_fini() 364 lio->lis_nr_subios = 0; lov_io_fini() 382 struct lov_io *lio = cl2lov_io(env, ios); lov_io_iter_init() local 383 struct lov_stripe_md *lsm = lio->lis_object->lo_lsm; lov_io_iter_init() 391 endpos = lov_offset_mod(lio->lis_endpos, -1); lov_io_iter_init() 392 for (stripe = 0; stripe < lio->lis_stripe_count; stripe++) { lov_io_iter_init() 393 if (!lov_stripe_intersects(lsm, stripe, lio->lis_pos, lov_io_iter_init() 397 if (unlikely(lov_r0(lio->lis_object)->lo_sub[stripe] == NULL)) { lov_io_iter_init() 407 sub = lov_sub_get(env, lio, stripe); lov_io_iter_init() 409 lov_io_sub_inherit(sub->sub_io, lio, stripe, lov_io_iter_init() 419 list_add_tail(&sub->sub_linkage, &lio->lis_active); lov_io_iter_init() 429 struct lov_io *lio = cl2lov_io(env, ios); lov_io_rw_iter_init() local 431 struct lov_stripe_md *lsm = lio->lis_object->lo_lsm; lov_io_rw_iter_init() 439 if (lio->lis_nr_subios != 1 && !cl_io_is_append(io)) { lov_io_rw_iter_init() 446 io->ci_continue = next < lio->lis_io_endpos; lov_io_rw_iter_init() 447 io->u.ci_rw.crw_count = min_t(loff_t, lio->lis_io_endpos, lov_io_rw_iter_init() 449 lio->lis_pos = io->u.ci_rw.crw_pos; lov_io_rw_iter_init() 450 lio->lis_endpos = io->u.ci_rw.crw_pos + io->u.ci_rw.crw_count; lov_io_rw_iter_init() 452 (__u64)start, lio->lis_pos, lio->lis_endpos, lov_io_rw_iter_init() 453 (__u64)lio->lis_io_endpos); lov_io_rw_iter_init() 457 * [lio->lis_pos, lio->lis_endpos) intersects with exactly one stripe. lov_io_rw_iter_init() 462 static int lov_io_call(const struct lu_env *env, struct lov_io *lio, lov_io_call() argument 465 struct cl_io *parent = lio->lis_cl.cis_io; lov_io_call() 469 list_for_each_entry(sub, &lio->lis_active, sub_linkage) { lov_io_call() 529 struct lov_io *lio = cl2lov_io(env, ios); lov_io_iter_fini() local 532 rc = lov_io_call(env, lio, lov_io_iter_fini_wrapper); lov_io_iter_fini() 534 while (!list_empty(&lio->lis_active)) lov_io_iter_fini() 535 list_del_init(lio->lis_active.next); lov_io_iter_fini() 574 struct lov_io *lio = cl2lov_io(env, ios); lov_io_submit() local 575 struct lov_object *obj = lio->lis_object; lov_io_submit() 590 if (lio->lis_active_subios == 1) { lov_io_submit() 591 int idx = lio->lis_single_subio_index; lov_io_submit() 594 LASSERT(idx < lio->lis_nr_subios); lov_io_submit() 595 sub = lov_sub_get(env, lio, idx); lov_io_submit() 597 LASSERT(sub->sub_io == &lio->lis_single_subio); lov_io_submit() 604 LASSERT(lio->lis_subs != NULL); lov_io_submit() 607 sizeof(*stripes_qin) * lio->lis_nr_subios); lov_io_submit() 611 for (stripe = 0; stripe < lio->lis_nr_subios; stripe++) lov_io_submit() 620 lio->lis_mem_frozen = 1; lov_io_submit() 629 for (stripe = 0; stripe < lio->lis_nr_subios; stripe++) { 637 sub = lov_sub_get(env, lio, stripe); 650 for (stripe = 0; stripe < lio->lis_nr_subios; stripe++) { 661 sizeof(*stripes_qin) * lio->lis_nr_subios); 665 for (i = 0; i < lio->lis_nr_subios; i++) { 666 struct cl_io *cio = lio->lis_subs[i].sub_io; 669 lov_io_sub_fini(env, lio, &lio->lis_subs[i]); 671 lio->lis_mem_frozen = 0; 684 struct lov_io *lio = cl2lov_io(env, ios); lov_io_prepare_write() local 689 sub = lov_page_subio(env, lio, slice); lov_io_prepare_write() 704 struct lov_io *lio = cl2lov_io(env, ios); lov_io_commit_write() local 709 sub = lov_page_subio(env, lio, slice); lov_io_commit_write() 723 struct lov_io *lio; lov_io_fault_start() local 727 lio = cl2lov_io(env, ios); lov_io_fault_start() 728 sub = lov_sub_get(env, lio, lov_page_stripe(fio->ft_page)); lov_io_fault_start() 737 struct lov_io *lio = cl2lov_io(env, ios); lov_io_fsync_end() local 742 list_for_each_entry(sub, &lio->lis_active, sub_linkage) { lov_io_fsync_end() 896 struct lov_io *lio = lov_env_io(env); lov_io_init_raid0() local 899 INIT_LIST_HEAD(&lio->lis_active); lov_io_init_raid0() 900 lov_io_slice_init(lio, lov, io); lov_io_init_raid0() 902 io->ci_result = lov_io_subio_init(env, lio, io); lov_io_init_raid0() 904 cl_io_slice_add(io, &lio->lis_cl, obj, &lov_io_ops); lov_io_init_raid0() 915 struct lov_io *lio = lov_env_io(env); lov_io_init_empty() local 918 lio->lis_object = lov; lov_io_init_empty() 940 cl_io_slice_add(io, &lio->lis_cl, obj, &lov_empty_io_ops); lov_io_init_empty() 952 struct lov_io *lio = lov_env_io(env); lov_io_init_released() local 956 lio->lis_object = lov; lov_io_init_released() 983 cl_io_slice_add(io, &lio->lis_cl, obj, &lov_empty_io_ops); lov_io_init_released() 217 lov_sub_get(const struct lu_env *env, struct lov_io *lio, int stripe) lov_sub_get() argument
|