git: 9front

Download patch

ref: 5b820aa65211f8b450cdd6d3e6475e3b5964e6e7
parent: c8d8ca8598f3f356d20f334f657b9cfb6b36eb45
author: cinap_lenrek <cinap_lenrek@localhost>
date: Thu Jul 14 19:01:01 EDT 2011

fdisk: use lba values in fdisk when writing partition not possibly rounded cylinders (because we might guessed the disk geometry wrong)
libdisk: make partition geometry detection work

--- a/sys/src/cmd/disk/prep/fdisk.c
+++ b/sys/src/cmd/disk/prep/fdisk.c
@@ -405,7 +405,7 @@
 
 	p->changed = 0;
 	p->start = lba/sec2cyl;
-	p->end = (lba+size)/sec2cyl;
+	p->end = (lba+size+sec2cyl-1)/sec2cyl;
 	p->ctlstart = lba;
 	p->ctlend = lba+size;
 	p->lba = lba;
@@ -1028,7 +1028,7 @@
 
 	p = (Dospart*)edit->part[i];
 	if(p->primary){
-		*endlba = (vlong)p->start*sec2cyl;
+		*endlba = (vlong)p->ctlstart;
 		goto Finish;
 	}
 
@@ -1037,15 +1037,15 @@
 	tp = table.entry;
 	ep = tp+NTentry;
 
-	ni = wrextend(edit, i+1, xbase, p->end*sec2cyl, endlba);
+	ni = wrextend(edit, i+1, xbase, p->ctlend, endlba);
 
 	*tp = p->Tentry;
-	wrtentry(disk, tp, p->type, startlba, startlba+disk->s, p->end*sec2cyl);
+	wrtentry(disk, tp, p->type, startlba, startlba+disk->s, p->ctlend);
 	tp++;
 
-	if(p->end*sec2cyl != *endlba){
+	if(p->ctlend != *endlba){
 		memset(tp, 0, sizeof *tp);
-		wrtentry(disk, tp, TypeEXTENDED, xbase, p->end*sec2cyl, *endlba);
+		wrtentry(disk, tp, TypeEXTENDED, xbase, p->ctlend, *endlba);
 		tp++;
 	}
 
@@ -1081,14 +1081,14 @@
 		if(p->start == 0)
 			s = disk->s;
 		else
-			s = p->start*sec2cyl;
+			s = p->ctlstart;
 		if(p->primary) {
 			*tp = p->Tentry;
-			wrtentry(disk, tp, p->type, 0, s, p->end*sec2cyl);
+			wrtentry(disk, tp, p->type, 0, s, p->ctlend);
 			tp++;
 			i++;
 		} else {
-			ni = wrextend(edit, i, p->start*sec2cyl, p->start*sec2cyl, &endlba);
+			ni = wrextend(edit, i, p->ctlstart, p->ctlstart, &endlba);
 			memset(tp, 0, sizeof *tp);
 			if(endlba >= 1024*sec2cyl)
 				t = TypeEXTHUGE;
--- a/sys/src/libdisk/disk.c
+++ b/sys/src/libdisk/disk.c
@@ -63,9 +63,6 @@
 	uchar buf[512];
 	Table *t;
 
-	if(disk->c == 0 || disk->h == 0 || disk->s == 0)
-		return -1;
-
 	t = (Table*)(buf + Toffset);
 
 	/*
--