ocfs2: give the dlm dirty list a reference on the lockres
Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
@@ -235,18 +235,26 @@ struct dlm_lock_resource
|
|||||||
struct qstr lockname;
|
struct qstr lockname;
|
||||||
struct kref refs;
|
struct kref refs;
|
||||||
|
|
||||||
/* please keep these next 3 in this order
|
/*
|
||||||
* some funcs want to iterate over all lists */
|
* Please keep granted, converting, and blocked in this order,
|
||||||
|
* as some funcs want to iterate over all lists.
|
||||||
|
*
|
||||||
|
* All four lists are protected by the hash's reference.
|
||||||
|
*/
|
||||||
struct list_head granted;
|
struct list_head granted;
|
||||||
struct list_head converting;
|
struct list_head converting;
|
||||||
struct list_head blocked;
|
struct list_head blocked;
|
||||||
|
struct list_head purge;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These two lists require you to hold an additional reference
|
||||||
|
* while they are on the list.
|
||||||
|
*/
|
||||||
struct list_head dirty;
|
struct list_head dirty;
|
||||||
struct list_head recovering; // dlm_recovery_ctxt.resources list
|
struct list_head recovering; // dlm_recovery_ctxt.resources list
|
||||||
|
|
||||||
/* unused lock resources have their last_used stamped and are
|
/* unused lock resources have their last_used stamped and are
|
||||||
* put on a list for the dlm thread to run. */
|
* put on a list for the dlm thread to run. */
|
||||||
struct list_head purge;
|
|
||||||
unsigned long last_used;
|
unsigned long last_used;
|
||||||
|
|
||||||
unsigned migration_pending:1;
|
unsigned migration_pending:1;
|
||||||
|
@@ -455,6 +455,8 @@ void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
|
|||||||
/* don't shuffle secondary queues */
|
/* don't shuffle secondary queues */
|
||||||
if ((res->owner == dlm->node_num) &&
|
if ((res->owner == dlm->node_num) &&
|
||||||
!(res->state & DLM_LOCK_RES_DIRTY)) {
|
!(res->state & DLM_LOCK_RES_DIRTY)) {
|
||||||
|
/* ref for dirty_list */
|
||||||
|
dlm_lockres_get(res);
|
||||||
list_add_tail(&res->dirty, &dlm->dirty_list);
|
list_add_tail(&res->dirty, &dlm->dirty_list);
|
||||||
res->state |= DLM_LOCK_RES_DIRTY;
|
res->state |= DLM_LOCK_RES_DIRTY;
|
||||||
}
|
}
|
||||||
@@ -639,6 +641,8 @@ static int dlm_thread(void *data)
|
|||||||
list_del_init(&res->dirty);
|
list_del_init(&res->dirty);
|
||||||
spin_unlock(&res->spinlock);
|
spin_unlock(&res->spinlock);
|
||||||
spin_unlock(&dlm->spinlock);
|
spin_unlock(&dlm->spinlock);
|
||||||
|
/* Drop dirty_list ref */
|
||||||
|
dlm_lockres_put(res);
|
||||||
|
|
||||||
/* lockres can be re-dirtied/re-added to the
|
/* lockres can be re-dirtied/re-added to the
|
||||||
* dirty_list in this gap, but that is ok */
|
* dirty_list in this gap, but that is ok */
|
||||||
@@ -691,6 +695,8 @@ in_progress:
|
|||||||
/* if the lock was in-progress, stick
|
/* if the lock was in-progress, stick
|
||||||
* it on the back of the list */
|
* it on the back of the list */
|
||||||
if (delay) {
|
if (delay) {
|
||||||
|
/* ref for dirty_list */
|
||||||
|
dlm_lockres_get(res);
|
||||||
spin_lock(&res->spinlock);
|
spin_lock(&res->spinlock);
|
||||||
list_add_tail(&res->dirty, &dlm->dirty_list);
|
list_add_tail(&res->dirty, &dlm->dirty_list);
|
||||||
res->state |= DLM_LOCK_RES_DIRTY;
|
res->state |= DLM_LOCK_RES_DIRTY;
|
||||||
|
Reference in New Issue
Block a user