summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2005-12-14 12:11:51 +0000
committersos <sos@FreeBSD.org>2005-12-14 12:11:51 +0000
commit5498992155a90e2904e7b75ea86a33322e494345 (patch)
tree71cf7c33909089ade309fad33ed97f4ffbc18ddd /sys
parent265803afe89bdbf9b02ee1ff200fb3779c9152ef (diff)
downloadFreeBSD-src-5498992155a90e2904e7b75ea86a33322e494345.zip
FreeBSD-src-5498992155a90e2904e7b75ea86a33322e494345.tar.gz
Correct calculation of RAID0 sizes on VIA RAID arrays.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/ata-raid.c14
-rw-r--r--sys/dev/ata/ata-raid.h2
2 files changed, 9 insertions, 7 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index 4504081..41e77a4 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -3396,19 +3396,21 @@ ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp)
case VIA_T_RAID0:
raid->type = AR_T_RAID0;
raid->width = meta->stripe_layout & VIA_L_MASK;
- raid->total_sectors = meta->total_sectors;
+ if (!raid->total_sectors ||
+ (raid->total_sectors > (raid->width * meta->disk_sectors)))
+ raid->total_sectors = raid->width * meta->disk_sectors;
break;
case VIA_T_RAID1:
raid->type = AR_T_RAID1;
raid->width = 1;
- raid->total_sectors = meta->total_sectors;
+ raid->total_sectors = meta->disk_sectors;
break;
case VIA_T_SPAN:
raid->type = AR_T_SPAN;
raid->width = 1;
- raid->total_sectors += meta->total_sectors;
+ raid->total_sectors += meta->disk_sectors;
break;
default:
@@ -3433,7 +3435,7 @@ ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp)
if ((meta->disks[disk] == meta->disk_id) &&
((disk * sizeof(int32_t)) == (meta->disk_index & VIA_D_MASK))) {
raid->disks[disk].dev = parent;
- raid->disks[disk].sectors = meta->total_sectors / raid->width;
+ raid->disks[disk].sectors = meta->disk_sectors;
raid->disks[disk].flags =
(AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
ars->raid[raid->volume] = raid;
@@ -4409,8 +4411,8 @@ ata_raid_via_print_meta(struct via_raid_conf *meta)
printf("stripe_disks %d\n", meta->stripe_layout & VIA_L_MASK);
printf("stripe_sectors %d\n",
0x08 << (meta->stripe_layout >> VIA_L_SHIFT));
- printf("total_sectors %llu\n",
- (unsigned long long)meta->total_sectors);
+ printf("disk_sectors %llu\n",
+ (unsigned long long)meta->disk_sectors);
printf("disk_id 0x%08x\n", meta->disk_id);
printf("DISK# disk_id\n");
for (i = 0; i < 8; i++) {
diff --git a/sys/dev/ata/ata-raid.h b/sys/dev/ata/ata-raid.h
index 30f6652..2af8ef3 100644
--- a/sys/dev/ata/ata-raid.h
+++ b/sys/dev/ata/ata-raid.h
@@ -757,7 +757,7 @@ struct via_raid_conf {
#define VIA_L_MASK 0x07
#define VIA_L_SHIFT 4
- u_int64_t total_sectors;
+ u_int64_t disk_sectors;
u_int32_t disk_id;
u_int32_t disks[8];
u_int8_t checksum;
OpenPOWER on IntegriCloud