git: f197c0bf3e07 - main - stand: Move i386_devdesc to a union
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 11 Aug 2022 16:27:36 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=f197c0bf3e075286ccea32cd12023f3317474c5a
commit f197c0bf3e075286ccea32cd12023f3317474c5a
Author: Warner Losh <imp@FreeBSD.org>
AuthorDate: 2022-08-11 15:04:08 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2022-08-11 16:27:15 +0000
stand: Move i386_devdesc to a union
Rather than have the magic, hand-crafted fields that have to align with
fields in other structures at the end of i386_devdesc, make it into
anonymous union and adjust the code accordingly. This is safer and
similar to what CAM does.
Sponsored by: Netflix
Reviewed by: kevans, tsoome (prior version)
Differential Revision: https://reviews.freebsd.org/D35965
---
stand/i386/libi386/libi386.h | 28 +++++++++++++---------------
stand/i386/loader/main.c | 22 ++++++++++------------
stand/i386/zfsboot/zfsboot.c | 19 +++++++++----------
3 files changed, 32 insertions(+), 37 deletions(-)
diff --git a/stand/i386/libi386/libi386.h b/stand/i386/libi386/libi386.h
index a52a1190e7ec..9c7a452a03ad 100644
--- a/stand/i386/libi386/libi386.h
+++ b/stand/i386/libi386/libi386.h
@@ -27,25 +27,23 @@
*/
+#include "disk.h"
+#ifdef LOADER_ZFS_SUPPORT
+#include "libzfs.h"
+#endif
/*
* i386 fully-qualified device descriptor.
*/
-struct i386_devdesc {
- struct devdesc dd; /* Must be first. */
- union
- {
- struct
+struct i386_devdesc
+{
+ union
{
- int slice;
- int partition;
- off_t offset;
- } biosdisk;
- struct
- {
- uint64_t pool_guid;
- uint64_t root_guid;
- } zfs;
- } d_kind;
+ struct devdesc dd;
+ struct disk_devdesc disk;
+#ifdef LOADER_ZFS_SUPPORT
+ struct zfs_devdesc zfs;
+#endif
+ };
};
/*
diff --git a/stand/i386/loader/main.c b/stand/i386/loader/main.c
index cb716d7a9f21..29c40921a85a 100644
--- a/stand/i386/loader/main.c
+++ b/stand/i386/loader/main.c
@@ -308,8 +308,8 @@ extract_currdev(void)
new_currdev.dd.d_unit = 0;
} else {
/* we don't know what our boot device is */
- new_currdev.d_kind.biosdisk.slice = -1;
- new_currdev.d_kind.biosdisk.partition = 0;
+ new_currdev.disk.d_slice = -1;
+ new_currdev.disk.d_partition = 0;
biosdev = -1;
}
#ifdef LOADER_ZFS_SUPPORT
@@ -322,8 +322,8 @@ extract_currdev(void)
zargs->size >=
offsetof(struct zfs_boot_args, primary_pool)) {
/* sufficient data is provided */
- new_currdev.d_kind.zfs.pool_guid = zargs->pool;
- new_currdev.d_kind.zfs.root_guid = zargs->root;
+ new_currdev.zfs.pool_guid = zargs->pool;
+ new_currdev.zfs.root_guid = zargs->root;
if (zargs->size >= sizeof(*zargs) &&
zargs->primary_vdev != 0) {
sprintf(buf, "%llu", zargs->primary_pool);
@@ -333,8 +333,8 @@ extract_currdev(void)
}
} else {
/* old style zfsboot block */
- new_currdev.d_kind.zfs.pool_guid = kargs->zfspool;
- new_currdev.d_kind.zfs.root_guid = 0;
+ new_currdev.zfs.pool_guid = kargs->zfspool;
+ new_currdev.zfs.root_guid = 0;
}
new_currdev.dd.d_dev = &zfs_dev;
@@ -350,14 +350,12 @@ extract_currdev(void)
#endif
} else if ((initial_bootdev & B_MAGICMASK) != B_DEVMAGIC) {
/* The passed-in boot device is bad */
- new_currdev.d_kind.biosdisk.slice = -1;
- new_currdev.d_kind.biosdisk.partition = 0;
+ new_currdev.disk.d_slice = -1;
+ new_currdev.disk.d_partition = 0;
biosdev = -1;
} else {
- new_currdev.d_kind.biosdisk.slice =
- B_SLICE(initial_bootdev) - 1;
- new_currdev.d_kind.biosdisk.partition =
- B_PARTITION(initial_bootdev);
+ new_currdev.disk.d_slice = B_SLICE(initial_bootdev) - 1;
+ new_currdev.disk.d_partition = B_PARTITION(initial_bootdev);
biosdev = initial_bootinfo->bi_bios_dev;
/*
diff --git a/stand/i386/zfsboot/zfsboot.c b/stand/i386/zfsboot/zfsboot.c
index 8dd3066f15e5..b68d80e802c2 100644
--- a/stand/i386/zfsboot/zfsboot.c
+++ b/stand/i386/zfsboot/zfsboot.c
@@ -467,8 +467,8 @@ load(void)
if (bdev->dd.d_dev->dv_type == DEVT_ZFS) {
zfsargs.size = sizeof(zfsargs);
- zfsargs.pool = bdev->d_kind.zfs.pool_guid;
- zfsargs.root = bdev->d_kind.zfs.root_guid;
+ zfsargs.pool = bdev->zfs.pool_guid;
+ zfsargs.root = bdev->zfs.root_guid;
#ifdef LOADER_GELI_SUPPORT
export_geli_boot_data(&zfsargs.gelidata);
#endif
@@ -481,8 +481,8 @@ load(void)
__exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
bootdev,
KARGS_FLAGS_ZFS | KARGS_FLAGS_EXTARG,
- (uint32_t)bdev->d_kind.zfs.pool_guid,
- (uint32_t)(bdev->d_kind.zfs.pool_guid >> 32),
+ (uint32_t)bdev->zfs.pool_guid,
+ (uint32_t)(bdev->zfs.pool_guid >> 32),
VTOP(&bootinfo),
zfsargs);
} else {
@@ -528,13 +528,12 @@ mount_root(char *arg)
free(bdev);
bdev = ddesc;
if (bdev->dd.d_dev->dv_type == DEVT_DISK) {
- if (bdev->d_kind.biosdisk.partition == -1)
+ if (bdev->disk.d_partition == -1)
part = 0xff;
else
- part = bdev->d_kind.biosdisk.partition;
+ part = bdev->disk.d_partition;
bootdev = MAKEBOOTDEV(dev_maj[bdev->dd.d_dev->dv_type],
- bdev->d_kind.biosdisk.slice + 1,
- bdev->dd.d_unit, part);
+ bdev->disk.d_slice + 1, bdev->dd.d_unit, part);
bootinfo.bi_bios_dev = bd_unit2bios(bdev);
}
strncpy(boot_devname, root, sizeof (boot_devname));
@@ -714,8 +713,8 @@ i386_zfs_probe(void)
if (pool_guid != 0 && bdev == NULL) {
bdev = malloc(sizeof (struct i386_devdesc));
bzero(bdev, sizeof (struct i386_devdesc));
- bdev->dd.d_dev = &zfs_dev;
- bdev->d_kind.zfs.pool_guid = pool_guid;
+ bdev->zfs.dd.d_dev = &zfs_dev;
+ bdev->zfs.pool_guid = pool_guid;
}
}
}