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);
/*
--
⑨