• Jeff Layton's avatar
    lockd: fix races in client GRANTED_MSG wait logic · 2005f5b9
    Jeff Layton authored
    After the wait for a grant is done (for whatever reason), nlmclnt_block
    updates the status of the nlm_rqst with the status of the block. At the
    point it does this, however, the block is still queued its status could
    change at any time.
    
    This is particularly a problem when the waiting task is signaled during
    the wait. We can end up giving up on the lock just before the GRANTED_MSG
    callback comes in, and accept it even though the lock request gets back
    an error, leaving a dangling lock on the server.
    
    Since the nlm_wait never lives beyond the end of nlmclnt_lock, put it on
    the stack and add functions to allow us to enqueue and dequeue the
    block. Enqueue it just before the lock/wait loop, and dequeue it
    just after we exit the loop instead of waiting until the end of
    the function. Also, scrape the status at the time that we dequeue it to
    ensure that it's final.
    Reported-by: default avatarYongcheng Yang <yoyang@redhat.com>
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2063818Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    2005f5b9
clntproc.c 21.9 KB