diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-05 21:32:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-05 21:32:43 -0500 |
commit | 10cc04f5a01041ffff068b3f9b195bfdc5290c45 (patch) | |
tree | 5c53027ce5299075759b70e1447ce811ba1afdf0 /fs/ocfs2/dlm | |
parent | 520c85346666d4d9a6fcaaa8450542302dc28b91 (diff) | |
parent | 9047beabb8a396f0b18de1e4a9ab920cf92054af (diff) |
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2: (138 commits)
ocfs2: Access the right buffer_head in ocfs2_merge_rec_left.
ocfs2: use min_t in ocfs2_quota_read()
ocfs2: remove unneeded lvb casts
ocfs2: Add xattr support checking in init_security
ocfs2: alloc xattr bucket in ocfs2_xattr_set_handle
ocfs2: calculate and reserve credits for xattr value in mknod
ocfs2/xattr: fix credits calculation during index create
ocfs2/xattr: Always updating ctime during xattr set.
ocfs2/xattr: Remove extend_trans call and add its credits from the beginning
ocfs2/dlm: Fix race during lockres mastery
ocfs2/dlm: Fix race in adding/removing lockres' to/from the tracking list
ocfs2/dlm: Hold off sending lockres drop ref message while lockres is migrating
ocfs2/dlm: Clean up errors in dlm_proxy_ast_handler()
ocfs2/dlm: Fix a race between migrate request and exit domain
ocfs2: One more hamming code optimization.
ocfs2: Another hamming code optimization.
ocfs2: Don't hand-code xor in ocfs2_hamming_encode().
ocfs2: Enable metadata checksums.
ocfs2: Validate superblock with checksum and ecc.
ocfs2: Checksum and ECC for directory blocks.
...
Diffstat (limited to 'fs/ocfs2/dlm')
-rw-r--r-- | fs/ocfs2/dlm/dlmast.c | 52 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmcommon.h | 3 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmdebug.c | 53 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmdomain.c | 1 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 42 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmthread.c | 3 |
6 files changed, 94 insertions, 60 deletions
diff --git a/fs/ocfs2/dlm/dlmast.c b/fs/ocfs2/dlm/dlmast.c index 644bee55d8ba..d07ddbe4b283 100644 --- a/fs/ocfs2/dlm/dlmast.c +++ b/fs/ocfs2/dlm/dlmast.c | |||
@@ -275,6 +275,7 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, | |||
275 | struct list_head *iter, *head=NULL; | 275 | struct list_head *iter, *head=NULL; |
276 | u64 cookie; | 276 | u64 cookie; |
277 | u32 flags; | 277 | u32 flags; |
278 | u8 node; | ||
278 | 279 | ||
279 | if (!dlm_grab(dlm)) { | 280 | if (!dlm_grab(dlm)) { |
280 | dlm_error(DLM_REJECTED); | 281 | dlm_error(DLM_REJECTED); |
@@ -286,18 +287,21 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, | |||
286 | 287 | ||
287 | name = past->name; | 288 | name = past->name; |
288 | locklen = past->namelen; | 289 | locklen = past->namelen; |
289 | cookie = be64_to_cpu(past->cookie); | 290 | cookie = past->cookie; |
290 | flags = be32_to_cpu(past->flags); | 291 | flags = be32_to_cpu(past->flags); |
292 | node = past->node_idx; | ||
291 | 293 | ||
292 | if (locklen > DLM_LOCKID_NAME_MAX) { | 294 | if (locklen > DLM_LOCKID_NAME_MAX) { |
293 | ret = DLM_IVBUFLEN; | 295 | ret = DLM_IVBUFLEN; |
294 | mlog(ML_ERROR, "Invalid name length in proxy ast handler!\n"); | 296 | mlog(ML_ERROR, "Invalid name length (%d) in proxy ast " |
297 | "handler!\n", locklen); | ||
295 | goto leave; | 298 | goto leave; |
296 | } | 299 | } |
297 | 300 | ||
298 | if ((flags & (LKM_PUT_LVB|LKM_GET_LVB)) == | 301 | if ((flags & (LKM_PUT_LVB|LKM_GET_LVB)) == |
299 | (LKM_PUT_LVB|LKM_GET_LVB)) { | 302 | (LKM_PUT_LVB|LKM_GET_LVB)) { |
300 | mlog(ML_ERROR, "both PUT and GET lvb specified\n"); | 303 | mlog(ML_ERROR, "Both PUT and GET lvb specified, (0x%x)\n", |
304 | flags); | ||
301 | ret = DLM_BADARGS; | 305 | ret = DLM_BADARGS; |
302 | goto leave; | 306 | goto leave; |
303 | } | 307 | } |
@@ -310,22 +314,21 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, | |||
310 | if (past->type != DLM_AST && | 314 | if (past->type != DLM_AST && |
311 | past->type != DLM_BAST) { | 315 | past->type != DLM_BAST) { |
312 | mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu" | 316 | mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu" |
313 | "name=%.*s\n", past->type, | 317 | "name=%.*s, node=%u\n", past->type, |
314 | dlm_get_lock_cookie_node(cookie), | 318 | dlm_get_lock_cookie_node(be64_to_cpu(cookie)), |
315 | dlm_get_lock_cookie_seq(cookie), | 319 | dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), |
316 | locklen, name); | 320 | locklen, name, node); |
317 | ret = DLM_IVLOCKID; | 321 | ret = DLM_IVLOCKID; |
318 | goto leave; | 322 | goto leave; |
319 | } | 323 | } |
320 | 324 | ||
321 | res = dlm_lookup_lockres(dlm, name, locklen); | 325 | res = dlm_lookup_lockres(dlm, name, locklen); |
322 | if (!res) { | 326 | if (!res) { |
323 | mlog(0, "got %sast for unknown lockres! " | 327 | mlog(0, "Got %sast for unknown lockres! cookie=%u:%llu, " |
324 | "cookie=%u:%llu, name=%.*s, namelen=%u\n", | 328 | "name=%.*s, node=%u\n", (past->type == DLM_AST ? "" : "b"), |
325 | past->type == DLM_AST ? "" : "b", | 329 | dlm_get_lock_cookie_node(be64_to_cpu(cookie)), |
326 | dlm_get_lock_cookie_node(cookie), | 330 | dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), |
327 | dlm_get_lock_cookie_seq(cookie), | 331 | locklen, name, node); |
328 | locklen, name, locklen); | ||
329 | ret = DLM_IVLOCKID; | 332 | ret = DLM_IVLOCKID; |
330 | goto leave; | 333 | goto leave; |
331 | } | 334 | } |
@@ -337,12 +340,12 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, | |||
337 | 340 | ||
338 | spin_lock(&res->spinlock); | 341 | spin_lock(&res->spinlock); |
339 | if (res->state & DLM_LOCK_RES_RECOVERING) { | 342 | if (res->state & DLM_LOCK_RES_RECOVERING) { |
340 | mlog(0, "responding with DLM_RECOVERING!\n"); | 343 | mlog(0, "Responding with DLM_RECOVERING!\n"); |
341 | ret = DLM_RECOVERING; | 344 | ret = DLM_RECOVERING; |
342 | goto unlock_out; | 345 | goto unlock_out; |
343 | } | 346 | } |
344 | if (res->state & DLM_LOCK_RES_MIGRATING) { | 347 | if (res->state & DLM_LOCK_RES_MIGRATING) { |
345 | mlog(0, "responding with DLM_MIGRATING!\n"); | 348 | mlog(0, "Responding with DLM_MIGRATING!\n"); |
346 | ret = DLM_MIGRATING; | 349 | ret = DLM_MIGRATING; |
347 | goto unlock_out; | 350 | goto unlock_out; |
348 | } | 351 | } |
@@ -351,7 +354,7 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, | |||
351 | lock = NULL; | 354 | lock = NULL; |
352 | list_for_each(iter, head) { | 355 | list_for_each(iter, head) { |
353 | lock = list_entry (iter, struct dlm_lock, list); | 356 | lock = list_entry (iter, struct dlm_lock, list); |
354 | if (be64_to_cpu(lock->ml.cookie) == cookie) | 357 | if (lock->ml.cookie == cookie) |
355 | goto do_ast; | 358 | goto do_ast; |
356 | } | 359 | } |
357 | 360 | ||
@@ -363,15 +366,15 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, | |||
363 | 366 | ||
364 | list_for_each(iter, head) { | 367 | list_for_each(iter, head) { |
365 | lock = list_entry (iter, struct dlm_lock, list); | 368 | lock = list_entry (iter, struct dlm_lock, list); |
366 | if (be64_to_cpu(lock->ml.cookie) == cookie) | 369 | if (lock->ml.cookie == cookie) |
367 | goto do_ast; | 370 | goto do_ast; |
368 | } | 371 | } |
369 | 372 | ||
370 | mlog(0, "got %sast for unknown lock! cookie=%u:%llu, " | 373 | mlog(0, "Got %sast for unknown lock! cookie=%u:%llu, name=%.*s, " |
371 | "name=%.*s, namelen=%u\n", past->type == DLM_AST ? "" : "b", | 374 | "node=%u\n", past->type == DLM_AST ? "" : "b", |
372 | dlm_get_lock_cookie_node(cookie), | 375 | dlm_get_lock_cookie_node(be64_to_cpu(cookie)), |
373 | dlm_get_lock_cookie_seq(cookie), | 376 | dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), |
374 | locklen, name, locklen); | 377 | locklen, name, node); |
375 | 378 | ||
376 | ret = DLM_NORMAL; | 379 | ret = DLM_NORMAL; |
377 | unlock_out: | 380 | unlock_out: |
@@ -383,8 +386,8 @@ do_ast: | |||
383 | if (past->type == DLM_AST) { | 386 | if (past->type == DLM_AST) { |
384 | /* do not alter lock refcount. switching lists. */ | 387 | /* do not alter lock refcount. switching lists. */ |
385 | list_move_tail(&lock->list, &res->granted); | 388 | list_move_tail(&lock->list, &res->granted); |
386 | mlog(0, "ast: adding to granted list... type=%d, " | 389 | mlog(0, "ast: Adding to granted list... type=%d, " |
387 | "convert_type=%d\n", lock->ml.type, lock->ml.convert_type); | 390 | "convert_type=%d\n", lock->ml.type, lock->ml.convert_type); |
388 | if (lock->ml.convert_type != LKM_IVMODE) { | 391 | if (lock->ml.convert_type != LKM_IVMODE) { |
389 | lock->ml.type = lock->ml.convert_type; | 392 | lock->ml.type = lock->ml.convert_type; |
390 | lock->ml.convert_type = LKM_IVMODE; | 393 | lock->ml.convert_type = LKM_IVMODE; |
@@ -408,7 +411,6 @@ do_ast: | |||
408 | dlm_do_local_bast(dlm, res, lock, past->blocked_type); | 411 | dlm_do_local_bast(dlm, res, lock, past->blocked_type); |
409 | 412 | ||
410 | leave: | 413 | leave: |
411 | |||
412 | if (res) | 414 | if (res) |
413 | dlm_lockres_put(res); | 415 | dlm_lockres_put(res); |
414 | 416 | ||
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index d5a86fb81a49..bb53714813ab 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
@@ -140,6 +140,7 @@ struct dlm_ctxt | |||
140 | unsigned int purge_count; | 140 | unsigned int purge_count; |
141 | spinlock_t spinlock; | 141 | spinlock_t spinlock; |
142 | spinlock_t ast_lock; | 142 | spinlock_t ast_lock; |
143 | spinlock_t track_lock; | ||
143 | char *name; | 144 | char *name; |
144 | u8 node_num; | 145 | u8 node_num; |
145 | u32 key; | 146 | u32 key; |
@@ -316,6 +317,8 @@ struct dlm_lock_resource | |||
316 | * put on a list for the dlm thread to run. */ | 317 | * put on a list for the dlm thread to run. */ |
317 | unsigned long last_used; | 318 | unsigned long last_used; |
318 | 319 | ||
320 | struct dlm_ctxt *dlm; | ||
321 | |||
319 | unsigned migration_pending:1; | 322 | unsigned migration_pending:1; |
320 | atomic_t asts_reserved; | 323 | atomic_t asts_reserved; |
321 | spinlock_t spinlock; | 324 | spinlock_t spinlock; |
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index 1b81dcba175d..b32f60a5acfb 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c | |||
@@ -630,43 +630,38 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos) | |||
630 | { | 630 | { |
631 | struct debug_lockres *dl = m->private; | 631 | struct debug_lockres *dl = m->private; |
632 | struct dlm_ctxt *dlm = dl->dl_ctxt; | 632 | struct dlm_ctxt *dlm = dl->dl_ctxt; |
633 | struct dlm_lock_resource *oldres = dl->dl_res; | ||
633 | struct dlm_lock_resource *res = NULL; | 634 | struct dlm_lock_resource *res = NULL; |
635 | struct list_head *track_list; | ||
634 | 636 | ||
635 | spin_lock(&dlm->spinlock); | 637 | spin_lock(&dlm->track_lock); |
638 | if (oldres) | ||
639 | track_list = &oldres->tracking; | ||
640 | else | ||
641 | track_list = &dlm->tracking_list; | ||
636 | 642 | ||
637 | if (dl->dl_res) { | 643 | list_for_each_entry(res, track_list, tracking) { |
638 | list_for_each_entry(res, &dl->dl_res->tracking, tracking) { | 644 | if (&res->tracking == &dlm->tracking_list) |
639 | if (dl->dl_res) { | 645 | res = NULL; |
640 | dlm_lockres_put(dl->dl_res); | 646 | else |
641 | dl->dl_res = NULL; | ||
642 | } | ||
643 | if (&res->tracking == &dlm->tracking_list) { | ||
644 | mlog(0, "End of list found, %p\n", res); | ||
645 | dl = NULL; | ||
646 | break; | ||
647 | } | ||
648 | dlm_lockres_get(res); | 647 | dlm_lockres_get(res); |
649 | dl->dl_res = res; | 648 | break; |
650 | break; | ||
651 | } | ||
652 | } else { | ||
653 | if (!list_empty(&dlm->tracking_list)) { | ||
654 | list_for_each_entry(res, &dlm->tracking_list, tracking) | ||
655 | break; | ||
656 | dlm_lockres_get(res); | ||
657 | dl->dl_res = res; | ||
658 | } else | ||
659 | dl = NULL; | ||
660 | } | 649 | } |
650 | spin_unlock(&dlm->track_lock); | ||
661 | 651 | ||
662 | if (dl) { | 652 | if (oldres) |
663 | spin_lock(&dl->dl_res->spinlock); | 653 | dlm_lockres_put(oldres); |
664 | dump_lockres(dl->dl_res, dl->dl_buf, dl->dl_len - 1); | ||
665 | spin_unlock(&dl->dl_res->spinlock); | ||
666 | } | ||
667 | 654 | ||
668 | spin_unlock(&dlm->spinlock); | 655 | dl->dl_res = res; |
656 | |||
657 | if (res) { | ||
658 | spin_lock(&res->spinlock); | ||
659 | dump_lockres(res, dl->dl_buf, dl->dl_len - 1); | ||
660 | spin_unlock(&res->spinlock); | ||
661 | } else | ||
662 | dl = NULL; | ||
669 | 663 | ||
664 | /* passed to seq_show */ | ||
670 | return dl; | 665 | return dl; |
671 | } | 666 | } |
672 | 667 | ||
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 63f8125824e8..d8d578f45613 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c | |||
@@ -1550,6 +1550,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, | |||
1550 | spin_lock_init(&dlm->spinlock); | 1550 | spin_lock_init(&dlm->spinlock); |
1551 | spin_lock_init(&dlm->master_lock); | 1551 | spin_lock_init(&dlm->master_lock); |
1552 | spin_lock_init(&dlm->ast_lock); | 1552 | spin_lock_init(&dlm->ast_lock); |
1553 | spin_lock_init(&dlm->track_lock); | ||
1553 | INIT_LIST_HEAD(&dlm->list); | 1554 | INIT_LIST_HEAD(&dlm->list); |
1554 | INIT_LIST_HEAD(&dlm->dirty_list); | 1555 | INIT_LIST_HEAD(&dlm->dirty_list); |
1555 | INIT_LIST_HEAD(&dlm->reco.resources); | 1556 | INIT_LIST_HEAD(&dlm->reco.resources); |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 44f87caf3683..54e182a27caf 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -505,8 +505,10 @@ void dlm_change_lockres_owner(struct dlm_ctxt *dlm, | |||
505 | static void dlm_lockres_release(struct kref *kref) | 505 | static void dlm_lockres_release(struct kref *kref) |
506 | { | 506 | { |
507 | struct dlm_lock_resource *res; | 507 | struct dlm_lock_resource *res; |
508 | struct dlm_ctxt *dlm; | ||
508 | 509 | ||
509 | res = container_of(kref, struct dlm_lock_resource, refs); | 510 | res = container_of(kref, struct dlm_lock_resource, refs); |
511 | dlm = res->dlm; | ||
510 | 512 | ||
511 | /* This should not happen -- all lockres' have a name | 513 | /* This should not happen -- all lockres' have a name |
512 | * associated with them at init time. */ | 514 | * associated with them at init time. */ |
@@ -515,6 +517,7 @@ static void dlm_lockres_release(struct kref *kref) | |||
515 | mlog(0, "destroying lockres %.*s\n", res->lockname.len, | 517 | mlog(0, "destroying lockres %.*s\n", res->lockname.len, |
516 | res->lockname.name); | 518 | res->lockname.name); |
517 | 519 | ||
520 | spin_lock(&dlm->track_lock); | ||
518 | if (!list_empty(&res->tracking)) | 521 | if (!list_empty(&res->tracking)) |
519 | list_del_init(&res->tracking); | 522 | list_del_init(&res->tracking); |
520 | else { | 523 | else { |
@@ -522,6 +525,9 @@ static void dlm_lockres_release(struct kref *kref) | |||
522 | res->lockname.len, res->lockname.name); | 525 | res->lockname.len, res->lockname.name); |
523 | dlm_print_one_lock_resource(res); | 526 | dlm_print_one_lock_resource(res); |
524 | } | 527 | } |
528 | spin_unlock(&dlm->track_lock); | ||
529 | |||
530 | dlm_put(dlm); | ||
525 | 531 | ||
526 | if (!hlist_unhashed(&res->hash_node) || | 532 | if (!hlist_unhashed(&res->hash_node) || |
527 | !list_empty(&res->granted) || | 533 | !list_empty(&res->granted) || |
@@ -595,6 +601,10 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm, | |||
595 | res->migration_pending = 0; | 601 | res->migration_pending = 0; |
596 | res->inflight_locks = 0; | 602 | res->inflight_locks = 0; |
597 | 603 | ||
604 | /* put in dlm_lockres_release */ | ||
605 | dlm_grab(dlm); | ||
606 | res->dlm = dlm; | ||
607 | |||
598 | kref_init(&res->refs); | 608 | kref_init(&res->refs); |
599 | 609 | ||
600 | /* just for consistency */ | 610 | /* just for consistency */ |
@@ -722,14 +732,21 @@ lookup: | |||
722 | if (tmpres) { | 732 | if (tmpres) { |
723 | int dropping_ref = 0; | 733 | int dropping_ref = 0; |
724 | 734 | ||
735 | spin_unlock(&dlm->spinlock); | ||
736 | |||
725 | spin_lock(&tmpres->spinlock); | 737 | spin_lock(&tmpres->spinlock); |
738 | /* We wait for the other thread that is mastering the resource */ | ||
739 | if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) { | ||
740 | __dlm_wait_on_lockres(tmpres); | ||
741 | BUG_ON(tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN); | ||
742 | } | ||
743 | |||
726 | if (tmpres->owner == dlm->node_num) { | 744 | if (tmpres->owner == dlm->node_num) { |
727 | BUG_ON(tmpres->state & DLM_LOCK_RES_DROPPING_REF); | 745 | BUG_ON(tmpres->state & DLM_LOCK_RES_DROPPING_REF); |
728 | dlm_lockres_grab_inflight_ref(dlm, tmpres); | 746 | dlm_lockres_grab_inflight_ref(dlm, tmpres); |
729 | } else if (tmpres->state & DLM_LOCK_RES_DROPPING_REF) | 747 | } else if (tmpres->state & DLM_LOCK_RES_DROPPING_REF) |
730 | dropping_ref = 1; | 748 | dropping_ref = 1; |
731 | spin_unlock(&tmpres->spinlock); | 749 | spin_unlock(&tmpres->spinlock); |
732 | spin_unlock(&dlm->spinlock); | ||
733 | 750 | ||
734 | /* wait until done messaging the master, drop our ref to allow | 751 | /* wait until done messaging the master, drop our ref to allow |
735 | * the lockres to be purged, start over. */ | 752 | * the lockres to be purged, start over. */ |
@@ -2949,7 +2966,7 @@ static int dlm_do_migrate_request(struct dlm_ctxt *dlm, | |||
2949 | struct dlm_node_iter *iter) | 2966 | struct dlm_node_iter *iter) |
2950 | { | 2967 | { |
2951 | struct dlm_migrate_request migrate; | 2968 | struct dlm_migrate_request migrate; |
2952 | int ret, status = 0; | 2969 | int ret, skip, status = 0; |
2953 | int nodenum; | 2970 | int nodenum; |
2954 | 2971 | ||
2955 | memset(&migrate, 0, sizeof(migrate)); | 2972 | memset(&migrate, 0, sizeof(migrate)); |
@@ -2966,12 +2983,27 @@ static int dlm_do_migrate_request(struct dlm_ctxt *dlm, | |||
2966 | nodenum == new_master) | 2983 | nodenum == new_master) |
2967 | continue; | 2984 | continue; |
2968 | 2985 | ||
2986 | /* We could race exit domain. If exited, skip. */ | ||
2987 | spin_lock(&dlm->spinlock); | ||
2988 | skip = (!test_bit(nodenum, dlm->domain_map)); | ||
2989 | spin_unlock(&dlm->spinlock); | ||
2990 | if (skip) { | ||
2991 | clear_bit(nodenum, iter->node_map); | ||
2992 | continue; | ||
2993 | } | ||
2994 | |||
2969 | ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key, | 2995 | ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key, |
2970 | &migrate, sizeof(migrate), nodenum, | 2996 | &migrate, sizeof(migrate), nodenum, |
2971 | &status); | 2997 | &status); |
2972 | if (ret < 0) | 2998 | if (ret < 0) { |
2973 | mlog_errno(ret); | 2999 | mlog(0, "migrate_request returned %d!\n", ret); |
2974 | else if (status < 0) { | 3000 | if (!dlm_is_host_down(ret)) { |
3001 | mlog(ML_ERROR, "unhandled error=%d!\n", ret); | ||
3002 | BUG(); | ||
3003 | } | ||
3004 | clear_bit(nodenum, iter->node_map); | ||
3005 | ret = 0; | ||
3006 | } else if (status < 0) { | ||
2975 | mlog(0, "migrate request (node %u) returned %d!\n", | 3007 | mlog(0, "migrate request (node %u) returned %d!\n", |
2976 | nodenum, status); | 3008 | nodenum, status); |
2977 | ret = status; | 3009 | ret = status; |
diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c index 4060bb328bc8..d1295203029f 100644 --- a/fs/ocfs2/dlm/dlmthread.c +++ b/fs/ocfs2/dlm/dlmthread.c | |||
@@ -181,7 +181,8 @@ static int dlm_purge_lockres(struct dlm_ctxt *dlm, | |||
181 | 181 | ||
182 | spin_lock(&res->spinlock); | 182 | spin_lock(&res->spinlock); |
183 | /* This ensures that clear refmap is sent after the set */ | 183 | /* This ensures that clear refmap is sent after the set */ |
184 | __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); | 184 | __dlm_wait_on_lockres_flags(res, (DLM_LOCK_RES_SETREF_INPROG | |
185 | DLM_LOCK_RES_MIGRATING)); | ||
185 | spin_unlock(&res->spinlock); | 186 | spin_unlock(&res->spinlock); |
186 | 187 | ||
187 | /* clear our bit from the master's refmap, ignore errors */ | 188 | /* clear our bit from the master's refmap, ignore errors */ |