/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011 Whamcloud, Inc.
+ *
*/
/*
* This file is part of Lustre, http://www.lustre.org/
if (req->rq_oi.oi_oa)
OBDO_FREE(req->rq_oi.oi_oa);
if (req->rq_oi.oi_md)
- OBD_FREE(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_FREE_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_osfs)
OBD_FREE(req->rq_oi.oi_osfs,
sizeof(*req->rq_oi.oi_osfs));
if (set->set_pga) {
int len = set->set_oabufs * sizeof(*set->set_pga);
- OBD_FREE(set->set_pga, len);
+ OBD_FREE_LARGE(set->set_pga, len);
}
if (set->set_lockh)
lov_llh_put(set->set_lockh);
req->rq_buflen = sizeof(*req->rq_oi.oi_md) +
sizeof(struct lov_oinfo *) +
sizeof(struct lov_oinfo);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
GOTO(out_set, rc = -ENOMEM);
req->rq_buflen = sizeof(*req->rq_oi.oi_md);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
GOTO(out_set, rc = -ENOMEM);
req->rq_buflen = sizeof(*req->rq_oi.oi_md);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
lovreq = container_of(oinfo, struct lov_request, rq_oi);
- if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OSC_CREATE_FAIL))
- if (lovreq->rq_idx == obd_fail_val)
+ if (CFS_FAIL_CHECK(OBD_FAIL_MDS_OSC_CREATE_FAIL))
+ if (lovreq->rq_idx == cfs_fail_val)
rc = -ENOTCONN;
rc= lov_update_create_set(lovreq->rq_rqset, lovreq, rc);
set->set_oti = oti;
set->set_oi = oinfo;
set->set_oabufs = oa_bufs;
- OBD_ALLOC(set->set_pga, oa_bufs * sizeof(*set->set_pga));
+ OBD_ALLOC_LARGE(set->set_pga, oa_bufs * sizeof(*set->set_pga));
if (!set->set_pga)
GOTO(out, rc = -ENOMEM);
- OBD_ALLOC(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
+ OBD_ALLOC_LARGE(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
if (!info)
GOTO(out, rc = -ENOMEM);
req->rq_oi.oi_oa->o_stripe_idx = i;
req->rq_buflen = sizeof(*req->rq_oi.oi_md);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBDO_FREE(req->rq_oi.oi_oa);
OBD_FREE(req, sizeof(*req));
}
out:
if (info)
- OBD_FREE(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
+ OBD_FREE_LARGE(info,
+ sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
if (rc == 0)
*reqset = set;
RETURN(rc);
}
+/* The callback for osc_sync that finilizes a request info when a
+ * response is recieved. */
+static int cb_sync_update(void *cookie, int rc)
+{
+ struct obd_info *oinfo = cookie;
+ struct lov_request *lovreq;
+
+ lovreq = container_of(oinfo, struct lov_request, rq_oi);
+ return lov_update_common_set(lovreq->rq_rqset, lovreq, rc);
+}
+
int lov_prep_sync_set(struct obd_export *exp, struct obd_info *oinfo,
- struct obdo *src_oa, struct lov_stripe_md *lsm,
obd_off start, obd_off end,
struct lov_request_set **reqset)
{
int rc = 0, i;
ENTRY;
- OBD_ALLOC(set, sizeof(*set));
+ OBD_ALLOC_PTR(set);
if (set == NULL)
RETURN(-ENOMEM);
lov_init_set(set);
set->set_exp = exp;
set->set_oi = oinfo;
- set->set_oi->oi_md = lsm;
- set->set_oi->oi_oa = src_oa;
- for (i = 0; i < lsm->lsm_stripe_count; i++) {
- struct lov_oinfo *loi = lsm->lsm_oinfo[i];
+ for (i = 0; i < oinfo->oi_md->lsm_stripe_count; i++) {
+ struct lov_oinfo *loi = oinfo->oi_md->lsm_oinfo[i];
struct lov_request *req;
obd_off rs, re;
continue;
}
- if (!lov_stripe_intersects(lsm, i, start, end, &rs, &re))
+ if (!lov_stripe_intersects(oinfo->oi_md, i, start, end, &rs,
+ &re))
continue;
- OBD_ALLOC(req, sizeof(*req));
+ OBD_ALLOC_PTR(req);
if (req == NULL)
GOTO(out_set, rc = -ENOMEM);
req->rq_stripe = i;
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
}
- memcpy(req->rq_oi.oi_oa, src_oa, sizeof(*req->rq_oi.oi_oa));
+ *req->rq_oi.oi_oa = *oinfo->oi_oa;
req->rq_oi.oi_oa->o_id = loi->loi_id;
req->rq_oi.oi_oa->o_seq = loi->loi_seq;
req->rq_oi.oi_oa->o_stripe_idx = i;
req->rq_oi.oi_policy.l_extent.start = rs;
req->rq_oi.oi_policy.l_extent.end = re;
req->rq_oi.oi_policy.l_extent.gid = -1;
+ req->rq_oi.oi_cb_up = cb_sync_update;
lov_set_add_req(req, set);
}
RETURN(rc);
}
-int lov_fini_sync_fs_set(struct lov_request_set *set)
-{
- int rc = 0;
- ENTRY;
-
- if (set == NULL)
- RETURN(rc);
- lov_put_reqset(set);
- RETURN(rc);
-}
-
void lov_update_statfs(struct obd_statfs *osfs, struct obd_statfs *lov_sfs,
int success)
{
lov_fini_statfs_set(set);
RETURN(rc);
}
-
-int cb_sync_fs_update(void *cookie, int rc)
-{
- struct obd_info *oinfo = cookie;
- struct lov_request *lovreq;
- ENTRY;
-
- lovreq = container_of(oinfo, struct lov_request, rq_oi);
- lov_update_set(lovreq->rq_rqset, lovreq, rc);
-
- RETURN(rc);
-}
-
-int lov_prep_sync_fs_set(struct obd_device *obd, struct obd_info *oinfo,
- struct lov_request_set **request)
-{
- struct lov_request_set *set;
- struct lov_obd *lov = &obd->u.lov;
- int rc = 0;
- int i;
-
- ENTRY;
-
- OBD_ALLOC(set, sizeof(*set));
- if (set == NULL)
- RETURN(ENOMEM);
- lov_init_set(set);
- set->set_obd = obd;
- set->set_oi = oinfo;
-
- for (i = 0; i < lov->desc.ld_tgt_count; i++) {
- struct lov_request *req;
-
- if (!lov->lov_tgts[i] || !lov->lov_tgts[i]->ltd_active ||
- !lov->lov_tgts[i]->ltd_exp) {
- CDEBUG(D_INFO, "lov idx %d inactive or disabled\n", i);
- continue;
- }
-
- OBD_ALLOC(req, sizeof(*req));
- if (req == NULL)
- GOTO(out, rc = ENOMEM);
-
- req->rq_idx = i;
- req->rq_oi.oi_cb_up = cb_sync_fs_update;
-
- lov_set_add_req(req, set);
- }
- if (!set->set_count)
- GOTO(out, rc = -EIO);
- *request = set;
- RETURN(rc);
-out:
- lov_fini_sync_fs_set(set);
- RETURN(rc);
-}