• Chuck Lever's avatar
    NFSD: Fix BUG during NFSD shutdown processing · 1cd9cd16
    Chuck Lever authored
    The Linux NFS server can be started via a user-space write to
    /proc/fs/nfs/threads or to /proc/fs/nfs/portlist.  In the first case,
    all default listeners are started (both UDP and TCP).  In the second,
    a listener is started only for one specified transport.
    
    The NFS server has to make sure lockd stays up until the last listener
    transport goes away.  To support both start-up interfaces, it should
    do one lockd_up() for each NFSD listener.
    
    The nfsd_init_socks() function used to do one lockd_up() call for each
    svc_create_xprt().  Recently commit
    26a41409 mistakenly changed
    nfsd_init_socks() to do only one lockd_up() call even though it still
    does two svc_create_xprt() calls.
    
    The end result is a lockd_down() BUG during NFSD shutdown processing
    because nfsd_last_threads() does a lockd_down() call for each entry
    on the sv_permsocks list, but the start-up code doesn't do a matching
    number of lockd_up() calls.
    
    Add a second lockd_up() in nfsd_init_socks() to make sure the number
    of lockd_up() calls matches the number of entries on the NFS servers's
    sv_permsocks list.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
    1cd9cd16
nfssvc.c 13.3 KB