diff options
-rw-r--r-- | fs/dlm/lock.c | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c index 80487703d582..85a0e73ba808 100644 --- a/fs/dlm/lock.c +++ b/fs/dlm/lock.c | |||
@@ -591,9 +591,11 @@ static void kill_lkb(struct kref *kref) | |||
591 | DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); | 591 | DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); |
592 | } | 592 | } |
593 | 593 | ||
594 | static int put_lkb(struct dlm_lkb *lkb) | 594 | /* __put_lkb() is used when an lkb may not have an rsb attached to |
595 | it so we need to provide the lockspace explicitly */ | ||
596 | |||
597 | static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb) | ||
595 | { | 598 | { |
596 | struct dlm_ls *ls = lkb->lkb_resource->res_ls; | ||
597 | uint16_t bucket = lkb->lkb_id & 0xFFFF; | 599 | uint16_t bucket = lkb->lkb_id & 0xFFFF; |
598 | 600 | ||
599 | write_lock(&ls->ls_lkbtbl[bucket].lock); | 601 | write_lock(&ls->ls_lkbtbl[bucket].lock); |
@@ -616,7 +618,13 @@ static int put_lkb(struct dlm_lkb *lkb) | |||
616 | 618 | ||
617 | int dlm_put_lkb(struct dlm_lkb *lkb) | 619 | int dlm_put_lkb(struct dlm_lkb *lkb) |
618 | { | 620 | { |
619 | return put_lkb(lkb); | 621 | struct dlm_ls *ls; |
622 | |||
623 | DLM_ASSERT(lkb->lkb_resource, dlm_print_lkb(lkb);); | ||
624 | DLM_ASSERT(lkb->lkb_resource->res_ls, dlm_print_lkb(lkb);); | ||
625 | |||
626 | ls = lkb->lkb_resource->res_ls; | ||
627 | return __put_lkb(ls, lkb); | ||
620 | } | 628 | } |
621 | 629 | ||
622 | /* This is only called to add a reference when the code already holds | 630 | /* This is only called to add a reference when the code already holds |
@@ -1949,7 +1957,7 @@ int dlm_lock(dlm_lockspace_t *lockspace, | |||
1949 | error = 0; | 1957 | error = 0; |
1950 | out_put: | 1958 | out_put: |
1951 | if (convert || error) | 1959 | if (convert || error) |
1952 | put_lkb(lkb); | 1960 | __put_lkb(ls, lkb); |
1953 | if (error == -EAGAIN) | 1961 | if (error == -EAGAIN) |
1954 | error = 0; | 1962 | error = 0; |
1955 | out: | 1963 | out: |
@@ -1991,7 +1999,7 @@ int dlm_unlock(dlm_lockspace_t *lockspace, | |||
1991 | if (error == -DLM_EUNLOCK || error == -DLM_ECANCEL) | 1999 | if (error == -DLM_EUNLOCK || error == -DLM_ECANCEL) |
1992 | error = 0; | 2000 | error = 0; |
1993 | out_put: | 2001 | out_put: |
1994 | put_lkb(lkb); | 2002 | dlm_put_lkb(lkb); |
1995 | out: | 2003 | out: |
1996 | unlock_recovery(ls); | 2004 | unlock_recovery(ls); |
1997 | dlm_put_lockspace(ls); | 2005 | dlm_put_lockspace(ls); |
@@ -2442,7 +2450,7 @@ static void receive_request(struct dlm_ls *ls, struct dlm_message *ms) | |||
2442 | lkb->lkb_flags |= DLM_IFL_MSTCPY; | 2450 | lkb->lkb_flags |= DLM_IFL_MSTCPY; |
2443 | error = receive_request_args(ls, lkb, ms); | 2451 | error = receive_request_args(ls, lkb, ms); |
2444 | if (error) { | 2452 | if (error) { |
2445 | put_lkb(lkb); | 2453 | __put_lkb(ls, lkb); |
2446 | goto fail; | 2454 | goto fail; |
2447 | } | 2455 | } |
2448 | 2456 | ||
@@ -2450,7 +2458,7 @@ static void receive_request(struct dlm_ls *ls, struct dlm_message *ms) | |||
2450 | 2458 | ||
2451 | error = find_rsb(ls, ms->m_extra, namelen, R_MASTER, &r); | 2459 | error = find_rsb(ls, ms->m_extra, namelen, R_MASTER, &r); |
2452 | if (error) { | 2460 | if (error) { |
2453 | put_lkb(lkb); | 2461 | __put_lkb(ls, lkb); |
2454 | goto fail; | 2462 | goto fail; |
2455 | } | 2463 | } |
2456 | 2464 | ||
@@ -2466,7 +2474,7 @@ static void receive_request(struct dlm_ls *ls, struct dlm_message *ms) | |||
2466 | if (error == -EINPROGRESS) | 2474 | if (error == -EINPROGRESS) |
2467 | error = 0; | 2475 | error = 0; |
2468 | if (error) | 2476 | if (error) |
2469 | put_lkb(lkb); | 2477 | dlm_put_lkb(lkb); |
2470 | return; | 2478 | return; |
2471 | 2479 | ||
2472 | fail: | 2480 | fail: |
@@ -2502,7 +2510,7 @@ static void receive_convert(struct dlm_ls *ls, struct dlm_message *ms) | |||
2502 | 2510 | ||
2503 | unlock_rsb(r); | 2511 | unlock_rsb(r); |
2504 | put_rsb(r); | 2512 | put_rsb(r); |
2505 | put_lkb(lkb); | 2513 | dlm_put_lkb(lkb); |
2506 | return; | 2514 | return; |
2507 | 2515 | ||
2508 | fail: | 2516 | fail: |
@@ -2536,7 +2544,7 @@ static void receive_unlock(struct dlm_ls *ls, struct dlm_message *ms) | |||
2536 | 2544 | ||
2537 | unlock_rsb(r); | 2545 | unlock_rsb(r); |
2538 | put_rsb(r); | 2546 | put_rsb(r); |
2539 | put_lkb(lkb); | 2547 | dlm_put_lkb(lkb); |
2540 | return; | 2548 | return; |
2541 | 2549 | ||
2542 | fail: | 2550 | fail: |
@@ -2566,7 +2574,7 @@ static void receive_cancel(struct dlm_ls *ls, struct dlm_message *ms) | |||
2566 | 2574 | ||
2567 | unlock_rsb(r); | 2575 | unlock_rsb(r); |
2568 | put_rsb(r); | 2576 | put_rsb(r); |
2569 | put_lkb(lkb); | 2577 | dlm_put_lkb(lkb); |
2570 | return; | 2578 | return; |
2571 | 2579 | ||
2572 | fail: | 2580 | fail: |
@@ -2598,7 +2606,7 @@ static void receive_grant(struct dlm_ls *ls, struct dlm_message *ms) | |||
2598 | 2606 | ||
2599 | unlock_rsb(r); | 2607 | unlock_rsb(r); |
2600 | put_rsb(r); | 2608 | put_rsb(r); |
2601 | put_lkb(lkb); | 2609 | dlm_put_lkb(lkb); |
2602 | } | 2610 | } |
2603 | 2611 | ||
2604 | static void receive_bast(struct dlm_ls *ls, struct dlm_message *ms) | 2612 | static void receive_bast(struct dlm_ls *ls, struct dlm_message *ms) |
@@ -2623,7 +2631,7 @@ static void receive_bast(struct dlm_ls *ls, struct dlm_message *ms) | |||
2623 | 2631 | ||
2624 | unlock_rsb(r); | 2632 | unlock_rsb(r); |
2625 | put_rsb(r); | 2633 | put_rsb(r); |
2626 | put_lkb(lkb); | 2634 | dlm_put_lkb(lkb); |
2627 | } | 2635 | } |
2628 | 2636 | ||
2629 | static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms) | 2637 | static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms) |
@@ -2746,7 +2754,7 @@ static void receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms) | |||
2746 | unlock_rsb(r); | 2754 | unlock_rsb(r); |
2747 | put_rsb(r); | 2755 | put_rsb(r); |
2748 | out: | 2756 | out: |
2749 | put_lkb(lkb); | 2757 | dlm_put_lkb(lkb); |
2750 | } | 2758 | } |
2751 | 2759 | ||
2752 | static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, | 2760 | static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, |
@@ -2813,7 +2821,7 @@ static void receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms) | |||
2813 | 2821 | ||
2814 | _receive_convert_reply(lkb, ms); | 2822 | _receive_convert_reply(lkb, ms); |
2815 | out: | 2823 | out: |
2816 | put_lkb(lkb); | 2824 | dlm_put_lkb(lkb); |
2817 | } | 2825 | } |
2818 | 2826 | ||
2819 | static void _receive_unlock_reply(struct dlm_lkb *lkb, struct dlm_message *ms) | 2827 | static void _receive_unlock_reply(struct dlm_lkb *lkb, struct dlm_message *ms) |
@@ -2860,7 +2868,7 @@ static void receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms) | |||
2860 | 2868 | ||
2861 | _receive_unlock_reply(lkb, ms); | 2869 | _receive_unlock_reply(lkb, ms); |
2862 | out: | 2870 | out: |
2863 | put_lkb(lkb); | 2871 | dlm_put_lkb(lkb); |
2864 | } | 2872 | } |
2865 | 2873 | ||
2866 | static void _receive_cancel_reply(struct dlm_lkb *lkb, struct dlm_message *ms) | 2874 | static void _receive_cancel_reply(struct dlm_lkb *lkb, struct dlm_message *ms) |
@@ -2907,7 +2915,7 @@ static void receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms) | |||
2907 | 2915 | ||
2908 | _receive_cancel_reply(lkb, ms); | 2916 | _receive_cancel_reply(lkb, ms); |
2909 | out: | 2917 | out: |
2910 | put_lkb(lkb); | 2918 | dlm_put_lkb(lkb); |
2911 | } | 2919 | } |
2912 | 2920 | ||
2913 | static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) | 2921 | static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) |
@@ -2954,7 +2962,7 @@ static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms) | |||
2954 | unlock_rsb(r); | 2962 | unlock_rsb(r); |
2955 | put_rsb(r); | 2963 | put_rsb(r); |
2956 | out: | 2964 | out: |
2957 | put_lkb(lkb); | 2965 | dlm_put_lkb(lkb); |
2958 | } | 2966 | } |
2959 | 2967 | ||
2960 | int dlm_receive_message(struct dlm_header *hd, int nodeid, int recovery) | 2968 | int dlm_receive_message(struct dlm_header *hd, int nodeid, int recovery) |
@@ -3159,7 +3167,7 @@ void dlm_recover_waiters_pre(struct dlm_ls *ls) | |||
3159 | ls->ls_stub_ms.m_result = -DLM_EUNLOCK; | 3167 | ls->ls_stub_ms.m_result = -DLM_EUNLOCK; |
3160 | _remove_from_waiters(lkb); | 3168 | _remove_from_waiters(lkb); |
3161 | _receive_unlock_reply(lkb, &ls->ls_stub_ms); | 3169 | _receive_unlock_reply(lkb, &ls->ls_stub_ms); |
3162 | put_lkb(lkb); | 3170 | dlm_put_lkb(lkb); |
3163 | break; | 3171 | break; |
3164 | 3172 | ||
3165 | case DLM_MSG_CANCEL: | 3173 | case DLM_MSG_CANCEL: |
@@ -3167,7 +3175,7 @@ void dlm_recover_waiters_pre(struct dlm_ls *ls) | |||
3167 | ls->ls_stub_ms.m_result = -DLM_ECANCEL; | 3175 | ls->ls_stub_ms.m_result = -DLM_ECANCEL; |
3168 | _remove_from_waiters(lkb); | 3176 | _remove_from_waiters(lkb); |
3169 | _receive_cancel_reply(lkb, &ls->ls_stub_ms); | 3177 | _receive_cancel_reply(lkb, &ls->ls_stub_ms); |
3170 | put_lkb(lkb); | 3178 | dlm_put_lkb(lkb); |
3171 | break; | 3179 | break; |
3172 | 3180 | ||
3173 | default: | 3181 | default: |
@@ -3272,7 +3280,7 @@ static void purge_queue(struct dlm_rsb *r, struct list_head *queue, | |||
3272 | if (test(ls, lkb)) { | 3280 | if (test(ls, lkb)) { |
3273 | del_lkb(r, lkb); | 3281 | del_lkb(r, lkb); |
3274 | /* this put should free the lkb */ | 3282 | /* this put should free the lkb */ |
3275 | if (!put_lkb(lkb)) | 3283 | if (!dlm_put_lkb(lkb)) |
3276 | log_error(ls, "purged lkb not released"); | 3284 | log_error(ls, "purged lkb not released"); |
3277 | } | 3285 | } |
3278 | } | 3286 | } |
@@ -3456,7 +3464,7 @@ int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc) | |||
3456 | 3464 | ||
3457 | error = receive_rcom_lock_args(ls, lkb, r, rc); | 3465 | error = receive_rcom_lock_args(ls, lkb, r, rc); |
3458 | if (error) { | 3466 | if (error) { |
3459 | put_lkb(lkb); | 3467 | __put_lkb(ls, lkb); |
3460 | goto out_unlock; | 3468 | goto out_unlock; |
3461 | } | 3469 | } |
3462 | 3470 | ||
@@ -3518,7 +3526,7 @@ int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc) | |||
3518 | 3526 | ||
3519 | unlock_rsb(r); | 3527 | unlock_rsb(r); |
3520 | put_rsb(r); | 3528 | put_rsb(r); |
3521 | put_lkb(lkb); | 3529 | dlm_put_lkb(lkb); |
3522 | 3530 | ||
3523 | return 0; | 3531 | return 0; |
3524 | } | 3532 | } |