Pass a struct devdesc to the format commands. Use proper type rather

than doing weird type-punning that happened to work because the size
was right. We copied a zfs devdesc into a disk_devdesc and then after
passing through a NULL pointer reinterpreted it as a
zfs_devdesc. Instead, pass the base devdesc around and 'upcase' when
we know the types are right.

This has the happy side effect of fixing a gcc warning about bad
type punning.

Differential Revision: https://reviews.freebsd.org/D15629
This commit is contained in:
Warner Losh 2018-05-31 02:54:11 +00:00
parent 1e3e6b634e
commit 3dfe152d8d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=334412
2 changed files with 14 additions and 13 deletions

View File

@ -175,30 +175,30 @@ userboot_parsedev(struct disk_devdesc **dev, const char *devspec, const char **p
char * char *
userboot_fmtdev(void *vdev) userboot_fmtdev(void *vdev)
{ {
struct disk_devdesc *dev = (struct disk_devdesc *)vdev; struct devdesc *dev = (struct devdesc *)vdev;
static char buf[128]; /* XXX device length constant? */ static char buf[128]; /* XXX device length constant? */
switch(dev->dd.d_dev->dv_type) { switch(dev->d_dev->dv_type) {
case DEVT_NONE: case DEVT_NONE:
strcpy(buf, "(no device)"); strcpy(buf, "(no device)");
break; break;
case DEVT_CD: case DEVT_CD:
sprintf(buf, "%s%d:", dev->dd.d_dev->dv_name, dev->dd.d_unit); sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
break; break;
case DEVT_DISK: case DEVT_DISK:
return (disk_fmtdev(vdev)); return (disk_fmtdev(vdev));
case DEVT_NET: case DEVT_NET:
sprintf(buf, "%s%d:", dev->dd.d_dev->dv_name, dev->dd.d_unit); sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
break; break;
case DEVT_ZFS: case DEVT_ZFS:
#if defined(USERBOOT_ZFS_SUPPORT) #if defined(USERBOOT_ZFS_SUPPORT)
return (zfs_fmtdev(vdev)); return (zfs_fmtdev(vdev));
#else #else
sprintf(buf, "%s%d:", dev->dd.d_dev->dv_name, dev->dd.d_unit); sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
#endif #endif
break; break;
} }

View File

@ -155,20 +155,19 @@ static void
extract_currdev(void) extract_currdev(void)
{ {
struct disk_devdesc dev; struct disk_devdesc dev;
struct devdesc *dd;
//bzero(&dev, sizeof(dev));
#if defined(USERBOOT_ZFS_SUPPORT) #if defined(USERBOOT_ZFS_SUPPORT)
struct zfs_devdesc zdev;
CTASSERT(sizeof(struct disk_devdesc) >= sizeof(struct zfs_devdesc)); CTASSERT(sizeof(struct disk_devdesc) >= sizeof(struct zfs_devdesc));
if (userboot_zfs_found) { if (userboot_zfs_found) {
struct zfs_devdesc zdev;
/* Leave the pool/root guid's unassigned */ /* Leave the pool/root guid's unassigned */
bzero(&zdev, sizeof(zdev)); bzero(&zdev, sizeof(zdev));
zdev.dd.d_dev = &zfs_dev; zdev.dd.d_dev = &zfs_dev;
dev = *(struct disk_devdesc *)&zdev; init_zfs_bootenv(zfs_fmtdev(&zdev));
init_zfs_bootenv(zfs_fmtdev(&dev)); dd = &zdev.dd;
} else } else
#endif #endif
@ -185,14 +184,16 @@ extract_currdev(void)
dev.d_slice = -1; dev.d_slice = -1;
dev.d_partition = -1; dev.d_partition = -1;
} }
dd = &dev.dd;
} else { } else {
dev.dd.d_dev = &host_dev; dev.dd.d_dev = &host_dev;
dev.dd.d_unit = 0; dev.dd.d_unit = 0;
dd = &dev.dd;
} }
env_setenv("currdev", EV_VOLATILE, userboot_fmtdev(&dev), env_setenv("currdev", EV_VOLATILE, userboot_fmtdev(dd),
userboot_setcurrdev, env_nounset); userboot_setcurrdev, env_nounset);
env_setenv("loaddev", EV_VOLATILE, userboot_fmtdev(&dev), env_setenv("loaddev", EV_VOLATILE, userboot_fmtdev(dd),
env_noset, env_nounset); env_noset, env_nounset);
} }