diff options
| -rw-r--r-- | fs/ocfs2/dlm/dlmcommon.h | 14 | ||||
| -rw-r--r-- | fs/ocfs2/dlm/dlmthread.c | 6 |
2 files changed, 17 insertions, 3 deletions
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 78eccd0951e4..829cc3948804 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
| @@ -235,18 +235,26 @@ struct dlm_lock_resource | |||
| 235 | struct qstr lockname; | 235 | struct qstr lockname; |
| 236 | struct kref refs; | 236 | struct kref refs; |
| 237 | 237 | ||
| 238 | /* please keep these next 3 in this order | 238 | /* |
| 239 | * some funcs want to iterate over all lists */ | 239 | * Please keep granted, converting, and blocked in this order, |
| 240 | * as some funcs want to iterate over all lists. | ||
| 241 | * | ||
| 242 | * All four lists are protected by the hash's reference. | ||
| 243 | */ | ||
| 240 | struct list_head granted; | 244 | struct list_head granted; |
| 241 | struct list_head converting; | 245 | struct list_head converting; |
| 242 | struct list_head blocked; | 246 | struct list_head blocked; |
| 247 | struct list_head purge; | ||
| 243 | 248 | ||
| 249 | /* | ||
| 250 | * These two lists require you to hold an additional reference | ||
| 251 | * while they are on the list. | ||
| 252 | */ | ||
| 244 | struct list_head dirty; | 253 | struct list_head dirty; |
| 245 | struct list_head recovering; // dlm_recovery_ctxt.resources list | 254 | struct list_head recovering; // dlm_recovery_ctxt.resources list |
| 246 | 255 | ||
| 247 | /* unused lock resources have their last_used stamped and are | 256 | /* unused lock resources have their last_used stamped and are |
| 248 | * put on a list for the dlm thread to run. */ | 257 | * put on a list for the dlm thread to run. */ |
| 249 | struct list_head purge; | ||
| 250 | unsigned long last_used; | 258 | unsigned long last_used; |
| 251 | 259 | ||
| 252 | unsigned migration_pending:1; | 260 | unsigned migration_pending:1; |
diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c index 76526ea95bb2..610dc76a851b 100644 --- a/fs/ocfs2/dlm/dlmthread.c +++ b/fs/ocfs2/dlm/dlmthread.c | |||
| @@ -455,6 +455,8 @@ void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) | |||
| 455 | /* don't shuffle secondary queues */ | 455 | /* don't shuffle secondary queues */ |
| 456 | if ((res->owner == dlm->node_num) && | 456 | if ((res->owner == dlm->node_num) && |
| 457 | !(res->state & DLM_LOCK_RES_DIRTY)) { | 457 | !(res->state & DLM_LOCK_RES_DIRTY)) { |
| 458 | /* ref for dirty_list */ | ||
| 459 | dlm_lockres_get(res); | ||
| 458 | list_add_tail(&res->dirty, &dlm->dirty_list); | 460 | list_add_tail(&res->dirty, &dlm->dirty_list); |
| 459 | res->state |= DLM_LOCK_RES_DIRTY; | 461 | res->state |= DLM_LOCK_RES_DIRTY; |
| 460 | } | 462 | } |
| @@ -639,6 +641,8 @@ static int dlm_thread(void *data) | |||
| 639 | list_del_init(&res->dirty); | 641 | list_del_init(&res->dirty); |
| 640 | spin_unlock(&res->spinlock); | 642 | spin_unlock(&res->spinlock); |
| 641 | spin_unlock(&dlm->spinlock); | 643 | spin_unlock(&dlm->spinlock); |
| 644 | /* Drop dirty_list ref */ | ||
| 645 | dlm_lockres_put(res); | ||
| 642 | 646 | ||
| 643 | /* lockres can be re-dirtied/re-added to the | 647 | /* lockres can be re-dirtied/re-added to the |
| 644 | * dirty_list in this gap, but that is ok */ | 648 | * dirty_list in this gap, but that is ok */ |
| @@ -691,6 +695,8 @@ in_progress: | |||
| 691 | /* if the lock was in-progress, stick | 695 | /* if the lock was in-progress, stick |
| 692 | * it on the back of the list */ | 696 | * it on the back of the list */ |
| 693 | if (delay) { | 697 | if (delay) { |
| 698 | /* ref for dirty_list */ | ||
| 699 | dlm_lockres_get(res); | ||
| 694 | spin_lock(&res->spinlock); | 700 | spin_lock(&res->spinlock); |
| 695 | list_add_tail(&res->dirty, &dlm->dirty_list); | 701 | list_add_tail(&res->dirty, &dlm->dirty_list); |
| 696 | res->state |= DLM_LOCK_RES_DIRTY; | 702 | res->state |= DLM_LOCK_RES_DIRTY; |
