diff options
author | Stanislav Kinsbursky <skinsbursky@parallels.com> | 2013-06-26 06:15:14 (GMT) |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-06-28 19:42:02 (GMT) |
commit | adb6fa7ffe9031857ec14b8aab75c9ab65556cbc (patch) | |
tree | 4d13bd7bf95d0c24478e95f429d6b4e6bbf5a6a5 /net/netlabel | |
parent | 384816051ca9125cd54750e59c780c2a2655fa4f (diff) | |
download | linux-adb6fa7ffe9031857ec14b8aab75c9ab65556cbc.tar.xz |
SUNRPC: fix races on PipeFS UMOUNT notifications
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: Stanislav Kinsbursky <skinsbursky@parallels.com>
Cc: stable@vger.kernel.org
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/netlabel')
0 files changed, 0 insertions, 0 deletions