• NeilBrown's avatar
    lockd: drop inappropriate svc_get() from locked_get() · 665e89ab
    NeilBrown authored
    The below-mentioned patch was intended to simplify refcounting on the
    svc_serv used by locked.  The goal was to only ever have a single
    reference from the single thread.  To that end we dropped a call to
    lockd_start_svc() (except when creating thread) which would take a
    reference, and dropped the svc_put(serv) that would drop that reference.
    
    Unfortunately we didn't also remove the svc_get() from
    lockd_create_svc() in the case where the svc_serv already existed.
    So after the patch:
     - on the first call the svc_serv was allocated and the one reference
       was given to the thread, so there are no extra references
     - on subsequent calls svc_get() was called so there is now an extra
       reference.
    This is clearly not consistent.
    
    The inconsistency is also clear in the current code in lockd_get()
    takes *two* references, one on nlmsvc_serv and one by incrementing
    nlmsvc_users.   This clearly does not match lockd_put().
    
    So: drop that svc_get() from lockd_get() (which used to be in
    lockd_create_svc().
    Reported-by: default avatarIdo Schimmel <idosch@idosch.org>
    Closes: https://lore.kernel.org/linux-nfs/ZHsI%2FH16VX9kJQX1@shredder/T/#u
    Fixes: b73a2972 ("lockd: move lockd_start_svc() call into lockd_create_svc()")
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Tested-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    665e89ab
svc.c 18.1 KB