ocfs2_dlm: wake up sleepers on the lockres waitqueue
authorKurt Hackel <kurt.hackel@oracle.com>
Wed, 17 Jan 2007 22:59:12 +0000 (14:59 -0800)
committerMark Fasheh <mark.fasheh@oracle.com>
Wed, 7 Feb 2007 20:05:19 +0000 (12:05 -0800)
The dlm was not waking up threads waiting on the lockres wait queue,
waiting for the lockres to be no longer be in the DLM_LOCK_RES_IN_PROGRESS
and the DLM_LOCK_RES_MIGRATING states.

Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/dlm/dlmconvert.c
fs/ocfs2/dlm/dlmmaster.c
fs/ocfs2/dlm/dlmrecovery.c

index c764dc8..42c1774 100644 (file)
@@ -428,7 +428,7 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
        struct dlm_lockstatus *lksb;
        enum dlm_status status = DLM_NORMAL;
        u32 flags;
-       int call_ast = 0, kick_thread = 0, ast_reserved = 0;
+       int call_ast = 0, kick_thread = 0, ast_reserved = 0, wake = 0;
 
        if (!dlm_grab(dlm)) {
                dlm_error(DLM_REJECTED);
@@ -524,8 +524,11 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
                                             cnv->requested_type,
                                             &call_ast, &kick_thread);
                res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
+               wake = 1;
        }
        spin_unlock(&res->spinlock);
+       if (wake)
+               wake_up(&res->wq);
 
        if (status != DLM_NORMAL) {
                if (status != DLM_NOTQUEUED)
index b36cce0..6cfbdf2 100644 (file)
@@ -1967,6 +1967,7 @@ ok:
                spin_unlock(&mle->spinlock);
 
                if (res) {
+                       int wake = 0;
                        spin_lock(&res->spinlock);
                        if (mle->type == DLM_MLE_MIGRATION) {
                                mlog(0, "finishing off migration of lockres %.*s, "
@@ -1974,6 +1975,7 @@ ok:
                                        res->lockname.len, res->lockname.name,
                                        dlm->node_num, mle->new_master);
                                res->state &= ~DLM_LOCK_RES_MIGRATING;
+                               wake = 1;
                                dlm_change_lockres_owner(dlm, res, mle->new_master);
                                BUG_ON(res->state & DLM_LOCK_RES_DIRTY);
                        } else {
@@ -1981,6 +1983,8 @@ ok:
                        }
                        spin_unlock(&res->spinlock);
                        have_lockres_ref = 1;
+                       if (wake)
+                               wake_up(&res->wq);
                }
 
                /* master is known, detach if not already detached.
@@ -2342,7 +2346,7 @@ static int dlm_migrate_lockres(struct dlm_ctxt *dlm,
        struct list_head *queue, *iter;
        int i;
        struct dlm_lock *lock;
-       int empty = 1;
+       int empty = 1, wake = 0;
 
        if (!dlm_grab(dlm))
                return -EINVAL;
@@ -2467,6 +2471,7 @@ static int dlm_migrate_lockres(struct dlm_ctxt *dlm,
                     res->lockname.name, target);
                spin_lock(&res->spinlock);
                res->state &= ~DLM_LOCK_RES_MIGRATING;
+               wake = 1;
                spin_unlock(&res->spinlock);
                ret = -EINVAL;
        }
@@ -2525,6 +2530,7 @@ fail:
                dlm_put_mle_inuse(mle);
                spin_lock(&res->spinlock);
                res->state &= ~DLM_LOCK_RES_MIGRATING;
+               wake = 1;
                spin_unlock(&res->spinlock);
                goto leave;
        }
@@ -2567,6 +2573,7 @@ fail:
                                dlm_put_mle_inuse(mle);
                                spin_lock(&res->spinlock);
                                res->state &= ~DLM_LOCK_RES_MIGRATING;
+                               wake = 1;
                                spin_unlock(&res->spinlock);
                                goto leave;
                        }
@@ -2595,6 +2602,11 @@ leave:
        if (ret < 0)
                dlm_kick_thread(dlm, res);
 
+       /* wake up waiters if the MIGRATING flag got set
+        * but migration failed */
+       if (wake)
+               wake_up(&res->wq);
+
        /* TODO: cleanup */
        if (mres)
                free_page((unsigned long)mres);
index 8c60ccc..e57636c 100644 (file)
@@ -1420,6 +1420,7 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data)
                spin_lock(&res->spinlock);
                res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
                spin_unlock(&res->spinlock);
+               wake_up(&res->wq);
 
                /* add an extra ref for just-allocated lockres 
                 * otherwise the lockres will be purged immediately */