From nobody Sat Jul 18 00:28:13 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4h270t193mz6lll6 for ; Sat, 18 Jul 2026 00:28:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4h270s606tz3QTs for ; Sat, 18 Jul 2026 00:28:13 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1784334493; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=O2hX53gaGVE3F1da6WCanPPNobL/rQ7k44kdk8LUSck=; b=yUwGKng2zbQEGfplBuoPAZe1oOokpdQctqEWd2/bqqMeYDq/lwBpmkL0NFLXUwUpBXC1eo 4hc1tc2KRQMfdhV0o3vddbF6zCBxUNJDJAU+pBXzCE4YLGhOqDz2eNPhndI7JmgEReZPQM gyF818IAcdPxgDS727QhMMcgN7DROObHgEN/sa6a2Q16SOlUa+CUfWg/EMlz0q0ZrnP0+r 8BBoa/f1FMKzI3P0Npn/aWR4WucWjFVf8AeK7+s+9LiT4PqLgLdQ8vISnwBMk9kQG/z5ki e1UaOVcn65uxhqg2lmv1fregFE4GmnDsn+iB8MMe++VkfIhIEgeqcXBmQEQT5w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1784334493; a=rsa-sha256; cv=none; b=pzI19MiEVKwEAjmwQkJEPe30CmpS73HtsY5vhptTaBNYJ4tTOwPg/XIQOMi2BIUoN0KWj0 yw0hTHI+KtjX4sJH0tH16tSmjVYgcC8n/FqqIldIX9eeXK8YrS52ax8ZlGPhENNzTF2+Dz cUBTeBUZStNnJA6CoId5eXb+O+qqzouAnP1AZDe0uOgP2DR9HR+ovl4fK6AaaSX4OYKvpa 62xoxkHfR2L9VSypn+mUmoNo1edy445MpcZ2AmOnHtYSL2gWwPaTp2T9RJVPiz/2FbhyfE AV4FV1wKccm4SnCj1maFlMlbaXkEp9D6HIwQwgOTwcH5lgHXzwTA6t3ch5RWaw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1784334493; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=O2hX53gaGVE3F1da6WCanPPNobL/rQ7k44kdk8LUSck=; b=eLpFs+zUIbM1LTNoaWsCQj7mmgFGMrzeMngP5T8pCoB8mMYfprkA/PD2t1QIs4vIW9kUwS iEzrEQO03yhrge1mkE+vAbIX3IYKHH7BQoZyIiahsz6mYTuyIrv6oUfs2MA90RLi+tolYW haIC6hGVNmFYbSHXm2YM+yUHhBtgu7EAEpOhl5Duhju4u9akvJizYb+eNSRBc5ObIRkv3D wp2jZULMOE4nx5fj3bQXeI3f2I/MkfMiXKeF56z5UctXI4X1XOL2Rsxvwl5Sa/mtvrZikQ CZjaQKIFkMJ4MkVifjYYKM+u5ZGkopdKfE7MeWzrmoXL6Hm2CgO3m/rXIZDP4w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4h270s4K8kz1939 for ; Sat, 18 Jul 2026 00:28:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3fc68 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 18 Jul 2026 00:28:13 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: feb4c9d089bf - stable/15 - tmpfs: extract tmpfs_rename_check/set_parent() from tmpfs_rename() List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: feb4c9d089bf6505408997ad132d816865262de0 Auto-Submitted: auto-generated Date: Sat, 18 Jul 2026 00:28:13 +0000 Message-Id: <6a5ac89d.3fc68.66e6f523@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=feb4c9d089bf6505408997ad132d816865262de0 commit feb4c9d089bf6505408997ad132d816865262de0 Author: Konstantin Belousov AuthorDate: 2026-06-18 20:01:35 +0000 Commit: Konstantin Belousov CommitDate: 2026-07-18 00:27:24 +0000 tmpfs: extract tmpfs_rename_check/set_parent() from tmpfs_rename() (cherry picked from commit 5e0b96e728af9916ac59d65e37155a95e06c3b5e) --- sys/fs/tmpfs/tmpfs_vnops.c | 167 ++++++++++++++++++++++++--------------------- 1 file changed, 89 insertions(+), 78 deletions(-) diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c index d42d601e630c..9239d146ee9d 100644 --- a/sys/fs/tmpfs/tmpfs_vnops.c +++ b/sys/fs/tmpfs/tmpfs_vnops.c @@ -962,6 +962,89 @@ releout: return (error); } +static int +tmpfs_rename_check_parent(struct tmpfs_mount *tmp, struct tmpfs_node *fdnode, + struct vnode *fvp, struct tmpfs_node *fnode, struct tmpfs_dirent *de, + struct tmpfs_node *tdnode, struct ucred *tcred) +{ + struct tmpfs_node *n; + int error; + + TMPFS_NODE_LOCK(fnode); + error = tmpfs_access_locked(fvp, fnode, VWRITE, tcred); + TMPFS_NODE_UNLOCK(fnode); + if (error != 0) + return (error); + + /* + * Ensure the target directory is not a child of the + * directory being moved. Otherwise, we'd end up + * with stale nodes. + * + * TMPFS_LOCK guarantees that no nodes are freed while + * traversing the list. Nodes can only be marked as + * removed: tn_parent == NULL. + */ + n = tdnode; + TMPFS_LOCK(tmp); + TMPFS_NODE_LOCK(n); + while (n != n->tn_dir.tn_parent) { + struct tmpfs_node *parent; + + if (n == fnode) { + TMPFS_NODE_UNLOCK(n); + TMPFS_UNLOCK(tmp); + return (EINVAL); + } + parent = n->tn_dir.tn_parent; + TMPFS_NODE_UNLOCK(n); + if (parent == NULL) { + n = NULL; + break; + } + TMPFS_NODE_LOCK(parent); + if (parent->tn_dir.tn_parent == NULL) { + TMPFS_NODE_UNLOCK(parent); + n = NULL; + break; + } + n = parent; + } + TMPFS_UNLOCK(tmp); + if (n == NULL) + return (EINVAL); + + TMPFS_NODE_UNLOCK(n); + + return (0); +} + +static void +tmpfs_rename_set_parent(struct tmpfs_node *fdnode, struct tmpfs_node *fnode, + struct tmpfs_dirent *de, struct tmpfs_node *tdnode) +{ + /* Adjust the parent pointer. */ + TMPFS_VALIDATE_DIR(fnode); + TMPFS_NODE_LOCK(de->td_node); + de->td_node->tn_dir.tn_parent = tdnode; + TMPFS_NODE_UNLOCK(de->td_node); + + /* + * As a result of changing the target of the '..' + * entry, the link count of the source and target + * directories has to be adjusted. + */ + TMPFS_NODE_LOCK(tdnode); + TMPFS_ASSERT_LOCKED(tdnode); + tdnode->tn_links++; + TMPFS_NODE_UNLOCK(tdnode); + + TMPFS_NODE_LOCK(fdnode); + TMPFS_ASSERT_LOCKED(fdnode); + fdnode->tn_links--; + TMPFS_NODE_UNLOCK(fdnode); +} + static int tmpfs_rename(struct vop_rename_args *v) { @@ -1129,86 +1212,14 @@ tmpfs_rename(struct vop_rename_args *v) * In case we are moving a directory, we have to adjust its * parent to point to the new parent. */ - if (de->td_node->tn_type == VDIR) { - struct tmpfs_node *n; - - TMPFS_NODE_LOCK(fnode); - error = tmpfs_access_locked(fvp, fnode, VWRITE, - tcnp->cn_cred); - TMPFS_NODE_UNLOCK(fnode); - if (error) { - if (newname != NULL) - free(newname, M_TMPFSNAME); + if (fnode->tn_type == VDIR) { + error = tmpfs_rename_check_parent(tmp, fdnode, fvp, + fnode, de, tdnode, tcnp->cn_cred); + if (error != 0) { + free(newname, M_TMPFSNAME); goto out_locked; } - - /* - * Ensure the target directory is not a child of the - * directory being moved. Otherwise, we'd end up - * with stale nodes. - */ - n = tdnode; - /* - * TMPFS_LOCK guaranties that no nodes are freed while - * traversing the list. Nodes can only be marked as - * removed: tn_parent == NULL. - */ - TMPFS_LOCK(tmp); - TMPFS_NODE_LOCK(n); - while (n != n->tn_dir.tn_parent) { - struct tmpfs_node *parent; - - if (n == fnode) { - TMPFS_NODE_UNLOCK(n); - TMPFS_UNLOCK(tmp); - error = EINVAL; - if (newname != NULL) - free(newname, M_TMPFSNAME); - goto out_locked; - } - parent = n->tn_dir.tn_parent; - TMPFS_NODE_UNLOCK(n); - if (parent == NULL) { - n = NULL; - break; - } - TMPFS_NODE_LOCK(parent); - if (parent->tn_dir.tn_parent == NULL) { - TMPFS_NODE_UNLOCK(parent); - n = NULL; - break; - } - n = parent; - } - TMPFS_UNLOCK(tmp); - if (n == NULL) { - error = EINVAL; - if (newname != NULL) - free(newname, M_TMPFSNAME); - goto out_locked; - } - TMPFS_NODE_UNLOCK(n); - - /* Adjust the parent pointer. */ - TMPFS_VALIDATE_DIR(fnode); - TMPFS_NODE_LOCK(de->td_node); - de->td_node->tn_dir.tn_parent = tdnode; - TMPFS_NODE_UNLOCK(de->td_node); - - /* - * As a result of changing the target of the '..' - * entry, the link count of the source and target - * directories has to be adjusted. - */ - TMPFS_NODE_LOCK(tdnode); - TMPFS_ASSERT_LOCKED(tdnode); - tdnode->tn_links++; - TMPFS_NODE_UNLOCK(tdnode); - - TMPFS_NODE_LOCK(fdnode); - TMPFS_ASSERT_LOCKED(fdnode); - fdnode->tn_links--; - TMPFS_NODE_UNLOCK(fdnode); + tmpfs_rename_set_parent(fdnode, fnode, de, tdnode); } }