mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
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 Differential Revision: https://reviews.freebsd.org/D42243
This commit is contained in:
parent
e018d97ce5
commit
d6fbae084a
2 changed files with 36 additions and 1 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue