ocfs2: Create locks at initially requested level
If we have not yet created a cluster lock, ocfs2_cluster_lock() will first create it at NLMODE, and then convert the lock to either PRMODE or EXMODE (whichever is requested). Change ocfs2_cluster_lock() to just create the lock at the initially requested level. ocfs2_locking_ast() handles this case fine, so the only update required was in setup of locking state. This should reduce the number of network messages required for a new lock by one, providing an incremental performance enhancement. Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
@@ -980,18 +980,6 @@ again:
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
|
|
||||||
/* lock has not been created yet. */
|
|
||||||
spin_unlock_irqrestore(&lockres->l_lock, flags);
|
|
||||||
|
|
||||||
ret = ocfs2_lock_create(osb, lockres, LKM_NLMODE, 0);
|
|
||||||
if (ret < 0) {
|
|
||||||
mlog_errno(ret);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lockres->l_flags & OCFS2_LOCK_BLOCKED &&
|
if (lockres->l_flags & OCFS2_LOCK_BLOCKED &&
|
||||||
!ocfs2_may_continue_on_blocked_lock(lockres, level)) {
|
!ocfs2_may_continue_on_blocked_lock(lockres, level)) {
|
||||||
/* is the lock is currently blocked on behalf of
|
/* is the lock is currently blocked on behalf of
|
||||||
@@ -1006,7 +994,14 @@ again:
|
|||||||
mlog(ML_ERROR, "lockres %s has action %u pending\n",
|
mlog(ML_ERROR, "lockres %s has action %u pending\n",
|
||||||
lockres->l_name, lockres->l_action);
|
lockres->l_name, lockres->l_action);
|
||||||
|
|
||||||
|
if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
|
||||||
|
lockres->l_action = OCFS2_AST_ATTACH;
|
||||||
|
lkm_flags &= ~LKM_CONVERT;
|
||||||
|
} else {
|
||||||
lockres->l_action = OCFS2_AST_CONVERT;
|
lockres->l_action = OCFS2_AST_CONVERT;
|
||||||
|
lkm_flags |= LKM_CONVERT;
|
||||||
|
}
|
||||||
|
|
||||||
lockres->l_requested = level;
|
lockres->l_requested = level;
|
||||||
lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
|
lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
|
||||||
spin_unlock_irqrestore(&lockres->l_lock, flags);
|
spin_unlock_irqrestore(&lockres->l_lock, flags);
|
||||||
@@ -1021,7 +1016,7 @@ again:
|
|||||||
status = dlmlock(osb->dlm,
|
status = dlmlock(osb->dlm,
|
||||||
level,
|
level,
|
||||||
&lockres->l_lksb,
|
&lockres->l_lksb,
|
||||||
lkm_flags|LKM_CONVERT,
|
lkm_flags,
|
||||||
lockres->l_name,
|
lockres->l_name,
|
||||||
OCFS2_LOCK_ID_MAX_LEN - 1,
|
OCFS2_LOCK_ID_MAX_LEN - 1,
|
||||||
ocfs2_locking_ast,
|
ocfs2_locking_ast,
|
||||||
|
Reference in New Issue
Block a user