Whamcloud - gitweb
LU-8349 ldlm: ASSERTION(flock->blocking_export!=0) failed
[fs/lustre-release.git] / lustre / ldlm / ldlm_flock.c
index a238eab..bcf8a1e 100644 (file)
 
 #define DEBUG_SUBSYSTEM S_LDLM
 
+#include <linux/list.h>
 #include <lustre_dlm.h>
 #include <obd_support.h>
 #include <obd_class.h>
 #include <lustre_lib.h>
-#include <libcfs/list.h>
 
 #include "ldlm_internal.h"
 
@@ -108,7 +108,7 @@ static inline void ldlm_flock_blocking_link(struct ldlm_lock *req,
                 lock->l_policy_data.l_flock.owner;
         req->l_policy_data.l_flock.blocking_export =
                lock->l_export;
-       req->l_policy_data.l_flock.blocking_refs = 0;
+       atomic_set(&req->l_policy_data.l_flock.blocking_refs, 0);
 
        cfs_hash_add(req->l_export->exp_flock_hash,
                     &req->l_policy_data.l_flock.owner,
@@ -134,7 +134,7 @@ ldlm_flock_destroy(struct ldlm_lock *lock, enum ldlm_mode mode, __u64 flags)
 {
        ENTRY;
 
-       LDLM_DEBUG(lock, "ldlm_flock_destroy(mode: %d, flags: "LPX64")",
+       LDLM_DEBUG(lock, "ldlm_flock_destroy(mode: %d, flags: %#llx)",
                   mode, flags);
 
        /* Safe to not lock here, since it should be empty anyway */
@@ -304,8 +304,8 @@ ldlm_process_flock_lock(struct ldlm_lock *req, __u64 *flags, int first_enq,
        const struct ldlm_callback_suite null_cbs = { NULL };
        ENTRY;
 
-       CDEBUG(D_DLMTRACE, "flags "LPX64" owner "LPU64" pid %u mode %u start "
-              LPU64" end "LPU64"\n", *flags,
+       CDEBUG(D_DLMTRACE, "flags %#llx owner %llu pid %u mode %u start "
+              "%llu end %llu\n", *flags,
               new->l_policy_data.l_flock.owner,
                new->l_policy_data.l_flock.pid, mode,
                req->l_policy_data.l_flock.start,
@@ -677,7 +677,7 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data)
                unlock_res_and_lock(lock);
                OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_CP_CB_WAIT3, 4);
        }
-       CDEBUG(D_DLMTRACE, "flags: "LPX64" data: %p getlk: %p\n",
+       CDEBUG(D_DLMTRACE, "flags: %#llx data: %p getlk: %p\n",
               flags, data, getlk);
 
        LASSERT(flags != LDLM_FL_WAIT_NOREPROC);
@@ -843,7 +843,6 @@ int ldlm_flock_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
 void ldlm_flock_policy_wire_to_local(const union ldlm_wire_policy_data *wpolicy,
                                     union ldlm_policy_data *lpolicy)
 {
-       memset(lpolicy, 0, sizeof(*lpolicy));
        lpolicy->l_flock.start = wpolicy->l_flock.lfw_start;
        lpolicy->l_flock.end = wpolicy->l_flock.lfw_end;
        lpolicy->l_flock.pid = wpolicy->l_flock.lfw_pid;
@@ -902,7 +901,7 @@ ldlm_export_flock_get(struct cfs_hash *hs, struct hlist_node *hnode)
        flock = &lock->l_policy_data.l_flock;
        LASSERT(flock->blocking_export != NULL);
        class_export_get(flock->blocking_export);
-       flock->blocking_refs++;
+       atomic_inc(&flock->blocking_refs);
 }
 
 static void
@@ -912,15 +911,15 @@ ldlm_export_flock_put(struct cfs_hash *hs, struct hlist_node *hnode)
        struct ldlm_flock *flock;
 
        lock = hlist_entry(hnode, struct ldlm_lock, l_exp_flock_hash);
-       LDLM_LOCK_RELEASE(lock);
 
        flock = &lock->l_policy_data.l_flock;
        LASSERT(flock->blocking_export != NULL);
        class_export_put(flock->blocking_export);
-       if (--flock->blocking_refs == 0) {
+       if (atomic_dec_and_test(&flock->blocking_refs)) {
                flock->blocking_owner = 0;
                flock->blocking_export = NULL;
        }
+       LDLM_LOCK_RELEASE(lock);
 }
 
 static struct cfs_hash_ops ldlm_export_flock_ops = {