svn commit: r345477 - in head/stand: common efi/libefi efi/loader i386/libi386 libsa/zfs mips/beri/loader uboot/common uboot/lib usb/storage userboot/userboot

Ian Lepore ian at FreeBSD.org
Sun Mar 24 18:51:56 UTC 2019


Author: ian
Date: Sun Mar 24 18:51:52 2019
New Revision: 345477
URL: https://svnweb.freebsd.org/changeset/base/345477

Log:
  Distinguish between "no partition" and "choose best partition" with a constant.
  
  The values of the d_slice and d_partition fields of a disk_devdesc have a
  few values with special meanings in the disk_open() routine. Through various
  evolutions of the loader code over time, a d_partition value of -1 has
  meant both "use the first ufs partition found in the bsd label" and "don't
  open a bsd partition at all, open the raw slice."
  
  This defines a new special value of -2 to mean open the raw slice, and it
  gives symbolic names to all the special values used in d_slice and
  d_partition, and adjusts all existing uses of those fields to use the new
  constants.
  
  The phab review for this timed out without being accepted, but I'm still
  citing it below because there is useful commentary there.
  
  Differential Revision:	https://reviews.freebsd.org/D19262

Modified:
  head/stand/common/disk.c
  head/stand/common/disk.h
  head/stand/efi/libefi/efipart.c
  head/stand/efi/loader/main.c
  head/stand/i386/libi386/biosdisk.c
  head/stand/libsa/zfs/zfs.c
  head/stand/mips/beri/loader/beri_disk_cfi.c
  head/stand/mips/beri/loader/beri_disk_sdcard.c
  head/stand/uboot/common/main.c
  head/stand/uboot/lib/disk.c
  head/stand/usb/storage/umass_loader.c
  head/stand/userboot/userboot/main.c
  head/stand/userboot/userboot/userboot_disk.c

Modified: head/stand/common/disk.c
==============================================================================
--- head/stand/common/disk.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/common/disk.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -129,15 +129,8 @@ ptable_print(void *arg, const char *pname, const struc
 		dev.dd.d_dev = pa->dev->dd.d_dev;
 		dev.dd.d_unit = pa->dev->dd.d_unit;
 		dev.d_slice = part->index;
-		dev.d_partition = -1;
+		dev.d_partition = D_PARTNONE;
 		if (disk_open(&dev, partsize, sectsize) == 0) {
-			/*
-			 * disk_open() for partition -1 on a bsd slice assumes
-			 * you want the first bsd partition.  Reset things so
-			 * that we're looking at the start of the raw slice.
-			 */
-			dev.d_partition = -1;
-			dev.d_offset = part->start;
 			table = ptable_open(&dev, partsize, sectsize, ptblread);
 			if (table != NULL) {
 				sprintf(line, "  %s%s", pa->prefix, pname);
@@ -244,8 +237,8 @@ disk_open(struct disk_devdesc *dev, uint64_t mediasize
 	 */
 	memcpy(&partdev, dev, sizeof(partdev));
 	partdev.d_offset = 0;
-	partdev.d_slice = -1;
-	partdev.d_partition = -1;
+	partdev.d_slice = D_SLICENONE;
+	partdev.d_partition = D_PARTNONE;
 
 	dev->d_offset = 0;
 	table = NULL;
@@ -373,9 +366,9 @@ disk_fmtdev(struct disk_devdesc *dev)
 	char *cp;
 
 	cp = buf + sprintf(buf, "%s%d", dev->dd.d_dev->dv_name, dev->dd.d_unit);
-	if (dev->d_slice >= 0) {
+	if (dev->d_slice > D_SLICENONE) {
 #ifdef LOADER_GPT_SUPPORT
-		if (dev->d_partition == 255) {
+		if (dev->d_partition == D_PARTISGPT) {
 			sprintf(cp, "p%d:", dev->d_slice);
 			return (buf);
 		} else
@@ -384,7 +377,7 @@ disk_fmtdev(struct disk_devdesc *dev)
 			cp += sprintf(cp, "s%d", dev->d_slice);
 #endif
 	}
-	if (dev->d_partition >= 0)
+	if (dev->d_partition > D_PARTNONE)
 		cp += sprintf(cp, "%c", dev->d_partition + 'a');
 	strcat(cp, ":");
 	return (buf);
@@ -398,7 +391,9 @@ disk_parsedev(struct disk_devdesc *dev, const char *de
 	char *cp;
 
 	np = devspec;
-	unit = slice = partition = -1;
+	unit = -1;
+	slice = D_SLICEWILD;
+	partition = D_PARTWILD;
 	if (*np != '\0' && *np != ':') {
 		unit = strtol(np, &cp, 10);
 		if (cp == np)

Modified: head/stand/common/disk.h
==============================================================================
--- head/stand/common/disk.h	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/common/disk.h	Sun Mar 24 18:51:52 2019	(r345477)
@@ -32,33 +32,36 @@
  *
  * Whole disk access:
  *
- * 	d_slice = -1
- * 	d_partition = -1
+ * 	d_slice = D_SLICENONE
+ * 	d_partition = <doesn't matter>
  *
  * Whole MBR slice:
  *
  * 	d_slice = MBR slice number (typically 1..4)
- * 	d_partition = -1
+ * 	d_partition = D_PARTNONE
  *
  * BSD disklabel partition within an MBR slice:
  *
  * 	d_slice = MBR slice number (typically 1..4)
- * 	d_partition = disklabel partition (typically 0..19)
+ * 	d_partition = disklabel partition (typically 0..19 or D_PARTWILD)
  *
  * BSD disklabel partition on the true dedicated disk:
  *
- * 	d_slice = -1
- * 	d_partition = disklabel partition (typically 0..19)
+ * 	d_slice = D_SLICENONE
+ * 	d_partition = disklabel partition (typically 0..19 or D_PARTWILD)
  *
  * GPT partition:
  *
  * 	d_slice = GPT partition number (typically 1..N)
- * 	d_partition = 255
+ * 	d_partition = D_PARTISGPT
  *
- * For both MBR and GPT, to automatically find the 'best' slice or partition,
- * set d_slice to zero. This uses the partition type to decide which partition
- * to use according to the following list of preferences:
+ * For MBR, setting d_partition to D_PARTWILD will automatically use the first
+ * partition within the slice.
  *
+ * For both MBR and GPT, to automatically find the 'best' slice and partition,
+ * set d_slice to D_SLICEWILD. This uses the partition type to decide which
+ * partition to use according to the following list of preferences:
+ *
  * 	FreeBSD (active)
  * 	FreeBSD (inactive)
  * 	Linux (active)
@@ -80,6 +83,12 @@
 
 #ifndef	_DISK_H
 #define	_DISK_H
+
+#define	D_SLICENONE	-1
+#define	D_SLICEWILD	 0
+#define	D_PARTNONE	-1
+#define	D_PARTWILD	-2
+#define	D_PARTISGPT	255
 
 struct disk_devdesc {
 	struct devdesc	dd;		/* Must be first. */

Modified: head/stand/efi/libefi/efipart.c
==============================================================================
--- head/stand/efi/libefi/efipart.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/efi/libefi/efipart.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -813,8 +813,8 @@ efipart_print_common(struct devsw *dev, pdinfo_list_t 
 			pd->pd_blkio = blkio;
 			pd_dev.dd.d_dev = dev;
 			pd_dev.dd.d_unit = pd->pd_unit;
-			pd_dev.d_slice = -1;
-			pd_dev.d_partition = -1;
+			pd_dev.d_slice = D_SLICENONE;
+			pd_dev.d_partition = D_PARTNONE;
 			ret = disk_open(&pd_dev, blkio->Media->BlockSize *
 			    (blkio->Media->LastBlock + 1),
 			    blkio->Media->BlockSize);

Modified: head/stand/efi/loader/main.c
==============================================================================
--- head/stand/efi/loader/main.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/efi/loader/main.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -217,12 +217,12 @@ set_currdev_pdinfo(pdinfo_t *dp)
 		currdev.dd.d_dev = dp->pd_devsw;
 		if (dp->pd_parent == NULL) {
 			currdev.dd.d_unit = dp->pd_unit;
-			currdev.d_slice = -1;
-			currdev.d_partition = -1;
+			currdev.d_slice = D_SLICENONE;
+			currdev.d_partition = D_PARTNONE;
 		} else {
 			currdev.dd.d_unit = dp->pd_parent->pd_unit;
 			currdev.d_slice = dp->pd_unit;
-			currdev.d_partition = 255;	/* Assumes GPT */
+			currdev.d_partition = D_PARTISGPT; /* XXX Assumes GPT */
 		}
 		set_currdev_devdesc((struct devdesc *)&currdev);
 	} else {

Modified: head/stand/i386/libi386/biosdisk.c
==============================================================================
--- head/stand/i386/libi386/biosdisk.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/i386/libi386/biosdisk.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -691,8 +691,8 @@ bd_print_common(struct devsw *dev, bdinfo_list_t *bdi,
 
 		devd.dd.d_dev = dev;
 		devd.dd.d_unit = i;
-		devd.d_slice = -1;
-		devd.d_partition = -1;
+		devd.d_slice = D_SLICENONE;
+		devd.d_partition = D_PARTNONE;
 		if (disk_open(&devd,
 		    bd->bd_sectorsize * bd->bd_sectors,
 		    bd->bd_sectorsize) == 0) {
@@ -745,8 +745,8 @@ bd_disk_get_sectors(struct disk_devdesc *dev)
 
 	disk.dd.d_dev = dev->dd.d_dev;
 	disk.dd.d_unit = dev->dd.d_unit;
-	disk.d_slice = -1;
-	disk.d_partition = -1;
+	disk.d_slice = D_SLICENONE;
+	disk.d_partition = D_PARTNONE;
 	disk.d_offset = 0;
 
 	size = bd->bd_sectors * bd->bd_sectorsize;

Modified: head/stand/libsa/zfs/zfs.c
==============================================================================
--- head/stand/libsa/zfs/zfs.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/libsa/zfs/zfs.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -588,7 +588,7 @@ zfs_probe_dev(const char *devname, uint64_t *pool_guid
 		int slice = dev->d_slice;
 
 		free(dev);
-		if (partition != -1 && slice != -1) {
+		if (partition != D_PARTNONE && slice != D_SLICENONE) {
 			ret = zfs_probe(pa.fd, pool_guid);
 			if (ret == 0)
 				return (0);

Modified: head/stand/mips/beri/loader/beri_disk_cfi.c
==============================================================================
--- head/stand/mips/beri/loader/beri_disk_cfi.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/mips/beri/loader/beri_disk_cfi.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -129,8 +129,8 @@ beri_cfi_disk_print(int verbose)
 		return (ret);
 	dev.dd.d_dev = &beri_cfi_disk;
 	dev.dd.d_unit = 0;
-	dev.d_slice = -1;
-	dev.d_partition = -1;
+	dev.d_slice = D_SLICENONE;
+	dev.d_partition = D_PARTNONE;
 	if (disk_open(&dev, cfi_get_mediasize(), cfi_get_sectorsize()) == 0) {
 		snprintf(line, sizeof(line), "    cfi%d", 0);
 		ret = disk_print(&dev, line, verbose);

Modified: head/stand/mips/beri/loader/beri_disk_sdcard.c
==============================================================================
--- head/stand/mips/beri/loader/beri_disk_sdcard.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/mips/beri/loader/beri_disk_sdcard.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -135,8 +135,8 @@ beri_sdcard_disk_print(int verbose)
 	    return (ret);
 	dev.dd.d_dev = &beri_sdcard_disk;
 	dev.dd.d_unit = 0;
-	dev.d_slice = -1;
-	dev.d_partition = -1;
+	dev.d_slice = D_SLICENONE;
+	dev.d_partition = D_PARTNONE;
 	if (disk_open(&dev, altera_sdcard_get_mediasize(),
 	    altera_sdcard_get_sectorsize()) == 0) {
 		snprintf(line, sizeof(line), "    sdcard%d", 0);

Modified: head/stand/uboot/common/main.c
==============================================================================
--- head/stand/uboot/common/main.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/uboot/common/main.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -213,8 +213,8 @@ get_load_device(int *type, int *unit, int *slice, int 
 
 	*type = DEV_TYP_NONE;
 	*unit = -1;
-	*slice = 0;
-	*partition = -1;
+	*slice = D_SLICEWILD;
+	*partition = D_PARTWILD;
 
 	devstr = ub_env_get("loaderdev");
 	if (devstr == NULL) {
@@ -295,7 +295,7 @@ get_load_device(int *type, int *unit, int *slice, int 
 	if (p == endp) {
 		*type = DEV_TYP_NONE;
 		*unit = -1;
-		*slice = 0;
+		*slice = D_SLICEWILD;
 		return;
 	}
 
@@ -309,7 +309,7 @@ get_load_device(int *type, int *unit, int *slice, int 
 	if (*p != '.') {
 		*type = DEV_TYP_NONE;
 		*unit = -1;
-		*slice = 0;
+		*slice = D_SLICEWILD;
 		return;
 	}
 
@@ -329,8 +329,8 @@ get_load_device(int *type, int *unit, int *slice, int 
 	/* Junk beyond partition number. */
 	*type = DEV_TYP_NONE;
 	*unit = -1;
-	*slice = 0;
-	*partition = -1;
+	*slice = D_SLICEWILD;
+	*partition = D_PARTWILD;
 } 
 
 static void
@@ -339,15 +339,20 @@ print_disk_probe_info()
 	char slice[32];
 	char partition[32];
 
-	if (currdev.d_disk.d_slice > 0)
-		sprintf(slice, "%d", currdev.d_disk.d_slice);
+	if (currdev.d_disk.d_slice == D_SLICENONE)
+		strlcpy(slice, "<none>", sizeof(slice));
+	else if (currdev.d_disk.d_slice == D_SLICEWILD)
+		strlcpy(slice, "<auto>", sizeof(slice));
 	else
-		strcpy(slice, "<auto>");
+		snprintf(slice, sizeof(slice), "%d", currdev.d_disk.d_slice);
 
-	if (currdev.d_disk.d_partition >= 0)
-		sprintf(partition, "%d", currdev.d_disk.d_partition);
+	if (currdev.d_disk.d_partition == D_PARTNONE)
+		strlcpy(partition, "<none>", sizeof(partition));
+	else if (currdev.d_disk.d_partition == D_PARTWILD)
+		strlcpy(partition, "<auto>", sizeof(partition));
 	else
-		strcpy(partition, "<auto>");
+		snprintf(partition, sizeof(partition), "%d",
+		    currdev.d_disk.d_partition);
 
 	printf("  Checking unit=%d slice=%s partition=%s...",
 	    currdev.dd.d_unit, slice, partition);

Modified: head/stand/uboot/lib/disk.c
==============================================================================
--- head/stand/uboot/lib/disk.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/uboot/lib/disk.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -254,8 +254,8 @@ stor_print(int verbose)
 	for (i = 0; i < stor_info_no; i++) {
 		dev.dd.d_dev = &uboot_storage;
 		dev.dd.d_unit = i;
-		dev.d_slice = -1;
-		dev.d_partition = -1;
+		dev.d_slice = D_SLICENONE;
+		dev.d_partition = D_PARTNONE;
 		snprintf(line, sizeof(line), "\tdisk%d (%s)\n", i,
 		    ub_stor_type(SI(&dev).type));
 		if ((ret = pager_output(line)) != 0)

Modified: head/stand/usb/storage/umass_loader.c
==============================================================================
--- head/stand/usb/storage/umass_loader.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/usb/storage/umass_loader.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -196,8 +196,8 @@ umass_disk_print(int verbose)
 		return (ret);
 	dev.d_dev = &umass_disk;
 	dev.d_unit = 0;
-	dev.d_slice = -1;
-	dev.d_partition = -1;
+	dev.d_slice = D_SLICENONE;
+	dev.d_partition = D_PARTNONE;
 
 	if (umass_disk_open_sub(&dev) == 0) {
 		ret = disk_print(&dev, "    umass0", verbose);

Modified: head/stand/userboot/userboot/main.c
==============================================================================
--- head/stand/userboot/userboot/main.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/userboot/userboot/main.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -240,15 +240,15 @@ extract_currdev(void)
 	if (userboot_disk_maxunit > 0) {
 		dev.dd.d_dev = &userboot_disk;
 		dev.dd.d_unit = 0;
-		dev.d_slice = 0;
-		dev.d_partition = 0;
+		dev.d_slice = D_SLICEWILD;
+		dev.d_partition = D_PARTWILD;
 		/*
 		 * If we cannot auto-detect the partition type then
 		 * access the disk as a raw device.
 		 */
 		if (dev.dd.d_dev->dv_open(NULL, &dev)) {
-			dev.d_slice = -1;
-			dev.d_partition = -1;
+			dev.d_slice = D_SLICENONE;
+			dev.d_partition = D_PARTNONE;
 		}
 		dd = &dev.dd;
 	} else {

Modified: head/stand/userboot/userboot/userboot_disk.c
==============================================================================
--- head/stand/userboot/userboot/userboot_disk.c	Sun Mar 24 18:02:27 2019	(r345476)
+++ head/stand/userboot/userboot/userboot_disk.c	Sun Mar 24 18:51:52 2019	(r345477)
@@ -137,8 +137,8 @@ userdisk_print(int verbose)
 			break;
 		dev.dd.d_dev = &userboot_disk;
 		dev.dd.d_unit = i;
-		dev.d_slice = -1;
-		dev.d_partition = -1;
+		dev.d_slice = D_SLICENONE;
+		dev.d_partition = D_PARTNONE;
 		if (disk_open(&dev, ud_info[i].mediasize,
 		    ud_info[i].sectorsize) == 0) {
 			snprintf(line, sizeof(line), "    disk%d", i);


More information about the svn-src-all mailing list