Whamcloud - gitweb
LU-11185 mgc: config lock leak
[fs/lustre-release.git] / lustre / ldlm / ldlm_lock.c
index 23d66da..b8e3989 100644 (file)
@@ -185,7 +185,7 @@ EXPORT_SYMBOL(ldlm_register_intent);
  */
 struct ldlm_lock *ldlm_lock_get(struct ldlm_lock *lock)
 {
-       atomic_inc(&lock->l_refc);
+       refcount_inc(&lock->l_handle.h_ref);
         return lock;
 }
 EXPORT_SYMBOL(ldlm_lock_get);
@@ -200,8 +200,8 @@ void ldlm_lock_put(struct ldlm_lock *lock)
         ENTRY;
 
         LASSERT(lock->l_resource != LP_POISON);
-       LASSERT(atomic_read(&lock->l_refc) > 0);
-       if (atomic_dec_and_test(&lock->l_refc)) {
+       LASSERT(refcount_read(&lock->l_handle.h_ref) > 0);
+       if (refcount_dec_and_test(&lock->l_handle.h_ref)) {
                 struct ldlm_resource *res;
 
                 LDLM_DEBUG(lock,
@@ -438,12 +438,6 @@ void ldlm_lock_destroy_nolock(struct ldlm_lock *lock)
         EXIT;
 }
 
-/* this is called by portals_handle2object with the handle lock taken */
-static void lock_handle_addref(void *lock)
-{
-        LDLM_LOCK_GET((struct ldlm_lock *)lock);
-}
-
 static void lock_handle_free(void *lock, int size)
 {
        LASSERT(size == sizeof(struct ldlm_lock));
@@ -451,8 +445,8 @@ static void lock_handle_free(void *lock, int size)
 }
 
 static struct portals_handle_ops lock_handle_ops = {
-       .hop_addref = lock_handle_addref,
        .hop_free   = lock_handle_free,
+       .hop_type       = "ldlm",
 };
 
 /**
@@ -479,7 +473,7 @@ static struct ldlm_lock *ldlm_lock_new(struct ldlm_resource *resource)
        lock->l_resource = resource;
        lu_ref_add(&resource->lr_reference, "lock", lock);
 
-       atomic_set(&lock->l_refc, 2);
+       refcount_set(&lock->l_handle.h_ref, 2);
        INIT_LIST_HEAD(&lock->l_res_link);
        INIT_LIST_HEAD(&lock->l_lru);
        INIT_LIST_HEAD(&lock->l_pending_chain);
@@ -606,7 +600,11 @@ struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *handle,
 
        LASSERT(handle);
 
+       if (!lustre_handle_is_used(handle))
+               RETURN(NULL);
+
        lock = class_handle2object(handle->cookie, &lock_handle_ops);
+
        if (lock == NULL)
                RETURN(NULL);
 
@@ -1723,7 +1721,7 @@ static enum ldlm_error ldlm_lock_enqueue_helper(struct ldlm_lock *lock,
 {
        struct ldlm_resource *res = lock->l_resource;
        enum ldlm_error rc = ELDLM_OK;
-       struct list_head rpc_list = LIST_HEAD_INIT(rpc_list);
+       LIST_HEAD(rpc_list);
        ldlm_processing_policy policy;
 
        ENTRY;
@@ -1765,6 +1763,9 @@ enum ldlm_error ldlm_lock_enqueue(const struct lu_env *env,
        int local = ns_is_client(ldlm_res_to_ns(res));
        enum ldlm_error rc = ELDLM_OK;
        struct ldlm_interval *node = NULL;
+#ifdef HAVE_SERVER_SUPPORT
+       bool reconstruct = false;
+#endif
        ENTRY;
 
         /* policies are not executed on the client or during replay */
@@ -1820,6 +1821,19 @@ enum ldlm_error ldlm_lock_enqueue(const struct lu_env *env,
        if (!local && (*flags & LDLM_FL_REPLAY) && res->lr_type == LDLM_EXTENT)
                OBD_SLAB_ALLOC_PTR_GFP(node, ldlm_interval_slab, GFP_NOFS);
 
+#ifdef HAVE_SERVER_SUPPORT
+       reconstruct = !local && res->lr_type == LDLM_FLOCK &&
+                     !(*flags & LDLM_FL_TEST_LOCK);
+       if (reconstruct) {
+               rc = req_can_reconstruct(cookie, NULL);
+               if (rc != 0) {
+                       if (rc == 1)
+                               rc = 0;
+                       RETURN(rc);
+               }
+       }
+#endif
+
        lock_res_and_lock(lock);
        if (local && ldlm_is_granted(lock)) {
                 /* The server returned a blocked lock, but it was granted
@@ -1893,6 +1907,16 @@ enum ldlm_error ldlm_lock_enqueue(const struct lu_env *env,
 
 out:
         unlock_res_and_lock(lock);
+
+#ifdef HAVE_SERVER_SUPPORT
+       if (reconstruct) {
+               struct ptlrpc_request *req = cookie;
+
+               tgt_mk_reply_data(NULL, NULL,
+                                 &req->rq_export->exp_target_data,
+                                 req, 0, NULL, false, 0);
+       }
+#endif
         if (node)
                 OBD_SLAB_FREE(node, ldlm_interval_slab, sizeof(*node));
         return rc;
@@ -1915,7 +1939,7 @@ int ldlm_reprocess_queue(struct ldlm_resource *res, struct list_head *queue,
        __u64 flags;
        int rc = LDLM_ITER_CONTINUE;
        enum ldlm_error err;
-       struct list_head bl_ast_list = LIST_HEAD_INIT(bl_ast_list);
+       LIST_HEAD(bl_ast_list);
 
        ENTRY;
 
@@ -1929,7 +1953,7 @@ int ldlm_reprocess_queue(struct ldlm_resource *res, struct list_head *queue,
 restart:
        list_for_each_safe(tmp, pos, queue) {
                struct ldlm_lock *pending;
-               struct list_head rpc_list = LIST_HEAD_INIT(rpc_list);
+               LIST_HEAD(rpc_list);
 
                pending = list_entry(tmp, struct ldlm_lock, l_res_link);
 
@@ -2760,13 +2784,13 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 &vaf,
                                 lock,
                                 lock->l_handle.h_cookie,
-                                atomic_read(&lock->l_refc),
+                                refcount_read(&lock->l_handle.h_ref),
                                 lock->l_readers, lock->l_writers,
                                 ldlm_lockname[lock->l_granted_mode],
                                 ldlm_lockname[lock->l_req_mode],
                                 lock->l_flags, nid,
                                 lock->l_remote_handle.cookie,
-                                exp ? atomic_read(&exp->exp_refcount) : -99,
+                                exp ? refcount_read(&exp->exp_handle.h_ref) : -99,
                                 lock->l_pid, lock->l_callback_timeout,
                                 lock->l_lvb_type);
                 va_end(args);
@@ -2780,7 +2804,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 &vaf,
                                 ldlm_lock_to_ns_name(lock), lock,
                                 lock->l_handle.h_cookie,
-                                atomic_read(&lock->l_refc),
+                                refcount_read(&lock->l_handle.h_ref),
                                 lock->l_readers, lock->l_writers,
                                 ldlm_lockname[lock->l_granted_mode],
                                 ldlm_lockname[lock->l_req_mode],
@@ -2792,7 +2816,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 lock->l_req_extent.start, lock->l_req_extent.end,
                                 lock->l_flags, nid,
                                 lock->l_remote_handle.cookie,
-                                exp ? atomic_read(&exp->exp_refcount) : -99,
+                                exp ? refcount_read(&exp->exp_handle.h_ref) : -99,
                                 lock->l_pid, lock->l_callback_timeout,
                                 lock->l_lvb_type);
                break;
@@ -2803,7 +2827,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 &vaf,
                                 ldlm_lock_to_ns_name(lock), lock,
                                 lock->l_handle.h_cookie,
-                                atomic_read(&lock->l_refc),
+                                refcount_read(&lock->l_handle.h_ref),
                                 lock->l_readers, lock->l_writers,
                                 ldlm_lockname[lock->l_granted_mode],
                                 ldlm_lockname[lock->l_req_mode],
@@ -2815,7 +2839,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 lock->l_policy_data.l_flock.end,
                                 lock->l_flags, nid,
                                 lock->l_remote_handle.cookie,
-                                exp ? atomic_read(&exp->exp_refcount) : -99,
+                                exp ? refcount_read(&exp->exp_handle.h_ref) : -99,
                                 lock->l_pid, lock->l_callback_timeout);
                break;
 
@@ -2825,7 +2849,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 &vaf,
                                 ldlm_lock_to_ns_name(lock),
                                 lock, lock->l_handle.h_cookie,
-                                atomic_read(&lock->l_refc),
+                                refcount_read(&lock->l_handle.h_ref),
                                 lock->l_readers, lock->l_writers,
                                 ldlm_lockname[lock->l_granted_mode],
                                 ldlm_lockname[lock->l_req_mode],
@@ -2836,7 +2860,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 ldlm_typename[resource->lr_type],
                                 lock->l_flags, nid,
                                 lock->l_remote_handle.cookie,
-                                exp ? atomic_read(&exp->exp_refcount) : -99,
+                                exp ? refcount_read(&exp->exp_handle.h_ref) : -99,
                                 lock->l_pid, lock->l_callback_timeout,
                                 lock->l_lvb_type);
                break;
@@ -2847,7 +2871,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 &vaf,
                                 ldlm_lock_to_ns_name(lock),
                                 lock, lock->l_handle.h_cookie,
-                                atomic_read(&lock->l_refc),
+                                refcount_read(&lock->l_handle.h_ref),
                                 lock->l_readers, lock->l_writers,
                                 ldlm_lockname[lock->l_granted_mode],
                                 ldlm_lockname[lock->l_req_mode],
@@ -2856,7 +2880,7 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
                                 ldlm_typename[resource->lr_type],
                                 lock->l_flags, nid,
                                 lock->l_remote_handle.cookie,
-                                exp ? atomic_read(&exp->exp_refcount) : -99,
+                                exp ? refcount_read(&exp->exp_handle.h_ref) : -99,
                                 lock->l_pid, lock->l_callback_timeout,
                                 lock->l_lvb_type);
                break;