summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-raid.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/ata-raid.c')
-rw-r--r--sys/dev/ata/ata-raid.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index 075c91d..0dfa263 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -187,10 +187,22 @@ arstrategy(struct bio *bp)
else if (rdp->flags & AR_F_RAID_0) {
plba = lba / rdp->interleave;
chunk = lba % rdp->interleave;
- buf1->drive = plba % rdp->num_subdisks;
- buf1->bp.bio_pblkno =
- ((plba / rdp->num_subdisks) * rdp->interleave) + chunk;
- chunk = min(rdp->interleave - chunk, count);
+ if (plba == rdp->total_secs / rdp->interleave) {
+ int lastblksize =
+ (rdp->total_secs-(plba*rdp->interleave))/rdp->num_subdisks;
+
+ buf1->drive = chunk / lastblksize;
+ buf1->bp.bio_pblkno =
+ ((plba / rdp->num_subdisks) * rdp->interleave) +
+ chunk % lastblksize;
+ chunk = min(count, lastblksize);
+ }
+ else {
+ buf1->drive = plba % rdp->num_subdisks;
+ buf1->bp.bio_pblkno =
+ ((plba / rdp->num_subdisks) * rdp->interleave) + chunk;
+ chunk = min(count, rdp->interleave - chunk);
+ }
}
else {
buf1->bp.bio_pblkno = lba;
OpenPOWER on IntegriCloud