diff options
Diffstat (limited to 'fs/ocfs2/dlm/dlmconvert.c')
-rw-r--r-- | fs/ocfs2/dlm/dlmconvert.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c index 8285228d9e37..c764dc8e40a2 100644 --- a/fs/ocfs2/dlm/dlmconvert.c +++ b/fs/ocfs2/dlm/dlmconvert.c | |||
@@ -214,6 +214,9 @@ grant: | |||
214 | if (lock->ml.node == dlm->node_num) | 214 | if (lock->ml.node == dlm->node_num) |
215 | mlog(0, "doing in-place convert for nonlocal lock\n"); | 215 | mlog(0, "doing in-place convert for nonlocal lock\n"); |
216 | lock->ml.type = type; | 216 | lock->ml.type = type; |
217 | if (lock->lksb->flags & DLM_LKSB_PUT_LVB) | ||
218 | memcpy(res->lvb, lock->lksb->lvb, DLM_LVB_LEN); | ||
219 | |||
217 | status = DLM_NORMAL; | 220 | status = DLM_NORMAL; |
218 | *call_ast = 1; | 221 | *call_ast = 1; |
219 | goto unlock_exit; | 222 | goto unlock_exit; |
@@ -231,8 +234,7 @@ switch_queues: | |||
231 | 234 | ||
232 | lock->ml.convert_type = type; | 235 | lock->ml.convert_type = type; |
233 | /* do not alter lock refcount. switching lists. */ | 236 | /* do not alter lock refcount. switching lists. */ |
234 | list_del_init(&lock->list); | 237 | list_move_tail(&lock->list, &res->converting); |
235 | list_add_tail(&lock->list, &res->converting); | ||
236 | 238 | ||
237 | unlock_exit: | 239 | unlock_exit: |
238 | spin_unlock(&lock->spinlock); | 240 | spin_unlock(&lock->spinlock); |
@@ -248,8 +250,7 @@ void dlm_revert_pending_convert(struct dlm_lock_resource *res, | |||
248 | struct dlm_lock *lock) | 250 | struct dlm_lock *lock) |
249 | { | 251 | { |
250 | /* do not alter lock refcount. switching lists. */ | 252 | /* do not alter lock refcount. switching lists. */ |
251 | list_del_init(&lock->list); | 253 | list_move_tail(&lock->list, &res->granted); |
252 | list_add_tail(&lock->list, &res->granted); | ||
253 | lock->ml.convert_type = LKM_IVMODE; | 254 | lock->ml.convert_type = LKM_IVMODE; |
254 | lock->lksb->flags &= ~(DLM_LKSB_GET_LVB|DLM_LKSB_PUT_LVB); | 255 | lock->lksb->flags &= ~(DLM_LKSB_GET_LVB|DLM_LKSB_PUT_LVB); |
255 | } | 256 | } |
@@ -294,8 +295,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, | |||
294 | res->state |= DLM_LOCK_RES_IN_PROGRESS; | 295 | res->state |= DLM_LOCK_RES_IN_PROGRESS; |
295 | /* move lock to local convert queue */ | 296 | /* move lock to local convert queue */ |
296 | /* do not alter lock refcount. switching lists. */ | 297 | /* do not alter lock refcount. switching lists. */ |
297 | list_del_init(&lock->list); | 298 | list_move_tail(&lock->list, &res->converting); |
298 | list_add_tail(&lock->list, &res->converting); | ||
299 | lock->convert_pending = 1; | 299 | lock->convert_pending = 1; |
300 | lock->ml.convert_type = type; | 300 | lock->ml.convert_type = type; |
301 | 301 | ||
@@ -464,6 +464,12 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) | |||
464 | } | 464 | } |
465 | 465 | ||
466 | spin_lock(&res->spinlock); | 466 | spin_lock(&res->spinlock); |
467 | status = __dlm_lockres_state_to_status(res); | ||
468 | if (status != DLM_NORMAL) { | ||
469 | spin_unlock(&res->spinlock); | ||
470 | dlm_error(status); | ||
471 | goto leave; | ||
472 | } | ||
467 | list_for_each(iter, &res->granted) { | 473 | list_for_each(iter, &res->granted) { |
468 | lock = list_entry(iter, struct dlm_lock, list); | 474 | lock = list_entry(iter, struct dlm_lock, list); |
469 | if (lock->ml.cookie == cnv->cookie && | 475 | if (lock->ml.cookie == cnv->cookie && |
@@ -473,6 +479,21 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) | |||
473 | } | 479 | } |
474 | lock = NULL; | 480 | lock = NULL; |
475 | } | 481 | } |
482 | if (!lock) { | ||
483 | __dlm_print_one_lock_resource(res); | ||
484 | list_for_each(iter, &res->granted) { | ||
485 | lock = list_entry(iter, struct dlm_lock, list); | ||
486 | if (lock->ml.node == cnv->node_idx) { | ||
487 | mlog(ML_ERROR, "There is something here " | ||
488 | "for node %u, lock->ml.cookie=%llu, " | ||
489 | "cnv->cookie=%llu\n", cnv->node_idx, | ||
490 | (unsigned long long)lock->ml.cookie, | ||
491 | (unsigned long long)cnv->cookie); | ||
492 | break; | ||
493 | } | ||
494 | } | ||
495 | lock = NULL; | ||
496 | } | ||
476 | spin_unlock(&res->spinlock); | 497 | spin_unlock(&res->spinlock); |
477 | if (!lock) { | 498 | if (!lock) { |
478 | status = DLM_IVLOCKID; | 499 | status = DLM_IVLOCKID; |