• Andreas Gruenbacher's avatar
    gfs2: Expect -EBUSY after canceling dlm locking requests · a892b123
    Andreas Gruenbacher authored
    Due to the asynchronous nature of the dlm api, when we request a pending
    locking request to be canceled with dlm_unlock(DLM_LKF_CANCEL), the
    locking request will either complete before it could be canceled, or the
    cancellation will succeed.  In either case, gdlm_ast will be called once
    and the status will indicate the outcome of the locking request, with
    -DLM_ECANCEL indicating a canceled request.
    
    Inside dlm, when a locking request completes before its cancel request
    could be processed, gdlm_ast will be called, but the lock will still be
    considered busy until a DLM_MSG_CANCEL_REPLY message completes the
    cancel request.  During that time, successive dlm_lock() or dlm_unlock()
    requests for that lock will return -EBUSY.  In other words, waiting for
    the gdlm_ast call before issuing the next locking request is not enough.
    There is no way of waiting for a cancel request to actually complete,
    either.
    
    We rarely cancel locking requests, but when we do, we don't know when
    the next locking request for that lock will occur.  This means that any
    dlm_lock() or dlm_unlock() call can potentially return -EBUSY.  When
    that happens, this patch simply repeats the request after a short pause.
    
    This workaround could be improved upon by tracking for which dlm locks
    cancel requests have been issued, but that isn't strictly necessary and
    it would complicate the code.  We haven't seen -EBUSY errors from dlm
    without cancel requests.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    a892b123
lock_dlm.c 40.7 KB