fs: dlm: handle -EBUSY first in unlock validation
This patch checks for -EBUSY conditions in dlm_unlock() before checking for -EINVAL conditions (except for CANCEL and FORCEUNLOCK calls where a busy condition is expected.) There are no problems with the current ordering of checks, but this makes dlm_unlock() consistent with dlm_lock(), and may avoid future problems if other checks are added. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
Родитель
44637ca41d
Коммит
420ba3cd03
|
@ -2918,23 +2918,12 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
|
|||
static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
|
||||
{
|
||||
struct dlm_ls *ls = lkb->lkb_resource->res_ls;
|
||||
int rv = -EINVAL;
|
||||
int rv = -EBUSY;
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_MSTCPY) {
|
||||
log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id);
|
||||
dlm_print_lkb(lkb);
|
||||
/* normal unlock not allowed if there's any op in progress */
|
||||
if (!(args->flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK)) &&
|
||||
(lkb->lkb_wait_type || lkb->lkb_wait_count))
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* an lkb may still exist even though the lock is EOL'ed due to a
|
||||
cancel, unlock or failed noqueue request; an app can't use these
|
||||
locks; return same error as if the lkid had not been found at all */
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) {
|
||||
log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id);
|
||||
rv = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* an lkb may be waiting for an rsb lookup to complete where the
|
||||
lookup was initiated by another lock */
|
||||
|
@ -2949,7 +2938,24 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
|
|||
unhold_lkb(lkb); /* undoes create_lkb() */
|
||||
}
|
||||
/* caller changes -EBUSY to 0 for CANCEL and FORCEUNLOCK */
|
||||
rv = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rv = -EINVAL;
|
||||
if (lkb->lkb_flags & DLM_IFL_MSTCPY) {
|
||||
log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id);
|
||||
dlm_print_lkb(lkb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* an lkb may still exist even though the lock is EOL'ed due to a
|
||||
* cancel, unlock or failed noqueue request; an app can't use these
|
||||
* locks; return same error as if the lkid had not been found at all
|
||||
*/
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) {
|
||||
log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id);
|
||||
rv = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -3022,14 +3028,8 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
|
|||
goto out;
|
||||
}
|
||||
/* add_to_waiters() will set OVERLAP_UNLOCK */
|
||||
goto out_ok;
|
||||
}
|
||||
|
||||
/* normal unlock not allowed if there's any op in progress */
|
||||
rv = -EBUSY;
|
||||
if (lkb->lkb_wait_type || lkb->lkb_wait_count)
|
||||
goto out;
|
||||
|
||||
out_ok:
|
||||
/* an overlapping op shouldn't blow away exflags from other op */
|
||||
lkb->lkb_exflags |= args->flags;
|
||||
|
|
Загрузка…
Ссылка в новой задаче