diff options
author | google <google@daverabbitz.ath.cx> | 2012-09-09 17:22:12 +1200 |
---|---|---|
committer | google <google@daverabbitz.ath.cx> | 2012-09-09 17:22:12 +1200 |
commit | dd1b8df8808df4fe295a90ab494da90162c5654f (patch) | |
tree | eabbba5b00e6a1288001f4fb8ae5a5ee667cc234 /sys/src/cmd/disk | |
parent | aead11533ec4d17f4382b1e10f850042391bccb2 (diff) |
Add alignment hints for e512 ATA drives.
Diffstat (limited to 'sys/src/cmd/disk')
-rw-r--r-- | sys/src/cmd/disk/prep/prep.c | 16 |
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; } } |