Whamcloud - gitweb
Branch b_new_cmd
authorvitaly <vitaly>
Thu, 21 Sep 2006 17:35:54 +0000 (17:35 +0000)
committervitaly <vitaly>
Thu, 21 Sep 2006 17:35:54 +0000 (17:35 +0000)
bugfix for memleak in lov_match
bugfix for possibly locked objects when enqueue or match only partially fails

lustre/lov/lov_internal.h
lustre/lov/lov_obd.c
lustre/lov/lov_request.c

index d5a0c12..06a0828 100644 (file)
@@ -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,
index c1f4c5d..f77a721 100644 (file)
@@ -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);
 }
 
index 6f72dc2..c21785b 100644 (file)
@@ -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);