svn commit: r242224 - stable/9/sys/boot/i386/zfsboot
Andriy Gapon
avg at FreeBSD.org
Sun Oct 28 15:37:33 UTC 2012
Author: avg
Date: Sun Oct 28 15:37:32 2012
New Revision: 242224
URL: http://svn.freebsd.org/changeset/base/242224
Log:
MFC r241288: zfsboot: use the same zfs dataset naming format as loader
Modified:
stable/9/sys/boot/i386/zfsboot/zfsboot.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/boot/ (props changed)
Modified: stable/9/sys/boot/i386/zfsboot/zfsboot.c
==============================================================================
--- stable/9/sys/boot/i386/zfsboot/zfsboot.c Sun Oct 28 14:37:17 2012 (r242223)
+++ stable/9/sys/boot/i386/zfsboot/zfsboot.c Sun Oct 28 15:37:32 2012 (r242224)
@@ -553,7 +553,7 @@ main(void)
if (parse())
autoboot = 0;
if (!OPT_CHECK(RBX_QUIET))
- printf("%s: %s", PATH_CONFIG, cmddup);
+ printf("%s: %s\n", PATH_CONFIG, cmddup);
/* Do not process this command twice */
*cmd = 0;
}
@@ -577,13 +577,17 @@ main(void)
if (!autoboot || !OPT_CHECK(RBX_QUIET)) {
printf("\nFreeBSD/x86 boot\n");
if (zfs_rlookup(spa, zfsmount.rootobj, rootname) != 0)
- printf("Default: %s:<0x%llx>:%s\n"
+ printf("Default: %s/<0x%llx>:%s\n"
"boot: ",
spa->spa_name, zfsmount.rootobj, kname);
- else
- printf("Default: %s:%s:%s\n"
+ else if (rootname[0] != '\0')
+ printf("Default: %s/%s:%s\n"
"boot: ",
spa->spa_name, rootname, kname);
+ else
+ printf("Default: %s:%s\n"
+ "boot: ",
+ spa->spa_name, kname);
}
if (ioctrl & IO_SERIAL)
sio_flush();
@@ -708,12 +712,46 @@ load(void)
}
static int
+zfs_mount_ds(char *dsname)
+{
+ uint64_t newroot;
+ spa_t *newspa;
+ char *q;
+
+ q = strchr(dsname, '/');
+ if (q)
+ *q++ = '\0';
+ newspa = spa_find_by_name(dsname);
+ if (newspa == NULL) {
+ printf("\nCan't find ZFS pool %s\n", dsname);
+ return -1;
+ }
+
+ if (zfs_spa_init(newspa))
+ return -1;
+
+ newroot = 0;
+ if (q) {
+ if (zfs_lookup_dataset(newspa, q, &newroot)) {
+ printf("\nCan't find dataset %s in ZFS pool %s\n",
+ q, newspa->spa_name);
+ return -1;
+ }
+ }
+ if (zfs_mount(newspa, newroot, &zfsmount)) {
+ printf("\nCan't mount ZFS dataset\n");
+ return -1;
+ }
+ spa = newspa;
+ return (0);
+}
+
+static int
parse(void)
{
char *arg = cmd;
char *ep, *p, *q;
const char *cp;
- //unsigned int drv;
int c, i, j;
while ((c = *arg++)) {
@@ -773,37 +811,20 @@ parse(void)
}
/*
+ * If there is "zfs:" prefix simply ignore it.
+ */
+ if (strncmp(arg, "zfs:", 4) == 0)
+ arg += 4;
+
+ /*
* If there is a colon, switch pools.
*/
- q = (char *) strchr(arg, ':');
+ q = strchr(arg, ':');
if (q) {
- spa_t *newspa;
- uint64_t newroot;
-
- *q++ = 0;
- newspa = spa_find_by_name(arg);
- if (newspa) {
- arg = q;
- spa = newspa;
- newroot = 0;
- q = (char *) strchr(arg, ':');
- if (q) {
- *q++ = 0;
- if (zfs_lookup_dataset(spa, arg, &newroot)) {
- printf("\nCan't find dataset %s in ZFS pool %s\n",
- arg, spa->spa_name);
- return -1;
- }
- arg = q;
- }
- if (zfs_mount(spa, newroot, &zfsmount)) {
- printf("\nCan't mount ZFS dataset\n");
- return -1;
- }
- } else {
- printf("\nCan't find ZFS pool %s\n", arg);
+ *q++ = '\0';
+ if (zfs_mount_ds(arg) != 0)
return -1;
- }
+ arg = q;
}
if ((i = ep - arg)) {
if ((size_t)i >= sizeof(kname))
More information about the svn-src-stable-9
mailing list