• S
    SUNRPC: fix races on PipeFS UMOUNT notifications · adb6fa7f
    Stanislav Kinsbursky 提交于
    CPU#0                                   CPU#1
    -----------------------------           -----------------------------
    rpc_kill_sb
    sn->pipefs_sb = NULL                    rpc_release_client
    (UMOUNT_EVENT)                          rpc_free_auth
    rpc_pipefs_event
    rpc_get_client_for_event
    !atomic_inc_not_zero(cl_count)
    <skip the client>
                                            atomic_inc(cl_count)
                                            rpc_free_client
                                            rpc_clnt_remove_pipedir
                                            <skip client dir removing>
    
    To fix this, this patch does the following:
    
    1) Calls RPC_PIPEFS_UMOUNT notification with sn->pipefs_sb_lock being held.
    2) Removes SUNRPC client from the list AFTER pipes destroying.
    3) Doesn't hold RPC client on notification: if client in the list, then it
    can't be destroyed while sn->pipefs_sb_lock in hold by notification caller.
    Signed-off-by: NStanislav Kinsbursky <skinsbursky@parallels.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
    adb6fa7f
rpc_pipe.c 28.8 KB