Skip to content

Commit e6614b8

Browse files
Sean ChangTrond Myklebust
authored andcommitted
NFS: Fix RCU dereference of cl_xprt in nfs_compare_super_address
The cl_xprt pointer in struct rpc_clnt is marked as __rcu. Accessing it directly in nfs_compare_super_address() is unsafe and triggers Sparse warnings. Fix this by using rcu_dereference() within an RCU read-side critical section to retrieve the transport pointer. This addresses the sparse warning and ensures atomic access to the pointer, as the transport can be updated via transport switching even while the superblock remains active under sb_lock. Fixes: 7e3fcf6 ("nfs: don't share mounts between network namespaces") Signed-off-by: Sean Chang <seanwascoding@gmail.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent e8a44ae commit e6614b8

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

fs/nfs/super.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,12 +1166,18 @@ static int nfs_set_super(struct super_block *s, struct fs_context *fc)
11661166
static int nfs_compare_super_address(struct nfs_server *server1,
11671167
struct nfs_server *server2)
11681168
{
1169+
struct rpc_xprt *xprt1, *xprt2;
11691170
struct sockaddr *sap1, *sap2;
1170-
struct rpc_xprt *xprt1 = server1->client->cl_xprt;
1171-
struct rpc_xprt *xprt2 = server2->client->cl_xprt;
1171+
1172+
rcu_read_lock();
1173+
1174+
xprt1 = rcu_dereference(server1->client->cl_xprt);
1175+
xprt2 = rcu_dereference(server2->client->cl_xprt);
11721176

11731177
if (!net_eq(xprt1->xprt_net, xprt2->xprt_net))
1174-
return 0;
1178+
goto out_unlock;
1179+
1180+
rcu_read_unlock();
11751181

11761182
sap1 = (struct sockaddr *)&server1->nfs_client->cl_addr;
11771183
sap2 = (struct sockaddr *)&server2->nfs_client->cl_addr;
@@ -1203,6 +1209,10 @@ static int nfs_compare_super_address(struct nfs_server *server1,
12031209
}
12041210

12051211
return 1;
1212+
1213+
out_unlock:
1214+
rcu_read_unlock();
1215+
return 0;
12061216
}
12071217

12081218
static int nfs_compare_userns(const struct nfs_server *old,

0 commit comments

Comments
 (0)