• NeilBrown's avatar
    [PATCH] knfsd: fix a race in closing NFSd connections · aaf68cfb
    NeilBrown authored
    If you lose this race, it can iput a socket inode twice and you get a BUG
    in fs/inode.c
    
    When I added the option for user-space to close a socket, I added some
    cruft to svc_delete_socket so that I could call that function when closing
    a socket per user-space request.
    
    This was the wrong thing to do.  I should have just set SK_CLOSE and let
    normal mechanisms do the work.
    
    Not only wrong, but buggy.  The locking is all wrong and it openned up a
    race where-by a socket could be closed twice.
    
    So this patch:
      Introduces svc_close_socket which sets SK_CLOSE then either leave
      the close up to a thread, or calls svc_delete_socket if it can
      get SK_BUSY.
    
      Adds a bias to sk_busy which is removed when SK_DEAD is set,
      This avoid races around shutting down the socket.
    
      Changes several 'spin_lock' to 'spin_lock_bh' where the _bh
      was missing.
    
    Bugzilla-url: http://bugzilla.kernel.org/show_bug.cgi?id=7916Signed-off-by: default avatarNeil Brown <neilb@suse.de>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    aaf68cfb
svc.c 21.9 KB