Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 May 2019 02:10:05 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r347170 - in stable: 11/lib/libbe 12/lib/libbe
Message-ID:  <201905060210.x462A5K5059386@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Mon May  6 02:10:04 2019
New Revision: 347170
URL: https://svnweb.freebsd.org/changeset/base/347170

Log:
  MFC r347027-r347028: libbe(3) mountpoint handling fixes
  
  r347027:
  libbe(3): Properly mount BEs with mountpoint=none
  
  Instead of pretending to successfully mount them while not actually
  mounting anything, we'll now actually mount them *and* claim we mounted them
  successfully.
  
  Reported by:	ler
  
  r347028:
  libbe: set mountpoint=none in be_import
  
  If we're going to set a mountpoint at all, mountpoint=none makes more sense
  than mountpoint=/.

Modified:
  stable/11/lib/libbe/be.c
  stable/11/lib/libbe/be_access.c
Directory Properties:
  stable/11/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/12/lib/libbe/be.c
  stable/12/lib/libbe/be_access.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/11/lib/libbe/be.c
==============================================================================
--- stable/11/lib/libbe/be.c	Mon May  6 02:08:52 2019	(r347169)
+++ stable/11/lib/libbe/be.c	Mon May  6 02:10:04 2019	(r347170)
@@ -822,7 +822,7 @@ be_import(libbe_handle_t *lbh, const char *bootenv, in
 
 	nvlist_alloc(&props, NV_UNIQUE_NAME, KM_SLEEP);
 	nvlist_add_string(props, "canmount", "noauto");
-	nvlist_add_string(props, "mountpoint", "/");
+	nvlist_add_string(props, "mountpoint", "none");
 
 	err = zfs_prop_set_list(zfs, props);
 	nvlist_free(props);

Modified: stable/11/lib/libbe/be_access.c
==============================================================================
--- stable/11/lib/libbe/be_access.c	Mon May  6 02:08:52 2019	(r347169)
+++ stable/11/lib/libbe/be_access.c	Mon May  6 02:10:04 2019	(r347170)
@@ -45,6 +45,7 @@ struct be_mount_info {
 	const char *mountpoint;
 	int mntflags;
 	int deepmount;
+	int depth;
 };
 
 static int
@@ -79,6 +80,7 @@ be_mount_iter(zfs_handle_t *zfs_hdl, void *data)
 	char *mountpoint;
 	char tmp[BE_MAXPATHLEN], zfs_mnt[BE_MAXPATHLEN];
 	struct be_mount_info *info;
+	char opt;
 
 	info = (struct be_mount_info *)data;
 
@@ -94,37 +96,50 @@ be_mount_iter(zfs_handle_t *zfs_hdl, void *data)
 	    NULL, NULL, 0, 1))
 		return (1);
 
-	if (strcmp("none", zfs_mnt) != 0) {
-		char opt = '\0';
+	if (strcmp("none", zfs_mnt) == 0) {
+		/*
+		 * mountpoint=none; we'll mount it at info->mountpoint assuming
+		 * we're at the root.  If we're not at the root... that's less
+		 * than stellar and not entirely sure what to do with that.
+		 * For now, we won't treat it as an error condition -- we just
+		 * won't mount it, and we'll continue on.
+		 */
+		if (info->depth > 0)
+			return (0);
 
+		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);
+	}
 
-		if ((err = zmount(zfs_get_name(zfs_hdl), tmp, info->mntflags,
-		 __DECONST(char *, MNTTYPE_ZFS), NULL, 0, &opt, 1)) != 0) {
-			switch (errno) {
-			case ENAMETOOLONG:
-				return (set_error(info->lbh, BE_ERR_PATHLEN));
-			case ELOOP:
-			case ENOENT:
-			case ENOTDIR:
-				return (set_error(info->lbh, BE_ERR_BADPATH));
-			case EPERM:
-				return (set_error(info->lbh, BE_ERR_PERMS));
-			case EBUSY:
-				return (set_error(info->lbh, BE_ERR_PATHBUSY));
-			default:
-				return (set_error(info->lbh, BE_ERR_UNKNOWN));
-			}
+	opt = '\0';
+	if ((err = zmount(zfs_get_name(zfs_hdl), tmp, info->mntflags,
+	    __DECONST(char *, MNTTYPE_ZFS), NULL, 0, &opt, 1)) != 0) {
+		switch (errno) {
+		case ENAMETOOLONG:
+			return (set_error(info->lbh, BE_ERR_PATHLEN));
+		case ELOOP:
+		case ENOENT:
+		case ENOTDIR:
+			return (set_error(info->lbh, BE_ERR_BADPATH));
+		case EPERM:
+			return (set_error(info->lbh, BE_ERR_PERMS));
+		case EBUSY:
+			return (set_error(info->lbh, BE_ERR_PATHBUSY));
+		default:
+			return (set_error(info->lbh, BE_ERR_UNKNOWN));
 		}
 	}
 
 	if (!info->deepmount)
 		return (0);
 
-	return (zfs_iter_filesystems(zfs_hdl, be_mount_iter, info));
+	++info->depth;
+	err = zfs_iter_filesystems(zfs_hdl, be_mount_iter, info);
+	--info->depth;
+	return (err);
 }
 
 
@@ -138,9 +153,11 @@ be_umount_iter(zfs_handle_t *zfs_hdl, void *data)
 
 	info = (struct be_mount_info *)data;
 
+	++info->depth;
 	if((err = zfs_iter_filesystems(zfs_hdl, be_umount_iter, info)) != 0) {
 		return (err);
 	}
+	--info->depth;
 
 	if (!zfs_is_mounted(zfs_hdl, &mountpoint)) {
 		return (0);
@@ -248,6 +265,7 @@ be_mount(libbe_handle_t *lbh, char *bootenv, char *mou
 	info.mountpoint = (mountpoint == NULL) ? mnt_temp : mountpoint;
 	info.mntflags = mntflags;
 	info.deepmount = mntdeep;
+	info.depth = 0;
 
 	if((err = be_mount_iter(zhdl, &info) != 0)) {
 		zfs_close(zhdl);
@@ -283,6 +301,7 @@ be_unmount(libbe_handle_t *lbh, char *bootenv, int fla
 	info.be = be;
 	info.mountpoint = NULL;
 	info.mntflags = (flags & BE_MNT_FORCE) ? MS_FORCE : 0;
+	info.depth = 0;
 
 	if ((err = be_umount_iter(root_hdl, &info)) != 0) {
 		zfs_close(root_hdl);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201905060210.x462A5K5059386>