From: Sunil Mushran <sunil.mushran@oracle.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH 2/2] ocfs2: o2dlm fix race in purge lockres and newlock (orabug 9094491) -backport to 1.2
Date: Sun, 27 Jun 2010 11:47:03 -0700 [thread overview]
Message-ID: <4C279CA7.9080100@oracle.com> (raw)
In-Reply-To: <201006261134.o5QBKSZP015884@acsinet15.oracle.com>
Just to be clear. This is just an interim patch for 1.2. Not for
inclusion in mainline.
On 06/26/2010 04:32 AM, Wengang Wang wrote:
> This patch fixes the following hole.
> dlmlock tries to create a new lock on a lockres that is on purge list. It calls
> dlm_get_lockresource and later adds a lock to blocked list. But in this window,
> dlm_thread can purge the lockres and unhash it. This will cause a BUG, as when
> the AST comes back from the master lockres is not found
>
> This patch marks the lockres with a new state DLM_LOCK_RES_IN_USE which would
> protect lockres from dlm_thread purging it.
>
> Signed-off-by: Srinivas Eeda<srinivas.eeda@oracle.com>
> Signed-off-by: Sunil Mushran<sunil.mushran@oracle.com>
> ---
> dlmcommon.h | 1 +
> dlmlock.c | 4 ++++
> dlmmaster.c | 5 ++++-
> dlmthread.c | 1 +
> 4 files changed, 10 insertions(+), 1 deletion(-)
>
> diff -upr ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmcommon.h ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmcommon.h
> --- ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmcommon.h 2010-06-26 19:04:32.000000000 +0800
> +++ ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmcommon.h 2010-06-26 19:18:33.000000000 +0800
> @@ -218,6 +218,7 @@ static inline void __dlm_set_joining_nod
> #define DLM_LOCK_RES_IN_PROGRESS 0x00000010
> #define DLM_LOCK_RES_MIGRATING 0x00000020
> #define DLM_LOCK_RES_DROPPING_REF 0x00000040
> +#define DLM_LOCK_RES_IN_USE 0x00000100
> #define DLM_LOCK_RES_BLOCK_DIRTY 0x00001000
> #define DLM_LOCK_RES_SETREF_INPROG 0x00002000
>
> diff -upr ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmlock.c ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmlock.c
> --- ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmlock.c 2010-06-26 19:04:22.000000000 +0800
> +++ ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmlock.c 2010-06-26 19:21:06.000000000 +0800
> @@ -116,6 +116,8 @@ static enum dlm_status dlmlock_master(st
> if (status != DLM_NORMAL&&
> lock->ml.node != dlm->node_num) {
> /* erf. state changed after lock was dropped. */
> + /* DLM_LOCK_RES_IN_USE is set in dlm_get_lock_resource */
> + res->state&= ~DLM_LOCK_RES_IN_USE;
> spin_unlock(&res->spinlock);
> dlm_error(status);
> return status;
> @@ -162,6 +164,7 @@ static enum dlm_status dlmlock_master(st
> kick_thread = 1;
> }
> }
> + res->state&= ~DLM_LOCK_RES_IN_USE;
> /* reduce the inflight count, this may result in the lockres
> * being purged below during calc_usage */
> if (lock->ml.node == dlm->node_num)
> @@ -228,6 +231,7 @@ static enum dlm_status dlmlock_remote(st
>
> spin_lock(&res->spinlock);
> res->state&= ~DLM_LOCK_RES_IN_PROGRESS;
> + res->state&= ~DLM_LOCK_RES_IN_USE;
> lock->lock_pending = 0;
> if (status != DLM_NORMAL) {
> if (status == DLM_RECOVERING&&
> diff -upr ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmmaster.c ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmmaster.c
> --- ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmmaster.c 2010-06-26 19:04:22.000000000 +0800
> +++ ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmmaster.c 2010-06-26 19:23:57.000000000 +0800
> @@ -804,12 +804,15 @@ lookup:
> if (tmpres) {
> int dropping_ref = 0;
>
> + tmpres->state |= DLM_LOCK_RES_IN_USE;
> spin_lock(&tmpres->spinlock);
> if (tmpres->owner == dlm->node_num) {
> BUG_ON(tmpres->state& DLM_LOCK_RES_DROPPING_REF);
> dlm_lockres_grab_inflight_ref(dlm, tmpres);
> - } else if (tmpres->state& DLM_LOCK_RES_DROPPING_REF)
> + } else if (tmpres->state& DLM_LOCK_RES_DROPPING_REF) {
> + tmpres->state&= ~DLM_LOCK_RES_IN_USE;
> dropping_ref = 1;
> + }
> spin_unlock(&tmpres->spinlock);
> spin_unlock(&dlm->spinlock);
>
> diff -upr ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmthread.c ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmthread.c
> --- ocfs2-1.2.9-8-test/fs/ocfs2/dlm/dlmthread.c 2010-06-26 19:04:32.000000000 +0800
> +++ ocfs2-1.2.9-8.2/fs/ocfs2/dlm/dlmthread.c 2010-06-26 19:25:06.000000000 +0800
> @@ -97,6 +97,7 @@ int __dlm_lockres_has_locks(struct dlm_l
> int __dlm_lockres_unused(struct dlm_lock_resource *res)
> {
> if (!__dlm_lockres_has_locks(res)&&
> + !(res->state& DLM_LOCK_RES_IN_USE)&&
> (list_empty(&res->dirty)&& !(res->state& DLM_LOCK_RES_DIRTY))) {
> /* try not to scan the bitmap unless the first two
> * conditions are already true */
>
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
>
prev parent reply other threads:[~2010-06-27 18:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-26 11:32 [Ocfs2-devel] [PATCH 2/2] ocfs2: o2dlm fix race in purge lockres and newlock (orabug 9094491) -backport to 1.2 Wengang Wang
2010-06-27 18:47 ` Sunil Mushran [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C279CA7.9080100@oracle.com \
--to=sunil.mushran@oracle.com \
--cc=ocfs2-devel@oss.oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.