git: 9front

Download patch

ref: 39c11de50cf47fa315a9fa1d37352722d49923b9
parent: b334b0125f06427e7d3ddc6eea56a398a911b2c1
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Jan 4 22:57:50 EST 2016

fdisk: properly convert byte units K,M,G and T to cylinders/sectors

the shared command language assumed 512 byte sectors, which is
not the case for fdisk as it uses cylinders for the block unit.
so we introduce an extra argument in the Edit structure and
parseexpr() function so byte sizes are properly converted to
the block unit when the K,M,G and T postfixes are used.

--- a/sys/src/cmd/disk/prep/calc.y
+++ b/sys/src/cmd/disk/prep/calc.y
@@ -79,7 +79,7 @@
 
 static char *inp;
 static jmp_buf jmp;
-static vlong dot, size, dollar;
+static vlong dot, size, dollar, unit;
 static char** errp;
 
 static int
@@ -110,7 +110,8 @@
 			n *= 1024;
 			/* fall through */
 		case 'k':
-			n *= 2;
+			n *= 1024;
+			n /= unit;		/* convert to sectors */
 			break;
 		default:
 			--inp;
@@ -164,7 +165,7 @@
 int yyparse(void);
 
 char*
-parseexpr(char *s, vlong xdot, vlong xdollar, vlong xsize, vlong *result)
+parseexpr(char *s, vlong xdot, vlong xdollar, vlong xsize, vlong xunit, vlong *result)
 {
 	char *err;
 
@@ -176,6 +177,7 @@
 	dot = xdot;
 	size = xsize;
 	dollar = xdollar;
+	unit = xunit;
 	yyparse();
 	if(yyexp == nil)
 		return "nil yylval?";
--- a/sys/src/cmd/disk/prep/edisk.c
+++ b/sys/src/cmd/disk/prep/edisk.c
@@ -294,6 +294,7 @@
 		edit.disk->secsize = secsize;
 		edit.disk->secs = edit.disk->size / secsize;
 	}
+	edit.unitsz = edit.disk->secsize;
 	edit.end = edit.disk->secs;
 
 	if(blank)
--- a/sys/src/cmd/disk/prep/edit.c
+++ b/sys/src/cmd/disk/prep/edit.c
@@ -129,7 +129,7 @@
 	if(argc > 2)
 		return "args";
 
-	if(err = parseexpr(argv[1], edit->dot, edit->end, edit->end, &ndot))
+	if(err = parseexpr(argv[1], edit->dot, edit->end, edit->end, edit->unitsz, &ndot))
 		return err;
 
 	edit->dot = ndot;
@@ -157,7 +157,7 @@
 		fprint(2, "start %s: ", edit->unit);
 		q = getline(edit);
 	}
-	if(err = parseexpr(q, edit->dot, edit->end, edit->end, &start))
+	if(err = parseexpr(q, edit->dot, edit->end, edit->end, edit->unitsz, &start))
 		return err;
 
 	if(start < 0 || start >= edit->end)
@@ -181,7 +181,7 @@
 		fprint(2, "end [%lld..%lld] ", start, maxend);
 		q = getline(edit);
 	}
-	if(err = parseexpr(q, edit->dot, maxend, edit->end, &end))
+	if(err = parseexpr(q, edit->dot, maxend, edit->end, edit->unitsz, &end))
 		return err;
 
 	if(start == end)
--- a/sys/src/cmd/disk/prep/edit.h
+++ b/sys/src/cmd/disk/prep/edit.h
@@ -36,6 +36,7 @@
 	void *aux;
 	vlong dot;
 	vlong end;
+	vlong unitsz;
 
 	/* do not use fields below this line */
 	int changed;
@@ -48,7 +49,7 @@
 Part	*findpart(Edit*, char*);
 char	*addpart(Edit*, Part*);
 char	*delpart(Edit*, Part*);
-char *parseexpr(char *s, vlong xdot, vlong xdollar, vlong xsize, vlong *result);
+char *parseexpr(char *s, vlong xdot, vlong xdollar, vlong xsize, vlong xunit, vlong *result);
 int	ctldiff(Edit *edit, int ctlfd);
 void *emalloc(ulong);
 char *estrdup(char*);
--- a/sys/src/cmd/disk/prep/fdisk.c
+++ b/sys/src/cmd/disk/prep/fdisk.c
@@ -141,8 +141,8 @@
 		edit.disk->secsize = secsize;
 		edit.disk->secs = edit.disk->size / secsize;
 	}
-
 	sec2cyl = edit.disk->h * edit.disk->s;
+	edit.unitsz = sec2cyl * edit.disk->secsize;
 	edit.end = edit.disk->secs / sec2cyl;
 
 	findmbr(&edit);
@@ -164,7 +164,7 @@
 	if(dowrite || printflag)
 		exits(0);
 
-	fprint(2, "cylinder = %lld bytes\n", sec2cyl*edit.disk->secsize);
+	fprint(2, "%s = %lld bytes\n", edit.unit, edit.unitsz);
 	runcmd(&edit, "p");
 	for(;;) {
 		fprint(2, ">>> ");
--- a/sys/src/cmd/disk/prep/prep.c
+++ b/sys/src/cmd/disk/prep/prep.c
@@ -160,6 +160,7 @@
 		disk->secsize = secsize;
 		disk->secs = disk->size / secsize;
 	}
+	edit.unitsz = disk->secsize;
 	edit.end = disk->secs;
 
 	checkfat(disk);
--