From nobody Sat Apr 26 03:24:57 2025 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 4Zkw7Y48ptz5tY3S; Sat, 26 Apr 2025 03:24:57 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zkw7Y2KTqz3QDb; Sat, 26 Apr 2025 03:24:57 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745637897; 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=Ff/jEK8Gf5+5eedlnNhVgf40hr11OuYyS/CFubI+iXQ=; b=ZregPLX4dlEREC7klZIu2fZm66HBdp18+xE3YhQerjSJAVuPj9rkyLxb0AkOsJbDXp+ybF JNSxx7yqx8FcLZo43y+wyrdqANtclgVbLuEDgmUcO7bVpQlxKByXKJkQ1Z2BrrOW+SJAtk GPTygx1uYIdXzT/7zgmclZsWcRN+Veu8MSCcl+EHwyOuu09KNvgomnMTyXOWg7Lua6d7o6 MgSYvfVUYGZkab8EvumMOuRLggpyGZD4eNl6OXuP1YA19pgG92L+VdKZudzMHavWCzKeVp y3aWFbgRWeDKigGgIbDXXYOCq7NckDCr1XsKrJeMK4hynFj2peOJvbK/SOnzFw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745637897; a=rsa-sha256; cv=none; b=h6vuJrxbkFlWNZ3o5e87fWE31OAAEa3EMNEVIKRWr6vaIlAs0MBvhAC3JbHSRgpFX89qer daJQUVBD5Z/TlDd6cjRxPGVi1WdT1/8ZoI4mk07lTCRUKDUniQLs7SnCz1SU0zdXuOXkYj xJWllB0Fm5/h6Q+VG1J+8fGluMmjoNhRF+sbKRO95J3WQ1by2FSAWM/4e7yyq8zxacY6om eFlI3c5cVyjVAmO6RV1EKsvObk4XcQRHg2tt2nunHXMUk+dqG/+G++4wmcn/Q/HwcER1EJ tJ4sc/1zdwkxzhnaNfcyh1dhUJSiL7TFj5dvJ3Ss49WINT/AFJMpeE3LTYOfrw== 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=1745637897; 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=Ff/jEK8Gf5+5eedlnNhVgf40hr11OuYyS/CFubI+iXQ=; b=vR4lPZYDaczq6o+ZdRP6hnUf4aQ2fbzDmHia5Uy9g7fZcZetCVRzx40ZoU7NYCuqIzDNzp VDNQ3Ky7LCL8InKfBhJVzcaEU0BYWprlS82D6UNFqO5j1R7HUknYx5lSavoq317hZbMoGz Y1cqrDt6WkTPZCyNTPXKoGTsA1ux9KCVfyjxssNh81RisEGZ9XXOZZ+vkKK6RyZ05xDCur XWvgviqSXuDth9pjhk5qJoxdFRVihSECbC4NbY5kGb2vNVRVVksf+6Kt5IyHZvCIudyama TazxO7CaDNwYKY6/i1nD+cRFxa/49dVeMeOa1yebFaN/aiAUtt9kajUiYIJzDA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Zkw7Y1PCFz1382; Sat, 26 Apr 2025 03:24:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53Q3OvZa017623; Sat, 26 Apr 2025 03:24:57 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53Q3Ovko017621; Sat, 26 Apr 2025 03:24:57 GMT (envelope-from git) Date: Sat, 26 Apr 2025 03:24:57 GMT Message-Id: <202504260324.53Q3Ovko017621@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kyle Evans Subject: git: 0635fe29225b - stable/14 - libbe: attempt to remove autocreated mountpoints at unmount time 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 0635fe29225b5a4ecac63fc9d95dff63517d0003 Auto-Submitted: auto-generated The branch stable/14 has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=0635fe29225b5a4ecac63fc9d95dff63517d0003 commit 0635fe29225b5a4ecac63fc9d95dff63517d0003 Author: Kyle Evans AuthorDate: 2025-04-21 03:47:59 +0000 Commit: Kyle Evans CommitDate: 2025-04-26 03:23:55 +0000 libbe: attempt to remove autocreated mountpoints at unmount time We use a be_mount.XXXX pattern to mkdtemp(3) when creating these, which seems reasonably unique enough to just continue using that. Record the mountpoint of the root dataset and check the dirname of that for the auto-creation trait. There's no sense in this bubbling up an error to callers, so we'll just ignore an error for now. Requested by: manu (cherry picked from commit d6fbae084a2a0e07805633ca46935963357f1efa) --- lib/libbe/be_access.c | 30 +++++++++++++++++++++++++++++- lib/libbe/libbe.3 | 7 +++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/libbe/be_access.c b/lib/libbe/be_access.c index 67b30d3fb4fb..51f5a75e957d 100644 --- a/lib/libbe/be_access.c +++ b/lib/libbe/be_access.c @@ -33,6 +33,8 @@ #include "be.h" #include "be_impl.h" +#define LIBBE_MOUNT_PREFIX "be_mount." /* XXX */ + struct be_mountcheck_info { const char *path; char *name; @@ -164,7 +166,11 @@ be_umount_iter(zfs_handle_t *zfs_hdl, void *data) if (!zfs_is_mounted(zfs_hdl, &mountpoint)) { return (0); } - free(mountpoint); + + if (info->depth == 0 && info->mountpoint == NULL) + info->mountpoint = mountpoint; + else + free(mountpoint); if (zfs_unmount(zfs_hdl, NULL, info->mntflags) != 0) { switch (errno) { @@ -307,10 +313,32 @@ be_unmount(libbe_handle_t *lbh, const char *bootenv, int flags) info.depth = 0; if ((err = be_umount_iter(root_hdl, &info)) != 0) { + free(__DECONST(char *, info.mountpoint)); zfs_close(root_hdl); return (err); } + /* + * We'll attempt to remove the directory if we created it on a + * best-effort basis. rmdir(2) failure will not be reported. + */ + if (info.mountpoint != NULL) { + const char *mdir; + + mdir = strrchr(info.mountpoint, '/'); + if (mdir == NULL) + mdir = info.mountpoint; + else + mdir++; + + if (strncmp(mdir, LIBBE_MOUNT_PREFIX, + sizeof(LIBBE_MOUNT_PREFIX) - 1) == 0) { + (void)rmdir(info.mountpoint); + } + } + + free(__DECONST(char *, info.mountpoint)); + zfs_close(root_hdl); return (BE_ERR_SUCCESS); } diff --git a/lib/libbe/libbe.3 b/lib/libbe/libbe.3 index 644b1d71ccd3..743922a76391 100644 --- a/lib/libbe/libbe.3 +++ b/lib/libbe/libbe.3 @@ -392,6 +392,13 @@ This list of properties matches the properties collected by The .Fn be_unmount function will unmount the given boot environment. +If the mount point looks like it was created by +.Fn be_mount , +then +.Fn be_unmount +will attempt to +.Xr rmdir 2 +the mountpoint after a successful unmount. Setting the .Dv BE_MNT_FORCE flag will pass