X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flov%2Flov_request.c;h=d61101d52b662f0c11f80c00cadf6915a0b3ad3f;hb=fa507031d245b08c7f24efed32819daf2aa42ab3;hp=a6b3ade1a4249ef903012094afd0998caf3fde27;hpb=4c01e64e0a72c1682ebf0a8bd4cccf99fd04cd88;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index a6b3ade..d61101d 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -78,7 +78,7 @@ void lov_finish_set(struct lov_request_set *set) 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)); @@ -87,7 +87,7 @@ void lov_finish_set(struct lov_request_set *set) 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); @@ -103,7 +103,6 @@ int lov_finished_set(struct lov_request_set *set) return set->set_completes == set->set_count; } - void lov_update_set(struct lov_request_set *set, struct lov_request *req, int rc) { @@ -317,7 +316,7 @@ int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, 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); @@ -438,7 +437,7 @@ int lov_prep_match_set(struct obd_export *exp, struct obd_info *oinfo, 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); @@ -525,7 +524,7 @@ int lov_prep_cancel_set(struct obd_export *exp, struct obd_info *oinfo, 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); @@ -550,6 +549,56 @@ out_set: RETURN(rc); } +static int lov_update_create_set(struct lov_request_set *set, + struct lov_request *req, int rc) +{ + struct obd_trans_info *oti = set->set_oti; + struct lov_stripe_md *lsm = set->set_oi->oi_md; + struct lov_oinfo *loi; + struct lov_obd *lov = &set->set_exp->exp_obd->u.lov; + ENTRY; + + if (rc && lov->lov_tgts[req->rq_idx] && + lov->lov_tgts[req->rq_idx]->ltd_active) { + CERROR("error creating fid "LPX64" sub-object" + " on OST idx %d/%d: rc = %d\n", + set->set_oi->oi_oa->o_id, req->rq_idx, + lsm->lsm_stripe_count, rc); + if (rc > 0) { + CERROR("obd_create returned invalid err %d\n", rc); + rc = -EIO; + } + } + + cfs_spin_lock(&set->set_lock); + req->rq_stripe = set->set_success; + loi = lsm->lsm_oinfo[req->rq_stripe]; + + + if (rc) { + lov_update_set(set, req, rc); + cfs_spin_unlock(&set->set_lock); + RETURN(rc); + } + + loi->loi_id = req->rq_oi.oi_oa->o_id; + loi->loi_seq = req->rq_oi.oi_oa->o_seq; + loi->loi_ost_idx = req->rq_idx; + loi_init(loi); + + if (oti && set->set_cookies) + ++oti->oti_logcookies; + if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLCOOKIE) + set->set_cookie_sent++; + + lov_update_set(set, req, rc); + cfs_spin_unlock(&set->set_lock); + + CDEBUG(D_INODE, "objid "LPX64" has subobj "LPX64"/"LPU64" at idx %d\n", + lsm->lsm_object_id, loi->loi_id, loi->loi_id, req->rq_idx); + RETURN(rc); +} + static int create_done(struct obd_export *exp, struct lov_request_set *set, struct lov_stripe_md **lsmp) { @@ -660,67 +709,23 @@ int lov_fini_create_set(struct lov_request_set *set,struct lov_stripe_md **lsmp) RETURN(rc); } -int lov_update_create_set(struct lov_request_set *set, - struct lov_request *req, int rc) -{ - struct obd_trans_info *oti = set->set_oti; - struct lov_stripe_md *lsm = set->set_oi->oi_md; - struct lov_oinfo *loi; - struct lov_obd *lov = &set->set_exp->exp_obd->u.lov; - ENTRY; - - if (rc && lov->lov_tgts[req->rq_idx] && - lov->lov_tgts[req->rq_idx]->ltd_active) { - CERROR("error creating fid "LPX64" sub-object" - " on OST idx %d/%d: rc = %d\n", - set->set_oi->oi_oa->o_id, req->rq_idx, - lsm->lsm_stripe_count, rc); - if (rc > 0) { - CERROR("obd_create returned invalid err %d\n", rc); - rc = -EIO; - } - } - - cfs_spin_lock(&set->set_lock); - req->rq_stripe = set->set_success; - loi = lsm->lsm_oinfo[req->rq_stripe]; - if (rc) { - lov_update_set(set, req, rc); - cfs_spin_unlock(&set->set_lock); - RETURN(rc); - } - - loi->loi_id = req->rq_oi.oi_oa->o_id; - loi->loi_seq = req->rq_oi.oi_oa->o_seq; - loi->loi_ost_idx = req->rq_idx; - loi_init(loi); - - if (oti && set->set_cookies) - ++oti->oti_logcookies; - if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLCOOKIE) - set->set_cookie_sent++; - - lov_update_set(set, req, rc); - cfs_spin_unlock(&set->set_lock); - - CDEBUG(D_INODE, "objid "LPX64" has subobj "LPX64"/"LPU64" at idx %d\n", - lsm->lsm_object_id, loi->loi_id, loi->loi_id, req->rq_idx); - RETURN(rc); -} - int cb_create_update(void *cookie, int rc) { struct obd_info *oinfo = cookie; struct lov_request *lovreq; 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) + rc = -ENOTCONN; + rc= lov_update_create_set(lovreq->rq_rqset, lovreq, rc); if (lov_finished_set(lovreq->rq_rqset)) lov_put_reqset(lovreq->rq_rqset); return rc; } - int lov_prep_create_set(struct obd_export *exp, struct obd_info *oinfo, struct lov_stripe_md **lsmp, struct obdo *src_oa, struct obd_trans_info *oti, @@ -870,11 +875,11 @@ int lov_prep_brw_set(struct obd_export *exp, struct obd_info *oinfo, 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); @@ -919,7 +924,7 @@ int lov_prep_brw_set(struct obd_export *exp, struct obd_info *oinfo, 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)); @@ -959,7 +964,8 @@ int lov_prep_brw_set(struct obd_export *exp, struct obd_info *oinfo, } 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;