When the first CB_NOTIFY_LOCK wakes a waiter, it can still fail to acquire the lock. Then it might goes to sleep again. However it's removed from the wait queue and not put back. So when the CB_NOTIFY_LOCK comes again, it fails to wake this waiter. Signed-off-by: Yihao Wu <wuyihao@xxxxxxxxxxxxxxxxx> --- fs/nfs/nfs4proc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f13ea09..9de2c2d 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -6932,6 +6932,10 @@ struct nfs4_lock_waiter { status = -ERESTARTSYS; wait_woken(&wait, TASK_INTERRUPTIBLE, NFS4_LOCK_MAXTIMEOUT); + if (!signalled()) { + finish_wait(q, &wait); + add_wait_queue(q, &wait); + } } finish_wait(q, &wait); -- 1.8.3.1