ocfs2: do not unconditionally purge the lockres in dlmlock_remote()
authorKurt Hackel <kurt.hackel@oracle.com>
Mon, 1 May 2006 20:27:10 +0000 (13:27 -0700)
committerMark Fasheh <mark.fasheh@oracle.com>
Mon, 26 Jun 2006 21:43:06 +0000 (14:43 -0700)
In dlmlock_remote(), do not call purge_lockres until the lock resource
actually changes. otherwise, the mastery info on the lockres will go away
underneath the caller.

Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/dlm/dlmlock.c

index 5757620..675123c 100644 (file)
@@ -201,6 +201,7 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm,
                                      struct dlm_lock *lock, int flags)
 {
        enum dlm_status status = DLM_DENIED;
+       int lockres_changed = 1;
 
        mlog_entry("type=%d\n", lock->ml.type);
        mlog(0, "lockres %.*s, flags = 0x%x\n", res->lockname.len,
@@ -230,6 +231,10 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm,
                        dlm_error(status);
                dlm_revert_pending_lock(res, lock);
                dlm_lock_put(lock);
+               /* do NOT call calc_usage, as this would unhash the remote
+                * lockres before we ever get to use it.  treat as if we
+                * never made any change to the lockres. */
+               lockres_changed = 0;
        } else if (dlm_is_recovery_lock(res->lockname.name, 
                                        res->lockname.len)) {
                /* special case for the $RECOVERY lock.
@@ -243,7 +248,8 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm,
        }
        spin_unlock(&res->spinlock);
 
-       dlm_lockres_calc_usage(dlm, res);
+       if (lockres_changed)
+               dlm_lockres_calc_usage(dlm, res);
 
        wake_up(&res->wq);
        return status;