aboutsummaryrefslogtreecommitdiff
path: root/lib/libbe
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2019-06-25 18:47:40 +0000
committerKyle Evans <kevans@FreeBSD.org>2019-06-25 18:47:40 +0000
commit3afb4dc28a5fb124127c1c1fc470fcba6213a24e (patch)
tree21b4345f34f4339ab4073f52c2e56b36f72373c4 /lib/libbe
parent419110374a63bdf1b3b7ad0acb3f7206d0d67796 (diff)
downloadsrc-3afb4dc28a5fb124127c1c1fc470fcba6213a24e.tar.gz
src-3afb4dc28a5fb124127c1c1fc470fcba6213a24e.zip
libbe(3): restructure be_mount, skip canmount check for BE dataset
Further cleanup after r349380; loader and kernel will both ignore canmount on the root dataset as well, so we should not be so strict about it when mounting it. be_mount is restructured to make it more clear that depth==0 is special, and to not try fetching these properties that we won't care about. MFC after: 3 days
Notes
Notes: svn path=/head/; revision=349383
Diffstat (limited to 'lib/libbe')
-rw-r--r--lib/libbe/be_access.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/lib/libbe/be_access.c b/lib/libbe/be_access.c
index eaa53473445d..9c267bd2f9a6 100644
--- a/lib/libbe/be_access.c
+++ b/lib/libbe/be_access.c
@@ -89,25 +89,31 @@ be_mount_iter(zfs_handle_t *zfs_hdl, void *data)
return (0);
}
- if (zfs_prop_get_int(zfs_hdl, ZFS_PROP_CANMOUNT) == ZFS_CANMOUNT_OFF)
- return (0);
+ /*
+ * canmount and mountpoint are both ignored for the BE dataset, because
+ * the rest of the system (kernel and loader) will effectively do the
+ * same.
+ */
+ if (info->depth == 0) {
+ snprintf(tmp, BE_MAXPATHLEN, "%s", info->mountpoint);
+ } else {
+ if (zfs_prop_get_int(zfs_hdl, ZFS_PROP_CANMOUNT) ==
+ ZFS_CANMOUNT_OFF)
+ return (0);
- if (zfs_prop_get(zfs_hdl, ZFS_PROP_MOUNTPOINT, zfs_mnt, BE_MAXPATHLEN,
- NULL, NULL, 0, 1))
- return (1);
+ if (zfs_prop_get(zfs_hdl, ZFS_PROP_MOUNTPOINT, zfs_mnt,
+ BE_MAXPATHLEN, NULL, NULL, 0, 1))
+ return (1);
- if (strcmp("none", zfs_mnt) == 0 || info->depth == 0) {
/*
- * mountpoint=none; we'll mount it at info->mountpoint assuming
- * we're at the root. If we're not at the root, we're likely
- * at some intermediate dataset (e.g. zroot/var) that will have
- * children that may need to be mounted.
+ * We've encountered mountpoint=none at some intermediate
+ * dataset (e.g. zroot/var) that will have children that may
+ * need to be mounted. Skip mounting it, but iterate through
+ * the children.
*/
- if (info->depth > 0)
+ if (strcmp("none", zfs_mnt) == 0)
goto skipmount;
- snprintf(tmp, BE_MAXPATHLEN, "%s", info->mountpoint);
- } else {
mountpoint = be_mountpoint_augmented(info->lbh, zfs_mnt);
snprintf(tmp, BE_MAXPATHLEN, "%s%s", info->mountpoint,
mountpoint);