From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 374402D9780 for ; Sun, 19 Apr 2026 16:31:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776616311; cv=none; b=VbObpFvIHURYhW5quw7LgCwih1tiQcntP/0992Rw5Edi9mXn4WiKpNdfLJXa/ByGJNY0HII7iPU1OGSrHkAy9ABeGHF92jxLsGK7bZmVBnjBva9QEygcLZpLagB+TbrAQnx7mfuwGqt7k2rEgKY55nzUOvs+xADfmPF5MFG+LX0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776616311; c=relaxed/simple; bh=ff8TxayYcJM1Xb+UydnUDsukyJ/CSZYuBMqv05UKuK0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=raZKXy8PVfV+OBQ1uYX/y0tXFMSx4JN04myOJqJsnIRNJY6vYR8CVswpUZUk7bQjRHHpv9qUXylUEnYAT8TYMkIeHiHBb0rXVqqWRukXiMo4KPBs8GWouR5S36Xibw7B2DzSCNsk73gtNTt9TFvU+fPvozVB/KFHon5rKlvdyL4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KeqJ+m/0; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KeqJ+m/0" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-36146ae9dd4so1499004a91.3 for ; Sun, 19 Apr 2026 09:31:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776616308; x=1777221108; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uG+XFyafSRmvtoGWdsZ9aUvZEWjPbX53j6Q6FbiLCsc=; b=KeqJ+m/0HPbb73W3Yzk3i8buTW8tF2D+Zy2qM99GHjF1GDp/AgZpWtt5nTywexnE30 oTLR6pGbNWBfGFV3QkUGyMp4x3+4fuOEK9OErEDMRFyxrZg5Vs/KMX6hKNR3h/yMQ+6W 0j5HZk+p5t1SyipMGDnO741pM9rCGYn5eh/yFx+hINq80Pz5ERTFfBjTj+G3HP4rjMAJ Iy1gQAJo7BWCtoTK5wG1RFi+wEwyI1yXagk+jJP9wQs6hVw4WsE4YHMmAzDPbjZLOErH eGKPW1dV/46qRmGKK6UtRk63IiArbKjiuOX81oAVAWyQvZms2u/JAaXk5hEwERWPMcB6 KlFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776616308; x=1777221108; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=uG+XFyafSRmvtoGWdsZ9aUvZEWjPbX53j6Q6FbiLCsc=; b=TxivqiPQx3sAkHkATqMUngcX1uQalcN02CKjexodL5++Z3PRtJT3Kp6YoQ46iPfVMk yygFaABzaD3uVRcXkrF9C0DrssQO6JZ72EUdxOOWIHLgL1v9IWy9ZqoEX4fA00HrLre9 6y29+BNR0+QXCCtNQmdEAwAubAAjxzyav3KTuXmG1eKAiGGM4u1YX5INVjytoxfTkapj vbo6R/x+xuEmFpNm31wMXjI6juNnD3bx3lo/16CAhsnkgYfx+oaWIRHWIl5ibnOXMxRl pHsPid7GJ34AJTdFzimxBP/yvUbjeM0jRLQQ7dfZTYIpahDS/DdQ/a0vOQngEoYG8gDu d3pg== X-Forwarded-Encrypted: i=1; AFNElJ+vciU/MweTOiBHi2/ubc9nw0C+XyCO/LHqUxx8xkLFuY6Z6KuS1J5Ii4YoR67x50pwL4UjRVXpSiFR6fA=@vger.kernel.org X-Gm-Message-State: AOJu0YxqTnj0dIrnRZcBHddDZbWAgd5fLa9YUUAkwgG+8Br5JnLBXOR9 iFxV0XnxOYhub0w36NsqFh/RhRCaQbk6DNIRJRBtcEe5kJRuoju7SgMBT/rgqw== X-Gm-Gg: AeBDievA9gGFG0peubFl/vUtjjfhA1pAIKQzhC5uFaDEmzdUYGGJ36CoZ6bsu95isET 7Pmdf9nCVNIj4PKde0mAb4lPZ0mZpdI1ubLvW+1ko6c3YAzdjbkfD2N8uOUhifMcrnZoTU7SGve HjrvOx790MMnhAv7RNsPHMOaoOtKXMJLQkIMSnniyKAeVWY4W0M7X4NZzhTnc0xgNq2PNnMI/R8 0BqQJh2rb4FfXXbP3VZU8RwfY79H6JI2hchwGUHNHeLovPwmyNXGRIx0uwMHEq5GJ5SHQLre+QX iDlqsKlEehEy133mqia4qE2O+Hcyg2DAH1RwG6rfQ6odMI0mPvL3oEmGTHWx/Ne42TZvjtGYJXY 3A6rMFRkbjLPZgl06Q8fG4ZpO//F8pzg934Q8Nvl/6BKxT739yttNmHcWBmGuhPXhGfosc4d4LI idqm4sI3UcKuMExplCnhq+z9Gr5u+2jiuSDarnlZaQqNcJB9HCFwf0EoFIkBK8qZMbd0LgaNi6/ 6YbmVxqNzgflCTA8BkeYQeTuqDY9Q== X-Received: by 2002:a17:90a:d09:b0:361:45df:f5 with SMTP id 98e67ed59e1d1-36145df04afmr6199178a91.16.1776616307905; Sun, 19 Apr 2026 09:31:47 -0700 (PDT) Received: from localhost.localdomain (1-160-233-238.dynamic-ip.hinet.net. [1.160.233.238]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-361417748aesm7814196a91.0.2026.04.19.09.31.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Apr 2026 09:31:47 -0700 (PDT) From: Sean Chang To: Benjamin Coddington Cc: Jeff Layton , trondmy@kernel.org, anna@kernel.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Chang Subject: [PATCH v3 2/2] NFS: Fix RCU dereference of cl_xprt in nfs_compare_super_address Date: Mon, 20 Apr 2026 00:31:38 +0800 Message-ID: <20260419163138.26963-3-seanwascoding@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260419163138.26963-1-seanwascoding@gmail.com> References: <20260419163138.26963-1-seanwascoding@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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: 7e3fcf61abde ("nfs: don't share mounts between network namespaces") Signed-off-by: Sean Chang --- fs/nfs/super.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 7a318581f85b..4cd420b14ce3 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1166,12 +1166,18 @@ static int nfs_set_super(struct super_block *s, struct fs_context *fc) static int nfs_compare_super_address(struct nfs_server *server1, struct nfs_server *server2) { + struct rpc_xprt *xprt1, *xprt2; struct sockaddr *sap1, *sap2; - struct rpc_xprt *xprt1 = server1->client->cl_xprt; - struct rpc_xprt *xprt2 = server2->client->cl_xprt; + + rcu_read_lock(); + + xprt1 = rcu_dereference(server1->client->cl_xprt); + xprt2 = rcu_dereference(server2->client->cl_xprt); if (!net_eq(xprt1->xprt_net, xprt2->xprt_net)) - return 0; + goto out_unlock; + + rcu_read_unlock(); sap1 = (struct sockaddr *)&server1->nfs_client->cl_addr; sap2 = (struct sockaddr *)&server2->nfs_client->cl_addr; @@ -1203,6 +1209,10 @@ static int nfs_compare_super_address(struct nfs_server *server1, } return 1; + +out_unlock: + rcu_read_unlock(); + return 0; } static int nfs_compare_userns(const struct nfs_server *old, -- 2.43.0