mirror of
https://github.com/torvalds/linux
synced 2024-09-06 09:51:23 +00:00
dlm: revert atomic_t lkb_wait_count
Revert "fs: dlm: handle lkb wait count as atomic_t"
This reverts commit 75a7d60134
.
This counter does not need to be atomic. As the comment in
the reverted commit mentions, the counter is protected by
the rsb lock.
Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
2ab3d705ca
commit
484b4f90c2
|
@ -246,7 +246,7 @@ struct dlm_lkb {
|
|||
int8_t lkb_highbast; /* highest mode bast sent for */
|
||||
|
||||
int8_t lkb_wait_type; /* type of reply waiting for */
|
||||
atomic_t lkb_wait_count;
|
||||
int8_t lkb_wait_count;
|
||||
int lkb_wait_nodeid; /* for debugging */
|
||||
|
||||
struct list_head lkb_statequeue; /* rsb g/c/w list */
|
||||
|
|
|
@ -1407,7 +1407,6 @@ static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid)
|
|||
{
|
||||
struct dlm_ls *ls = lkb->lkb_resource->res_ls;
|
||||
int error = 0;
|
||||
int wc;
|
||||
|
||||
mutex_lock(&ls->ls_waiters_mutex);
|
||||
|
||||
|
@ -1429,17 +1428,20 @@ static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid)
|
|||
error = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
wc = atomic_inc_return(&lkb->lkb_wait_count);
|
||||
lkb->lkb_wait_count++;
|
||||
hold_lkb(lkb);
|
||||
|
||||
log_debug(ls, "addwait %x cur %d overlap %d count %d f %x",
|
||||
lkb->lkb_id, lkb->lkb_wait_type, mstype, wc,
|
||||
dlm_iflags_val(lkb));
|
||||
lkb->lkb_id, lkb->lkb_wait_type, mstype,
|
||||
lkb->lkb_wait_count, dlm_iflags_val(lkb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
wc = atomic_fetch_inc(&lkb->lkb_wait_count);
|
||||
DLM_ASSERT(!wc, dlm_print_lkb(lkb); printk("wait_count %d\n", wc););
|
||||
DLM_ASSERT(!lkb->lkb_wait_count,
|
||||
dlm_print_lkb(lkb);
|
||||
printk("wait_count %d\n", lkb->lkb_wait_count););
|
||||
|
||||
lkb->lkb_wait_count++;
|
||||
lkb->lkb_wait_type = mstype;
|
||||
lkb->lkb_wait_nodeid = to_nodeid; /* for debugging */
|
||||
hold_lkb(lkb);
|
||||
|
@ -1502,7 +1504,7 @@ static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype,
|
|||
log_debug(ls, "remwait %x convert_reply zap overlap_cancel",
|
||||
lkb->lkb_id);
|
||||
lkb->lkb_wait_type = 0;
|
||||
atomic_dec(&lkb->lkb_wait_count);
|
||||
lkb->lkb_wait_count--;
|
||||
unhold_lkb(lkb);
|
||||
goto out_del;
|
||||
}
|
||||
|
@ -1529,15 +1531,16 @@ static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype,
|
|||
if (overlap_done && lkb->lkb_wait_type) {
|
||||
log_error(ls, "remwait error %x reply %d wait_type %d overlap",
|
||||
lkb->lkb_id, mstype, lkb->lkb_wait_type);
|
||||
atomic_dec(&lkb->lkb_wait_count);
|
||||
lkb->lkb_wait_count--;
|
||||
unhold_lkb(lkb);
|
||||
lkb->lkb_wait_type = 0;
|
||||
}
|
||||
|
||||
DLM_ASSERT(atomic_read(&lkb->lkb_wait_count), dlm_print_lkb(lkb););
|
||||
DLM_ASSERT(lkb->lkb_wait_count, dlm_print_lkb(lkb););
|
||||
|
||||
clear_bit(DLM_IFL_RESEND_BIT, &lkb->lkb_iflags);
|
||||
if (atomic_dec_and_test(&lkb->lkb_wait_count))
|
||||
lkb->lkb_wait_count--;
|
||||
if (!lkb->lkb_wait_count)
|
||||
list_del_init(&lkb->lkb_wait_reply);
|
||||
unhold_lkb(lkb);
|
||||
return 0;
|
||||
|
@ -2666,7 +2669,7 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
|
|||
goto out;
|
||||
|
||||
/* lock not allowed if there's any op in progress */
|
||||
if (lkb->lkb_wait_type || atomic_read(&lkb->lkb_wait_count))
|
||||
if (lkb->lkb_wait_type || lkb->lkb_wait_count)
|
||||
goto out;
|
||||
|
||||
if (is_overlap(lkb))
|
||||
|
@ -2728,7 +2731,7 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
|
|||
|
||||
/* normal unlock not allowed if there's any op in progress */
|
||||
if (!(args->flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK)) &&
|
||||
(lkb->lkb_wait_type || atomic_read(&lkb->lkb_wait_count)))
|
||||
(lkb->lkb_wait_type || lkb->lkb_wait_count))
|
||||
goto out;
|
||||
|
||||
/* an lkb may be waiting for an rsb lookup to complete where the
|
||||
|
@ -5070,9 +5073,10 @@ int dlm_recover_waiters_post(struct dlm_ls *ls)
|
|||
/* drop all wait_count references we still
|
||||
* hold a reference for this iteration.
|
||||
*/
|
||||
while (!atomic_dec_and_test(&lkb->lkb_wait_count))
|
||||
while (lkb->lkb_wait_count) {
|
||||
lkb->lkb_wait_count--;
|
||||
unhold_lkb(lkb);
|
||||
|
||||
}
|
||||
mutex_lock(&ls->ls_waiters_mutex);
|
||||
list_del_init(&lkb->lkb_wait_reply);
|
||||
mutex_unlock(&ls->ls_waiters_mutex);
|
||||
|
|
Loading…
Reference in a new issue