Module Name:    src
Committed By:   jakllsch
Date:           Sun Apr 14 22:48:22 UTC 2013

Modified Files:
        src/sbin/fdisk: fdisk.c

Log Message:
Improve support for logical sector sizes greater than 512.


To generate a diff of this commit:
cvs rdiff -u -r1.144 -r1.145 src/sbin/fdisk/fdisk.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/fdisk/fdisk.c
diff -u src/sbin/fdisk/fdisk.c:1.144 src/sbin/fdisk/fdisk.c:1.145
--- src/sbin/fdisk/fdisk.c:1.144	Wed Feb 13 00:40:28 2013
+++ src/sbin/fdisk/fdisk.c	Sun Apr 14 22:48:22 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fdisk.c,v 1.144 2013/02/13 00:40:28 christos Exp $ */
+/*	$NetBSD: fdisk.c,v 1.145 2013/04/14 22:48:22 jakllsch Exp $ */
 
 /*
  * Mach Operating System
@@ -39,7 +39,7 @@
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: fdisk.c,v 1.144 2013/02/13 00:40:28 christos Exp $");
+__RCSID("$NetBSD: fdisk.c,v 1.145 2013/04/14 22:48:22 jakllsch Exp $");
 #endif /* not lint */
 
 #define MBRPTYPENAMES
@@ -200,7 +200,7 @@ static daddr_t dos_disksectors;
 
 #define DOSSECT(s,c)	(((s) & 0x3f) | (((c) >> 2) & 0xc0))
 #define DOSCYL(c)	((c) & 0xff)
-#define SEC_IN_1M (1024 * 1024 / 512)
+#define SEC_IN_1M (1024 * 1024 / secsize)
 #define SEC_TO_MB(sec) ((unsigned int)(((sec) + SEC_IN_1M / 2) / SEC_IN_1M))
 #define SEC_TO_CYL(sec) (((sec) + dos_cylindersectors/2) / dos_cylindersectors)
 
@@ -460,9 +460,6 @@ out:				 errx(EXIT_FAILURE, "Invalid sec
 				continue;
 			if (ch != 1)
 				goto out;
-			if ((iobuf = malloc(secsize)) == NULL)
-				err(EXIT_FAILURE, "Cannot allocate %zd buffer",
-				    secsize);
 			break;
 		default:
 			usage();
@@ -508,6 +505,12 @@ out:				 errx(EXIT_FAILURE, "Invalid sec
 	if (open_disk(B_flag || a_flag || i_flag || u_flag) < 0)
 		exit(1);
 
+	if (secsize > 512) {
+		if ((iobuf = malloc(secsize)) == NULL)
+			err(EXIT_FAILURE, "Cannot allocate %zd buffer",
+			    secsize);
+	}
+
 	if (read_s0(0, &mboot))
 		/* must have been a blank disk */
 		init_sector0(1);
@@ -2321,8 +2324,9 @@ print_geometry(void)
 	printf("Disk: %s\n", disk);
 	printf("NetBSD disklabel disk geometry:\n");
 	printf("cylinders: %d, heads: %d, sectors/track: %d "
-	    "(%d sectors/cylinder)\ntotal sectors: %"PRIdaddr"\n\n",
-	    cylinders, heads, sectors, cylindersectors, disksectors);
+	    "(%d sectors/cylinder)\ntotal sectors: %"PRIdaddr", "
+	    "bytes/sector: %zd\n\n", cylinders, heads, sectors,
+	    cylindersectors, disksectors, secsize);
 	printf("BIOS disk geometry:\n");
 	printf("cylinders: %d, heads: %d, sectors/track: %d "
 	    "(%d sectors/cylinder)\ntotal sectors: %"PRIdaddr"\n\n",
@@ -2488,7 +2492,7 @@ read_disk(daddr_t sector, void *buf)
 	if (*rfd == -1)
 		errx(1, "read_disk(); fd == -1");
 
-	off_t offs = sector * (off_t)512;
+	off_t offs = sector * (off_t)secsize;
 	off_t mod = offs & (secsize - 1);
 	off_t rnd = offs & ~(secsize - 1);
 
@@ -2514,7 +2518,7 @@ write_disk(daddr_t sector, void *buf)
 	if (wfd == -1)
 		errx(1, "write_disk(); wfd == -1");
 
-	off_t offs = sector * (off_t)512;
+	off_t offs = sector * (off_t)secsize;
 	off_t mod = offs & (secsize - 1);
 	off_t rnd = offs & ~(secsize - 1);
 
@@ -2576,6 +2580,7 @@ get_params(void)
 		guess_geometry(disklabel.d_secperunit);
 		disklabel.d_ncylinders = dos_cylinders;
 		disklabel.d_ntracks = dos_heads;
+		disklabel.d_secsize = 512;
 		disklabel.d_nsectors = dos_sectors;
 	} else if (ioctl(fd, DIOCGDEFLABEL, &disklabel) == -1) {
 		warn("DIOCGDEFLABEL");
@@ -2588,6 +2593,7 @@ get_params(void)
 	disksectors = disklabel.d_secperunit;
 	cylinders = disklabel.d_ncylinders;
 	heads = disklabel.d_ntracks;
+	secsize = disklabel.d_secsize;
 	sectors = disklabel.d_nsectors;
 
 	/* pick up some defaults for the BIOS sizes */

Reply via email to