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:
parent
1e3e6b634e
commit
3dfe152d8d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=334412
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user