SUNRPC: fix races on PipeFS MOUNT notifications
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Mon, 24 Jun 2013 07:52:38 +0000 (11:52 +0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 28 Jun 2013 19:41:18 +0000 (15:41 -0400)
commit384816051ca9125cd54750e59c780c2a2655fa4f
treeb7ef1f57a54d747f750c2ad8c8974b236ff9febf
parent52fcac988ae6d5a902e9c1d79fc11ba5ec9361e7
SUNRPC: fix races on PipeFS MOUNT notifications

Below are races, when RPC client can be created without PiepFS dentries

CPU#0 CPU#1
----------------------------- -----------------------------
rpc_new_client rpc_fill_super
rpc_setup_pipedir
mutex_lock(&sn->pipefs_sb_lock)
rpc_get_sb_net == NULL
(no per-net PipeFS superblock)
sn->pipefs_sb = sb;
notifier_call_chain(MOUNT)
(client is not in the list)
rpc_register_client
(client without pipes dentries)

To fix this patch:
1) makes PipeFS mount notification call with pipefs_sb_lock being held.
2) releases pipefs_sb_lock on new SUNRPC client creation only after
registration.

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Cc: stable@vger.kernel.org
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/clnt.c
net/sunrpc/rpc_pipe.c