Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 03 Sep 2019 14:07:18 -0000
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r346503 - stable/12/stand/common
Message-ID:  <201904212226.x3LMQR1C025874@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sun Apr 21 22:26:27 2019
New Revision: 346503
URL: https://svnweb.freebsd.org/changeset/base/346503

Log:
  MFC r344238-r344241
  
  r344238:
  Restore loader(8)'s ability for lsdev to show partitions within a bsd slice.
  
  I'm pretty sure this used to work at one time, perhaps long ago.  It has
  been failing recently because if you call disk_open() with dev->d_partition
  set to -1 when d_slice refers to a bsd slice, it assumes you want it to
  open the first partition within that slice.  When you then pass that open
  dev instance to ptable_open(), it tries to read the start of the 'a'
  partition and decides there is no recognizable partition type there.
  
  This restores the old functionality by resetting d_offset to the start
  of the raw slice after disk_open() returns.  For good measure, d_partition
  is also set back to -1, although that doesn't currently affect anything.
  
  I would have preferred to make disk_open() avoid such rude assumptions and
  if you ask for partition -1 you get the raw slice.  But the commit history
  shows that someone already did that once (r239058), and had to revert it
  (r239232), so I didn't even try to go down that road.
  
  r344239:
  Use a couple local variables to avoid repetitive long expressions that
  cause line-wrapping.
  
  r344240:
  Make lsdev -v output line up in neat columns by using a fixed width for
  the size field and a tab between the partition type and the size.
  
  Changes this
  
    disk devices:
          disk0 (MMC)
          disk0s1: DOS/Windows            49MB
          disk0s2: FreeBSD                14GB
          disk0s2a: FreeBSD UFS         14GB
          disk0s2b: Unknown             2048KB
          disk0s2d: FreeBSD UFS         2040KB
  
  to this
  
    disk devices:
          disk0 (MMC)
          disk0s1: DOS/Windows      49MB
          disk0s2: FreeBSD          14GB
          disk0s2a: FreeBSD UFS     14GB
          disk0s2b: Unknown       2048KB
          disk0s2d: FreeBSD UFS   2040KB
  
  r344241:
  Garbage collect no-longer-used constant.

Modified:
  stable/12/stand/common/disk.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/stand/common/disk.c
==============================================================================
--- stable/12/stand/common/disk.c	Sun Apr 21 22:21:36 2019	(r346502)
+++ stable/12/stand/common/disk.c	Sun Apr 21 22:26:27 2019	(r346503)
@@ -75,7 +75,7 @@ display_size(uint64_t size, u_int sectorsize)
 		size /= 1024;
 		unit = 'M';
 	}
-	sprintf(buf, "%ld%cB", (long)size, unit);
+	sprintf(buf, "%4ld%cB", (long)size, unit);
 	return (buf);
 }
 
@@ -102,7 +102,6 @@ ptblread(void *d, void *buf, size_t blocks, uint64_t o
 	    blocks * od->sectorsize, (char *)buf, NULL));
 }
 
-#define	PWIDTH	35
 static int
 ptable_print(void *arg, const char *pname, const struct ptable_entry *part)
 {
@@ -112,16 +111,16 @@ ptable_print(void *arg, const char *pname, const struc
 	struct ptable *table;
 	char line[80];
 	int res;
+	u_int sectsize;
+	uint64_t partsize;
 
 	pa = (struct print_args *)arg;
 	od = (struct open_disk *)pa->dev->dd.d_opendata;
-	sprintf(line, "  %s%s: %s", pa->prefix, pname,
-	    parttype2str(part->type));
-	if (pa->verbose)
-		sprintf(line, "%-*s%s", PWIDTH, line,
-		    display_size(part->end - part->start + 1,
-		    od->sectorsize));
-	strcat(line, "\n");
+	sectsize = od->sectorsize;
+	partsize = part->end - part->start + 1;
+	sprintf(line, "  %s%s: %s\t%s\n", pa->prefix, pname,
+	    parttype2str(part->type),
+	    pa->verbose ? display_size(partsize, sectsize) : "");
 	if (pager_output(line))
 		return 1;
 	res = 0;
@@ -131,10 +130,15 @@ ptable_print(void *arg, const char *pname, const struc
 		dev.dd.d_unit = pa->dev->dd.d_unit;
 		dev.d_slice = part->index;
 		dev.d_partition = -1;
-		if (disk_open(&dev, part->end - part->start + 1,
-		    od->sectorsize) == 0) {
-			table = ptable_open(&dev, part->end - part->start + 1,
-			    od->sectorsize, ptblread);
+		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);
 				bsd.dev = pa->dev;
@@ -149,7 +153,6 @@ ptable_print(void *arg, const char *pname, const struc
 
 	return (res);
 }
-#undef PWIDTH
 
 int
 disk_print(struct disk_devdesc *dev, char *prefix, int verbose)





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904212226.x3LMQR1C025874>