diff options
author | Mark Fasheh <mark.fasheh@oracle.com> | 2006-09-13 21:02:29 -0700 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-09-24 13:50:47 -0700 |
commit | f7fbfdd1fc91543253ba742a926a29c289f8e6ca (patch) | |
tree | 6a4f9c824a744a1d53f3a3dc7c4d851641b3b3e8 /fs/ocfs2/dlmglue.c | |
parent | b80fc012e03f8f207911b5eafe6916b000e03c8b (diff) | |
download | lwn-f7fbfdd1fc91543253ba742a926a29c289f8e6ca.tar.gz lwn-f7fbfdd1fc91543253ba742a926a29c289f8e6ca.zip |
ocfs2: Check for refreshing locks in generic unblock function
Tidy up the exit path a bit too.
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2/dlmglue.c')
-rw-r--r-- | fs/ocfs2/dlmglue.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 40562185088a..ebc4a49801bd 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c @@ -2640,22 +2640,22 @@ recheck: /* if we're blocking an exclusive and we have *any* holders, * then requeue. */ if ((lockres->l_blocking == LKM_EXMODE) - && (lockres->l_ex_holders || lockres->l_ro_holders)) { - spin_unlock_irqrestore(&lockres->l_lock, flags); - ctl->requeue = 1; - ret = 0; - goto leave; - } + && (lockres->l_ex_holders || lockres->l_ro_holders)) + goto leave_requeue; /* If it's a PR we're blocking, then only * requeue if we've got any EX holders */ if (lockres->l_blocking == LKM_PRMODE && - lockres->l_ex_holders) { - spin_unlock_irqrestore(&lockres->l_lock, flags); - ctl->requeue = 1; - ret = 0; - goto leave; - } + lockres->l_ex_holders) + goto leave_requeue; + + /* + * Can we get a lock in this state if the holder counts are + * zero? The meta data unblock code used to check this. + */ + if ((lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH) + && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) + goto leave_requeue; /* If we get here, then we know that there are no more * incompatible holders (and anyone asking for an incompatible @@ -2692,6 +2692,13 @@ downconvert: leave: mlog_exit(ret); return ret; + +leave_requeue: + spin_unlock_irqrestore(&lockres->l_lock, flags); + ctl->requeue = 1; + + mlog_exit(0); + return 0; } static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres, |