summaryrefslogtreecommitdiff
path: root/sys/src/cmd/disk
diff options
context:
space:
mode:
authorgoogle <google@daverabbitz.ath.cx>2012-09-09 17:22:12 +1200
committergoogle <google@daverabbitz.ath.cx>2012-09-09 17:22:12 +1200
commitdd1b8df8808df4fe295a90ab494da90162c5654f (patch)
treeeabbba5b00e6a1288001f4fb8ae5a5ee667cc234 /sys/src/cmd/disk
parentaead11533ec4d17f4382b1e10f850042391bccb2 (diff)
Add alignment hints for e512 ATA drives.
Diffstat (limited to 'sys/src/cmd/disk')
-rw-r--r--sys/src/cmd/disk/prep/prep.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/src/cmd/disk/prep/prep.c b/sys/src/cmd/disk/prep/prep.c
index 506ca9589..b21a2d551 100644
--- a/sys/src/cmd/disk/prep/prep.c
+++ b/sys/src/cmd/disk/prep/prep.c
@@ -354,7 +354,8 @@ static void
autoxpart(Edit *edit)
{
int i, totw, futz;
- vlong secs, secsize, s;
+ vlong secs, secsize, psecsize, s, e, pa;
+ long stride;
char *err;
if(edit->npart > 0) {
@@ -362,9 +363,12 @@ autoxpart(Edit *edit)
fprint(2, "partitions already exist; not repartitioning\n");
return;
}
-
secs = edit->disk->secs;
secsize = edit->disk->secsize;
+ psecsize = edit->disk->psecsize;
+ stride = psecsize / secsize;
+ pa = (edit->disk->offset - edit->disk->physalign + stride) % stride;
+ secs -= (secs + pa) % stride;
for(;;){
/* compute total weights */
totw = 0;
@@ -431,12 +435,16 @@ autoxpart(Edit *edit)
print("%s %llud\n", autox[i].name, autox[i].size);
s = 0;
+ secs = edit->disk->secs;
for(i=0; i<nelem(autox); i++){
if(autox[i].alloc == 0)
continue;
- if(err = addpart(edit, mkpart(autox[i].name, s, s+autox[i].size, 1)))
+ e = (s + autox[i].size);
+ if((e + pa) % stride) e += stride - (e + pa) % stride;
+ if(e>secs) e = secs - stride + (secs + pa) % stride;
+ if(err = addpart(edit, mkpart(autox[i].name, s, e, 1)))
fprint(2, "addpart %s: %s\n", autox[i].name, err);
- s += autox[i].size;
+ s = e;
}
}