svn commit: r212050 - head/cddl/contrib/opensolaris/cmd/zpool

Pawel Jakub Dawidek pjd at FreeBSD.org
Tue Aug 31 10:41:53 UTC 2010


Author: pjd
Date: Tue Aug 31 10:41:53 2010
New Revision: 212050
URL: http://svn.freebsd.org/changeset/base/212050

Log:
  When upgrading a pool which contain root file system, give user a hint that
  he should update boot code.
  
  MFC after:	2 weeks

Modified:
  head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c

Modified: head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c	Tue Aug 31 09:38:43 2010	(r212049)
+++ head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c	Tue Aug 31 10:41:53 2010	(r212050)
@@ -3333,12 +3333,39 @@ typedef struct upgrade_cbdata {
 	int	cb_all;
 	int	cb_first;
 	int	cb_newer;
+	char	cb_poolname[ZPOOL_MAXNAMELEN];
 	int	cb_argc;
 	uint64_t cb_version;
 	char	**cb_argv;
 } upgrade_cbdata_t;
 
 static int
+is_root_pool(zpool_handle_t *zhp)
+{
+	static struct statfs sfs;
+	static char *poolname = NULL;
+	static boolean_t stated = B_FALSE;
+	char *slash;
+
+	while (!stated) {
+		stated = B_TRUE;
+		if (statfs("/", &sfs) == -1) {
+			(void) fprintf(stderr,
+			    "Unable to stat root file system: %s.\n",
+			    strerror(errno));
+			break;
+		}
+		if (strcmp(sfs.f_fstypename, "zfs") != 0)
+			break;
+		poolname = sfs.f_mntfromname;
+		if ((slash = strchr(poolname, '/')) != NULL)
+			*slash = '\0';
+		break;
+	}
+	return (poolname != NULL && strcmp(poolname, zpool_get_name(zhp)) == 0);
+}
+
+static int
 upgrade_cb(zpool_handle_t *zhp, void *arg)
 {
 	upgrade_cbdata_t *cbp = arg;
@@ -3371,6 +3398,12 @@ upgrade_cb(zpool_handle_t *zhp, void *ar
 			if (!ret) {
 				(void) printf(gettext("Successfully upgraded "
 				    "'%s'\n\n"), zpool_get_name(zhp));
+				if (cbp->cb_poolname[0] == '\0' &&
+				    is_root_pool(zhp)) {
+					(void) strlcpy(cbp->cb_poolname,
+					    zpool_get_name(zhp),
+					    sizeof(cbp->cb_poolname));
+				}
 			}
 		}
 	} else if (cbp->cb_newer && version > SPA_VERSION) {
@@ -3428,6 +3461,10 @@ upgrade_one(zpool_handle_t *zhp, void *d
 		    "from version %llu to version %llu\n\n"),
 		    zpool_get_name(zhp), (u_longlong_t)cur_version,
 		    (u_longlong_t)cbp->cb_version);
+		if (cbp->cb_poolname[0] == '\0' && is_root_pool(zhp)) {
+			(void) strlcpy(cbp->cb_poolname, zpool_get_name(zhp),
+			    sizeof(cbp->cb_poolname));
+		}
 	}
 
 	return (ret != 0);
@@ -3569,6 +3606,16 @@ zpool_do_upgrade(int argc, char **argv)
 		    upgrade_one, &cb);
 	}
 
+	if (cb.cb_poolname[0] != '\0') {
+		(void) printf(
+		    "If you boot from pool '%s', don't forget to update boot code.\n"
+		    "Assuming you use GPT partitioning and da0 is your boot disk\n"
+		    "the following command will do it:\n"
+		    "\n"
+		    "\tgpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0\n\n",
+		    cb.cb_poolname);
+	}
+
 	return (ret);
 }
 


More information about the svn-src-all mailing list