• Trond Myklebust's avatar
    NFSv4.1: Prevent deadlocks between state recovery and file locking · 9a99af49
    Trond Myklebust authored
    We currently have a deadlock in which the state recovery thread
    ends up blocking due to one of the locks which it is trying to
    recover holding the nfs_inode->rwsem.
    The situation is as follows: the state recovery thread is
    scheduled in order to recover from a reboot. It immediately
    drains the session, forcing all ordinary NFSv4.1 calls to
    nfs41_setup_sequence() to be put to sleep.  This includes the
    file locking process that holds the nfs_inode->rwsem.
    When the thread gets to nfs4_reclaim_locks(), it tries to
    grab a write lock on nfs_inode->rwsem, and boom...
    
    Fix is to have the lock drop the nfs_inode->rwsem while it is
    doing RPC calls. We use a sequence lock in order to signal to
    the locking process whether or not a state recovery thread has
    run on that inode, in which case it should retry the lock.
    Reported-by: default avatarAndy Adamson <andros@netapp.com>
    Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
    9a99af49
nfs4proc.c 181 KB