• Ilya Dryomov's avatar
    rbd: prevent busy loop when requesting exclusive lock · 9d01e07f
    Ilya Dryomov authored
    Due to rbd_try_acquire_lock() effectively swallowing all but
    EBLOCKLISTED error from rbd_try_lock() ("request lock anyway") and
    rbd_request_lock() returning ETIMEDOUT error not only for an actual
    notify timeout but also when the lock owner doesn't respond, a busy
    loop inside of rbd_acquire_lock() between rbd_try_acquire_lock() and
    rbd_request_lock() is possible.
    
    Requesting the lock on EBUSY error (returned by get_lock_owner_info()
    if an incompatible lock or invalid lock owner is detected) makes very
    little sense.  The same goes for ETIMEDOUT error (might pop up pretty
    much anywhere if osd_request_timeout option is set) and many others.
    
    Just fail I/O requests on rbd_dev->acquiring_list immediately on any
    error from rbd_try_lock().
    
    Cc: stable@vger.kernel.org # 58815900: rbd: retrieve and check lock owner twice before blocklisting
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    Reviewed-by: default avatarDongsheng Yang <dongsheng.yang@easystack.cn>
    9d01e07f
rbd.c 185 KB