From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=202.12.124.155 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792720406; b=5CItnnpP07Xj0zsAT0qrEj0oCQCbWmGdxg0YouiTJvPpapfK6DxR9Mv+WcrVHK20zrrg fWgl60ahpYAgKql596o9lmtS+c/zbwiNgYaw/9R+FFO7nlVQWvgxhhdNz4Mjo2kFr2Nqq K94TMTGP8J/JAE2iH4jrKRsgLmmhWh9+LiD8/2EX8YEnAmbSlwKkCW0Ve6l3kJyAi6So5 Vju0fJ8orEpu9cPfPoF7MmdkFn4PwmR8ld0cZVYSmJ9MxhRVqqXvwNwEYphqcTmUczKIZ lDJ5OMbYiph+FLAWFJJLog7pV/LKSL/VjUz4VBVlqtWTOt3KtMjhZiS+FJ+Rrs05u3Q== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792720406; h=DMARC-Filter:Received:Received:DKIM-Signature:DKIM-Signature: X-DKIM2-Info:DKIM2-Signature:X-DKIM2-Info:Message-Instance: X-ME-Sender:X-ME-Received:X-ME-Proxy-Cause:X-ME-Proxy:Feedback-ID: Received:From:To:Cc:Subject:Date:Message-ID:X-Mailer:In-Reply-To: References:Reply-To:MIME-Version:Content-Transfer-Encoding; bh=Oad5uFoeeDk8zPnJSkIMApLzpkUjhRyPeOhCN45/9zg=; b=x1ft5SF9GhofnqKCQeLz7nYtTcYAQzcnbvIN/+TjXGVV/J4B5LTmoMyxxX+DgvAXi/tg OHhKZms4CHTzSJLSySte6uuhEl+4WDfYW6bCr5GJ3IMwchetsy5MgG7PYlyAsy0hMeRyl DZoOx40S+DKoZjJnt9L7WPZlIScjdgiAGWdwknz0AGNJtdYkr6JosS5tjLMicrQvBrjlW 0xT3+pNOjAtcll7cnYsxYbdFIqIG5JSdEbkCvU4FWG4zroFWUVRvf8utFa6tIPhX4ggkd 8w1OuaRBsqgqsbKKFGPOOD2FRKjQY2xaA7IDJx50v7xAeDr7Hm84Y4PW2lWH6B3+bWQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=ownmail.net; spf=pass smtp.mailfrom=ownmail.net; dkim=pass header.d=ownmail.net header.i=@ownmail.net header.a=rsa-sha256 header.s=fm2 header.b=Ev0VzzmS; dkim=pass header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm2 header.b=mO7LehOb; arc=none smtp.remote-ip=202.12.124.155 Received: from fhigh-b4-smtp.messagingengine.com (fhigh-b4-smtp.messagingengine.com [202.12.124.155]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DDBE1606A320 for ; Fri, 23 Oct 2026 01:53:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org DDBE1606A320 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ownmail.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ownmail.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=ownmail.net header.i=@ownmail.net header.a=rsa-sha256 header.s=fm2 header.b=Ev0VzzmS; dkim=pass (2048-bit key, unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm2 header.b=mO7LehOb Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfhigh.stl.internal (Postfix) with ESMTP id 66ABE7A01A4 for ; Thu, 22 Oct 2026 21:53:25 -0400 (EDT) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-02.internal (MEProxy); Thu, 22 Oct 2026 21:53:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ownmail.net; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:reply-to:subject:subject:to:to; s=fm2; t=1792720404; x=1792806804; bh=Oad5uFoeeDk8zPnJSkIMApLzpkUjhRyPeOhCN45/9zg=; b= Ev0VzzmSoxQkRRuhsWOXl91xHFO0X6p0vt6vuTodlNq8nADs4eCsqhBQLRWfHh2e H4xob40O5rsuZAyaTRIiWReE/h8QUUVaond2d1SDC7zLsD3IJMlBNRIE1LSAvKmd S7fuxF1FYHZ2zPRKEfvIs1gckMifaHsU3fVM0yx554hR3wyU+WkLWSgpIuDSouq8 S9+p1ZtnqsyFYT+5A1mu12XD/xnI6O7CZwAyykUuh40Kff013Yuon/XjBbUPdpqa KeX/7jR0BojRUr86Wz9j//8Mru1uDfZzya9q0DXvShQdbAcLuC/kBpy+IfEv3Ja8 N6XBCVIBbaOSY+gMsi46eg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1792720404; x=1792806804; bh=O ad5uFoeeDk8zPnJSkIMApLzpkUjhRyPeOhCN45/9zg=; b=mO7LehObFSxWDngUM 2gqlYd4bY3SmButdWEAvdVqS8KPAbsNWPw7aGYUbyZyM+M6q7Cw+RoyzvhP9JS3i Pf7GRKgPkAVAVQK1CMrmi/Os5MBMF3JT+NFCSli/dICO7pmgtsUMTJBZFLieQFOQ HgcuQ+Z3E6e9DYG63QaLlWd/dDUzjoWXHAsrvetPU9UXds3fuDe6LLvon6W4lb2h ET/2Tq0MqDQFABxpHO0vMpATdvbGkD3V9KyAwkAYOpQQ63mDV4S425WRj0lHLWwj GcFIsevG14WjivglQQpIkbO4RpgS1gCrUWYj5W4JRIIT27cvsGOVgyMN6jlaefw3 5jCCg== X-DKIM2-Info: draft=ietf-dkim-dkim2-spec-07; repo=github.com/dkim2wg/interop; date=2026-10-18; sw=lmtpprox; action=sign d=ownmail.net a=rsa-sha256; DKIM2-Signature: i=1; m=1; t=1792720404; d=ownmail.net; mf=PG5laWxiQG93bm1haWwubmV0Pg==; rt=PGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc+; s=fm2:rsa-sha256:MBUCXDIsKQ7aczaU2v2VHzOykbBRZaSWkC4pNRQZmEhfx2l Tb915sV2vmCn64VOxtEzOVNU4ybEVrzGlGFPO247UtydEUz0SNOCcT5sv6XDk45H OoumkG94BY9eDXoUlW+0rEJE1ix8pau6T6iIdfFJdfxckLLFX1tl0ZcZvz1ETG4f okUMAe8Dkh2uwovICoZ60Zi2rjZOmF8s688TlaHFg/3Cs3jp2cuCQlc98+f6mB2X nDXD2P0ONCRHZncrUbOtryDuNe9g+xHbcItWHagSMS/in+QiW5mgVbSaeu/69xyw rAy9U4RZnIFZuXwJ5vsTOrcXwzHs/KQIbBHPTsQ==; X-DKIM2-Info: draft=ietf-dkim-dkim2-spec-07; repo=github.com/dkim2wg/interop; date=2026-10-18; sw=lmtpprox; action=mi-m=1; hc=12; hn=cc,content-transfer-encoding,date,feedback-id,from, in-reply-to,message-id,mime-version,references,reply-to,subject, to; Message-Instance: m=1; h=sha256:3azS0I+1CaT6qSg22Wxr8wBRiaJopbYY/N06O8d28Bs=:NEwrj5JG1mS1OJb+BqJKatBxoqK12ne5xTTrpAB9ALM=; X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGCU2C8LOtpzuJKBi1InDLHlNatP6eswYZhMCAg5KFSChFuQSzcwHD+aQ9/vrRRBT PRJ979y5LX2CCwU9KvwphqkfVN8xdJjsuhFWxYcSW7iHv5QRHO4uQEmDITrLqp1GRCZ/Pi LwwmFZD9WpyauMgffwGB18R5w3bKodCdeqC3/ObEPlMcbbppdJLaFyTTDyX0bB1lAjcTlL 3S2VAMDU1+MWLcMCX2h6tbaH22OB1zIqDfceCiaBHTaP1hZnRcgcOwhshK/Wg2U5r+TjaE 6XPaJ1CN6c09RR4MB+rmNIIlc/gd+hsgFo0OvXkgovCNHAq7i5DKwcOVIB5AOwUn8xRCQD EX7mQbIJzOQPWGNd5bSbL49Q0bPvScRPtLhsFPMQvHdOuOFx0ghR7hlTDKKpd1n041z0HG 5Gd8fTqNdzlAxBBj9QurhtM6zJkEHW/cNKXV1jDicGhsomaOTuYDcWrbs6IhVYBWstL84z BdsVbm2oHCY3wPPN6nl9xNux6HZplMBYODgB4aUVqIPaQE/3Yp0E48qe2nDff3CSInaqLy aOfgoSg2pVW1a9R2eeiQfSDTcV6ejAS0abww9t0NDcu0SrCwwbe/k9qSgtxUzRZhHvi0N+ AJIduObOswedGr8Hma3IsLM0pTmIBD27Kyu8WYVr5IXuDDaewEnsAVyqAw3w X-ME-Proxy: Feedback-ID: i9d664b8f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 22 Oct 2026 21:53:22 -0400 (EDT) From: NeilBrown To: Trond Myklebust , Anna Schumaker , Alexander Viro , Christian Brauner Cc: Jeff Layton , Jan Kara , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 4/9] nfs: use d_splice_alias() in nfs_link() Date: Fri, 23 Oct 2026 12:50:14 +1100 Message-ID: <20261023015239.2163480-5-neilb@ownmail.net> X-Mailer: git-send-email 2.50.0.107.gf914562f5916.dirty In-Reply-To: <20261023015239.2163480-1-neilb@ownmail.net> References: <20261023015239.2163480-1-neilb@ownmail.net> Reply-To: NeilBrown X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: NeilBrown When filename_linkat() calls filename_create() which ultimately calls ->lookup, the flags LOOKUP_CREATE|LOOKUP_EXCL are passed. nfs_lookup() treats this as an exclusive create (which it is) and skips the ->lookup, leaving the dentry unchanged. Currently that means nfs_link() can get a hashed dentry (if the name was already in the cache) or an unhashed dentry (if it wasn't). As none of d_add(), d_instantiate(), d_splice_alias() could handle both of these, nfs_link() calls d_drop() and then d_add(). Recent changes to d_splice_alias() mean that it *can* work with either hashed or unhashed dentries. Future changes to locking mean that it will be unsafe to d_drop() a dentry while an operation (in this case "link()") is still ongoing. So change to use d_splice_alias(), and not to d_drop() until an error is detected (as in that case was can't be sure what is actually on the server). Also update the comment for nfs_is_exclusive_create() to note that link(), mkdir(), mknod(), symlink() all appear as exclusive creates. Those other than link() already used d_splice_alias() via nfs_add_or_obtain(). Possibly nfs_is_exclusive_create() should return true even with NFSv2 when the request isn't an open (not LOOKUP_OPEN). Signed-off-by: NeilBrown --- fs/nfs/dir.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 59981a4c7403..29492c06ebf5 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1570,6 +1570,9 @@ static int nfs_check_verifier(struct inode *dir, struct dentry *dentry, /* * Use intent information to check whether or not we're going to do * an O_EXCL create using this path component. + * Note that link(), mkdir(), mknod(), symlink() all appear as + * exclusive creation. Regular file creation could be distinguished + * with LOOKUP_OPEN. */ static int nfs_is_exclusive_create(struct inode *dir, unsigned int flags) { @@ -2699,14 +2702,15 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) old_dentry, dentry); trace_nfs_link_enter(inode, dir, dentry); - d_drop(dentry); if (S_ISREG(inode->i_mode)) nfs_sync_inode(inode); error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); if (error == 0) { nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); ihold(inode); - d_add(dentry, inode); + d_splice_alias(inode, dentry); + } else { + d_drop(dentry); } trace_nfs_link_exit(inode, dir, dentry, error); return error; -- 2.50.0.107.gf914562f5916.dirty