From nobody Sat Jul 11 22:05:26 2026 X-Original-To: dev-commits-src-main@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 4gyN6v3Yz2z6lhfW for ; Sat, 11 Jul 2026 22:05:27 +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 4gyN6v13JMz3x1j for ; Sat, 11 Jul 2026 22:05:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783807527; 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=D68bMfmhslPwMdKLxJONCiCB545Lg50N/pDX7HgVY/Y=; b=Lhl4+/FQLmWU9DGIpOoIcJdpLMQ3V+J0lxt+/TGNBHDNF3IywYIaNUYiGX7NWTAXAwysq7 OxOBXZ+UWjWdchYuJKWDH/eneucsy448pE3EmOY0y3QUWYaTqshWv4MxPxltn+OGv9HJ/C Uy/YmVWrDyo1vbCHl3y6XRmniqwNtetyKyemv+EiyabxumcYYOi6LISLIH4tNKFGzGlCB5 wiONZ8zgbwWs2haZdz5vCzfHntfQEaQrACFNWc+AjWSTdXZFNbJH9d8robLjLCuAa1SzRW ZlM3rh8BRNeRqnSEBc6zN1bOxRjNULaaTeBB9AmAW3FlbjShWnE0BK5BBDYdQA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1783807527; a=rsa-sha256; cv=none; b=qvr9RJ5pG5CLXUSPs+ZcG4PVpbH9iJWNz+X5+bLiPyCqOGW/mWyr1BaZCaqiBqEVsRNTgL l7k68lLm6nJHf/lY/DLu58xHBpe7tIgcoKNMlh3ckRxpRWCZZlK8fh6Lo07sEGq5CmGvJd j8/P6t/cbQrf3q+wRy83GF70ujO28RqyJluXmVpidoNOrQzgRXQumlUCBJeia5obdXb100 GHg/7NkEgbws5zfQMg+UTWjIjFv0gqEYtJc/EKaPrQgsN2m0UW+fY8JZz/E5AONl740ZFz mLmgJnO3sG2RGdMAchA3huDI7fHQM/zKJoivGt9zRgE21Nc/R4KmotaJrMaVnA== 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=1783807527; 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=D68bMfmhslPwMdKLxJONCiCB545Lg50N/pDX7HgVY/Y=; b=ihl/l4X7vnIFb53iH1txbUBeuuqpxUKPTsMCcOBgi6tMpzwZgaxAjgaQ9xshZSIis9WzEN kBF+yZ1Ny4HiHra9ItI0Fk2vrfstTUv5sOTtopnoJznOKceVoKGBY2I0YqcKnV7s9Pw8pZ dl1Hm7NpD1cu0oPP+4fC7XHiq2X7ELJALibfzWCXwRMwQc7EeHmZqjyfuWvmk+ebNMYX+r U9pv/YhAqIl/2R1CCWL/OYt8Sr0Kd1tOxFYJASULnZOsH7ReO9MsPdXiSQWrrv0kX9rVfv nTtkaT4hZJDt+e0x5pzAKBAOWzSwXOyAe9FJ69vMYxTVvhlU2tdoRA26LArYvA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gyN6t6SSbzylk for ; Sat, 11 Jul 2026 22:05:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3fa87 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 11 Jul 2026 22:05:26 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 7e06c33151e7 - main - tmpfs: implement AT_RENAME_EXCHANGE List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: 7e06c33151e7664f6d664ee282d8da1985ce94aa Auto-Submitted: auto-generated Date: Sat, 11 Jul 2026 22:05:26 +0000 Message-Id: <6a52be26.3fa87.74727064@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=7e06c33151e7664f6d664ee282d8da1985ce94aa commit 7e06c33151e7664f6d664ee282d8da1985ce94aa Author: Konstantin Belousov AuthorDate: 2026-06-18 18:40:40 +0000 Commit: Konstantin Belousov CommitDate: 2026-07-11 22:04:43 +0000 tmpfs: implement AT_RENAME_EXCHANGE Reviewed by: mckusick Discussed with: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57658 --- sys/fs/tmpfs/tmpfs_vnops.c | 90 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 23 deletions(-) diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c index 8021e42e7c06..fe8507b4936a 100644 --- a/sys/fs/tmpfs/tmpfs_vnops.c +++ b/sys/fs/tmpfs/tmpfs_vnops.c @@ -1055,7 +1055,7 @@ tmpfs_rename(struct vop_rename_args *v) struct vnode *tvp = v->a_tvp; struct componentname *tcnp = v->a_tcnp; char *newname; - struct tmpfs_dirent *de; + struct tmpfs_dirent *de, *tde; struct tmpfs_mount *tmp; struct tmpfs_node *fdnode; struct tmpfs_node *fnode; @@ -1063,8 +1063,11 @@ tmpfs_rename(struct vop_rename_args *v) struct tmpfs_node *tdnode; int error; bool want_seqc_end; + bool exchange; want_seqc_end = false; + newname = NULL; + error = 0; /* * Disallow cross-device renames. @@ -1076,16 +1079,15 @@ tmpfs_rename(struct vop_rename_args *v) goto out; } - if ((v->a_flags & ~(AT_RENAME_NOREPLACE)) != 0) { + if ((v->a_flags & ~(AT_RENAME_NOREPLACE | AT_RENAME_EXCHANGE)) != 0) { error = EOPNOTSUPP; goto out; } /* If source and target are the same file, there is nothing to do. */ - if (fvp == tvp) { - error = 0; + if (fvp == tvp) goto out; - } + exchange = (v->a_flags & AT_RENAME_EXCHANGE) != 0; /* * If we need to move the directory between entries, lock the @@ -1138,6 +1140,8 @@ tmpfs_rename(struct vop_rename_args *v) fdnode = VP_TO_TMPFS_DIR(fdvp); fnode = VP_TO_TMPFS_NODE(fvp); de = tmpfs_dir_lookup(fdnode, fnode, fcnp); + if (exchange) + tde = tmpfs_dir_lookup(tdnode, tnode, tcnp); /* * Entry can disappear before we lock fdvp. @@ -1151,6 +1155,13 @@ tmpfs_rename(struct vop_rename_args *v) goto out_locked; } MPASS(de->td_node == fnode); + if (exchange) { + if (tde == NULL) { + error = ENOENT; + goto out_locked; + } + MPASS(tde->td_node == tnode); + } /* * If re-naming a directory to another preexisting directory @@ -1168,22 +1179,27 @@ tmpfs_rename(struct vop_rename_args *v) goto out_locked; } - if (fnode->tn_type == VDIR && tnode->tn_type == VDIR) { - if (tnode->tn_size != 0 && - ((tcnp->cn_flags & IGNOREWHITEOUT) == 0 || - tnode->tn_size > tnode->tn_dir.tn_wht_size)) { - error = ENOTEMPTY; + if (!exchange) { + if (fnode->tn_type == VDIR && tnode->tn_type == VDIR) { + if (tnode->tn_size != 0 && + ((tcnp->cn_flags & IGNOREWHITEOUT) == 0 || + tnode->tn_size > + tnode->tn_dir.tn_wht_size)) { + error = ENOTEMPTY; + goto out_locked; + } + } else if (fnode->tn_type == VDIR && + tnode->tn_type != VDIR) { + error = ENOTDIR; goto out_locked; + } else if (fnode->tn_type != VDIR && + tnode->tn_type == VDIR) { + error = EISDIR; + goto out_locked; + } else { + MPASS(fnode->tn_type != VDIR && + tnode->tn_type != VDIR); } - } else if (fnode->tn_type == VDIR && tnode->tn_type != VDIR) { - error = ENOTDIR; - goto out_locked; - } else if (fnode->tn_type != VDIR && tnode->tn_type == VDIR) { - error = EISDIR; - goto out_locked; - } else { - MPASS(fnode->tn_type != VDIR && - tnode->tn_type != VDIR); } } @@ -1197,11 +1213,9 @@ tmpfs_rename(struct vop_rename_args *v) * Ensure that we have enough memory to hold the new name, if it * has to be changed. */ - if (fcnp->cn_namelen != tcnp->cn_namelen || - bcmp(fcnp->cn_nameptr, tcnp->cn_nameptr, fcnp->cn_namelen) != 0) { + if (!exchange && (fcnp->cn_namelen != tcnp->cn_namelen || + bcmp(fcnp->cn_nameptr, tcnp->cn_nameptr, fcnp->cn_namelen) != 0)) newname = malloc(tcnp->cn_namelen, M_TMPFSNAME, M_WAITOK); - } else - newname = NULL; /* * If the node is being moved to another directory, we have to do @@ -1219,8 +1233,38 @@ tmpfs_rename(struct vop_rename_args *v) free(newname, M_TMPFSNAME); goto out_locked; } + } + if (exchange && tnode->tn_type == VDIR) { + MPASS(newname == NULL); + error = tmpfs_rename_check_parent(tmp, tdnode, tvp, + tnode, tde, fdnode, fcnp->cn_cred); + if (error != 0) + goto out_locked; + } + if (fnode->tn_type == VDIR) tmpfs_rename_set_parent(fdnode, fnode, de, tdnode); + if (exchange && tnode->tn_type == VDIR) + tmpfs_rename_set_parent(tdnode, tnode, tde, fdnode); + } + if (exchange) { + de->td_node = tnode; + tde->td_node = fnode; + if (tmpfs_use_nc(fvp)) { + cache_purge(fvp); + cache_purge(tvp); + cache_enter(tdvp, fvp, tcnp); + cache_enter(fdvp, tvp, fcnp); + } + fdnode->tn_status |= TMPFS_NODE_MODIFIED | TMPFS_NODE_CHANGED; + fdnode->tn_accessed = true; + tmpfs_update(fdvp); + if (fdvp != tdvp) { + tdnode->tn_status |= TMPFS_NODE_MODIFIED | + TMPFS_NODE_CHANGED; + tdnode->tn_accessed = true; + tmpfs_update(tdvp); } + goto out_locked; } /*