From: vitaly Date: Thu, 21 Sep 2006 17:35:54 +0000 (+0000) Subject: Branch b_new_cmd X-Git-Tag: v1_8_0_110~486^2~874 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=d8a0e13c50f9152767bad649303f5a2bd3d5fec1;p=fs%2Flustre-release.git Branch b_new_cmd bugfix for memleak in lov_match bugfix for possibly locked objects when enqueue or match only partially fails --- diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index d5a0c12..06a0828 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -192,7 +192,7 @@ int lov_fini_sync_set(struct lov_request_set *set); int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, struct obd_enqueue_info *einfo, struct lov_request_set **reqset); -int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode); +int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc); int lov_prep_match_set(struct obd_export *exp, struct obd_info *oinfo, struct lov_stripe_md *lsm, ldlm_policy_data_t *policy, __u32 mode, diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index c1f4c5d..f77a721 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -1821,13 +1821,9 @@ static int lov_enqueue_interpret(struct ptlrpc_request_set *rqset, void *data, int rc) { struct lov_request_set *lovset = (struct lov_request_set *)data; - int err; ENTRY; - - if (rc) - lovset->set_completes = 0; - err = lov_fini_enqueue_set(lovset, lovset->set_ei->ei_mode); - RETURN(rc ? rc : err); + rc = lov_fini_enqueue_set(lovset, lovset->set_ei->ei_mode, rc); + RETURN(rc); } static int lov_enqueue(struct obd_export *exp, struct obd_info *oinfo, @@ -1871,9 +1867,7 @@ static int lov_enqueue(struct obd_export *exp, struct obd_info *oinfo, RETURN(rc); } out: - if (rc) - set->set_completes = 0; - lov_fini_enqueue_set(set, einfo->ei_mode); + rc = lov_fini_enqueue_set(set, einfo->ei_mode, rc); RETURN(rc); } diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index 6f72dc2..c21785b 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -206,9 +206,8 @@ static int enqueue_done(struct lov_request_set *set, __u32 mode) int rc = 0; ENTRY; - LASSERT(set->set_completes); /* enqueue/match success, just return */ - if (set->set_completes == set->set_success) + if (set->set_completes && set->set_completes == set->set_success) RETURN(0); /* cancel enqueued/matched locks */ @@ -232,29 +231,32 @@ static int enqueue_done(struct lov_request_set *set, __u32 mode) req->rq_oi.oi_md->lsm_object_id, req->rq_idx, rc); } - lov_llh_put(set->set_lockh); + if (set->set_lockh) + lov_llh_put(set->set_lockh); RETURN(rc); } -int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode) +int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc) { - int rc = 0; + int ret = 0; ENTRY; if (set == NULL) RETURN(0); LASSERT(set->set_exp); /* Do enqueue_done only for sync requests and if any request - succeeded. */ - if (!set->set_ei->ei_rqset && set->set_completes) - rc = enqueue_done(set, mode); - else + * succeeded. */ + if (!set->set_ei->ei_rqset) { + if (rc) + set->set_completes = 0; + ret = enqueue_done(set, mode); + } else if (set->set_lockh) lov_llh_put(set->set_lockh); if (atomic_dec_and_test(&set->set_refcount)) lov_finish_set(set); - RETURN(rc); + RETURN(rc ? rc : ret); } int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, @@ -340,7 +342,7 @@ int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, *reqset = set; RETURN(0); out_set: - lov_fini_enqueue_set(set, einfo->ei_mode); + lov_fini_enqueue_set(set, einfo->ei_mode, rc); RETURN(rc); } @@ -352,6 +354,8 @@ int lov_update_match_set(struct lov_request_set *set, struct lov_request *req, if (rc == 1) ret = 0; + else if (rc == 0) + ret = 1; lov_update_set(set, req, ret); RETURN(rc); } @@ -364,14 +368,10 @@ int lov_fini_match_set(struct lov_request_set *set, __u32 mode, int flags) if (set == NULL) RETURN(0); LASSERT(set->set_exp); - if (set->set_completes) { - if (set->set_count == set->set_success && - flags & LDLM_FL_TEST_LOCK) - lov_llh_put(set->set_lockh); - rc = enqueue_done(set, mode); - } else { + rc = enqueue_done(set, mode); + if ((set->set_count == set->set_success) && + (flags & LDLM_FL_TEST_LOCK)) lov_llh_put(set->set_lockh); - } if (atomic_dec_and_test(&set->set_refcount)) lov_finish_set(set);