• Benjamin Coddington's avatar
    NFSv4.1: Fix a race where CB_NOTIFY_LOCK fails to wake a waiter · b7dbcc0e
    Benjamin Coddington authored
    nfs4_retry_setlk() sets the task's state to TASK_INTERRUPTIBLE within the
    same region protected by the wait_queue's lock after checking for a
    notification from CB_NOTIFY_LOCK callback.  However, after releasing that
    lock, a wakeup for that task may race in before the call to
    freezable_schedule_timeout_interruptible() and set TASK_WAKING, then
    freezable_schedule_timeout_interruptible() will set the state back to
    TASK_INTERRUPTIBLE before the task will sleep.  The result is that the task
    will sleep for the entire duration of the timeout.
    
    Since we've already set TASK_INTERRUPTIBLE in the locked section, just use
    freezable_schedule_timout() instead.
    
    Fixes: a1d617d8 ("nfs: allow blocking locks to be awoken by lock callbacks")
    Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
    Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
    Cc: stable@vger.kernel.org # v4.9+
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    b7dbcc0e
nfs4proc.c 253 KB