static struct osc_io *cl2osc_io(const struct lu_env *env, const struct cl_io_slice *slice) { struct osc_io *oio = container_of0(slice, struct osc_io, oi_cl); LINVRNT(oio == osc_env_io(env)); return oio; }
static int osc_fsync_ost(const struct lu_env *env, struct osc_object *obj, struct cl_fsync_io *fio) { struct osc_io *oio = osc_env_io(env); struct obdo *oa = &oio->oi_oa; struct obd_info *oinfo = &oio->oi_info; struct lov_oinfo *loi = obj->oo_oinfo; struct osc_async_cbargs *cbargs = &oio->oi_cbarg; int rc = 0; memset(oa, 0, sizeof(*oa)); oa->o_oi = loi->loi_oi; oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; /* reload size abd blocks for start and end of sync range */ oa->o_size = fio->fi_start; oa->o_blocks = fio->fi_end; oa->o_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; obdo_set_parent_fid(oa, fio->fi_fid); memset(oinfo, 0, sizeof(*oinfo)); oinfo->oi_oa = oa; oinfo->oi_capa = fio->fi_capa; init_completion(&cbargs->opc_sync); rc = osc_sync_base(osc_export(obj), oinfo, osc_async_upcall, cbargs, PTLRPCD_SET); return rc; }
int osc_io_init(const struct lu_env *env, struct cl_object *obj, struct cl_io *io) { struct osc_io *oio = osc_env_io(env); CL_IO_SLICE_CLEAN(oio, oi_cl); cl_io_slice_add(io, &oio->oi_cl, obj, &osc_io_ops); return 0; }
static void osc_io_rw_iter_fini(const struct lu_env *env, const struct cl_io_slice *ios) { struct osc_io *oio = osc_env_io(env); struct osc_object *osc = cl2osc(ios->cis_obj); struct client_obd *cli = osc_cli(osc); if (oio->oi_lru_reserved > 0) { atomic_add(oio->oi_lru_reserved, cli->cl_lru_left); oio->oi_lru_reserved = 0; } }
static void osc_io_write_iter_fini(const struct lu_env *env, const struct cl_io_slice *ios) { struct osc_io *oio = osc_env_io(env); struct osc_object *osc = cl2osc(ios->cis_obj); if (oio->oi_lru_reserved > 0) { osc_lru_unreserve(osc_cli(osc), oio->oi_lru_reserved); oio->oi_lru_reserved = 0; } oio->oi_write_osclock = NULL; osc_io_iter_fini(env, ios); }
static void osc_io_iter_fini(const struct lu_env *env, const struct cl_io_slice *ios) { struct osc_io *oio = osc_env_io(env); if (oio->oi_is_active) { struct osc_object *osc = cl2osc(ios->cis_obj); oio->oi_is_active = 0; LASSERT(atomic_read(&osc->oo_nr_ios) > 0); if (atomic_dec_and_test(&osc->oo_nr_ios)) wake_up_all(&osc->oo_io_waitq); } }
static int osc_io_iter_init(const struct lu_env *env, const struct cl_io_slice *ios) { struct osc_object *osc = cl2osc(ios->cis_obj); struct obd_import *imp = osc_cli(osc)->cl_import; int rc = -EIO; spin_lock(&imp->imp_lock); if (likely(!imp->imp_invalid)) { struct osc_io *oio = osc_env_io(env); atomic_inc(&osc->oo_nr_ios); oio->oi_is_active = 1; rc = 0; } spin_unlock(&imp->imp_lock); return rc; }
static int osc_io_write_iter_init(const struct lu_env *env, const struct cl_io_slice *ios) { struct cl_io *io = ios->cis_io; struct osc_io *oio = osc_env_io(env); struct osc_object *osc = cl2osc(ios->cis_obj); unsigned long npages; ENTRY; if (cl_io_is_append(io)) RETURN(osc_io_iter_init(env, ios)); npages = io->u.ci_rw.crw_count >> PAGE_CACHE_SHIFT; if (io->u.ci_rw.crw_pos & ~PAGE_MASK) ++npages; oio->oi_lru_reserved = osc_lru_reserve(osc_cli(osc), npages); RETURN(osc_io_iter_init(env, ios)); }
static int osc_io_rw_iter_init(const struct lu_env *env, const struct cl_io_slice *ios) { struct cl_io *io = ios->cis_io; struct osc_io *oio = osc_env_io(env); struct osc_object *osc = cl2osc(ios->cis_obj); struct client_obd *cli = osc_cli(osc); unsigned long c; unsigned int npages; unsigned int max_pages; ENTRY; if (cl_io_is_append(io)) RETURN(0); npages = io->u.ci_rw.crw_count >> PAGE_CACHE_SHIFT; if (io->u.ci_rw.crw_pos & ~CFS_PAGE_MASK) ++npages; max_pages = cli->cl_max_pages_per_rpc * cli->cl_max_rpcs_in_flight; if (npages > max_pages) npages = max_pages; c = atomic_read(cli->cl_lru_left); if (c < npages && osc_lru_reclaim(cli) > 0) c = atomic_read(cli->cl_lru_left); while (c >= npages) { if (c == atomic_cmpxchg(cli->cl_lru_left, c, c - npages)) { oio->oi_lru_reserved = npages; break; } c = atomic_read(cli->cl_lru_left); } RETURN(0); }