summaryrefslogtreecommitdiffstats
path: root/sys/geom/raid/md_sii.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2012-04-19 12:30:12 +0000
committermav <mav@FreeBSD.org>2012-04-19 12:30:12 +0000
commitfdb56713f24f9603c0b1d9d04f819a450c247a91 (patch)
treec52f9a1d2117f93577e84485d022a8663b182fd4 /sys/geom/raid/md_sii.c
parenta1620c99050bae85bb7454bbd11131f9502802c6 (diff)
downloadFreeBSD-src-fdb56713f24f9603c0b1d9d04f819a450c247a91.zip
FreeBSD-src-fdb56713f24f9603c0b1d9d04f819a450c247a91.tar.gz
Add to GEOM RAID class module for reading non-degraded RAID5 volumes and
some environment to differentiate 4 possible RAID5 on-disk layouts. Tested with Intel and AMD RAID BIOSes. MFC after: 2 weeks
Diffstat (limited to 'sys/geom/raid/md_sii.c')
-rw-r--r--sys/geom/raid/md_sii.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/geom/raid/md_sii.c b/sys/geom/raid/md_sii.c
index 92f2dec..840ae24 100644
--- a/sys/geom/raid/md_sii.c
+++ b/sys/geom/raid/md_sii.c
@@ -456,11 +456,13 @@ g_raid_md_sii_supported(int level, int qual, int disks, int force)
case G_RAID_VOLUME_RL_RAID5:
if (disks < 3)
return (0);
+ if (qual != G_RAID_VOLUME_RLQ_R5LS)
+ return (0);
break;
default:
return (0);
}
- if (qual != G_RAID_VOLUME_RLQ_NONE)
+ if (level != G_RAID_VOLUME_RL_RAID5 && qual != G_RAID_VOLUME_RLQ_NONE)
return (0);
return (1);
}
@@ -719,6 +721,7 @@ g_raid_md_sii_start(struct g_raid_softc *sc)
sii_meta_get_name(meta, buf);
vol = g_raid_create_volume(sc, buf, -1);
vol->v_mediasize = (off_t)meta->total_sectors * 512;
+ vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;
if (meta->type == SII_T_RAID0) {
vol->v_raid_level = G_RAID_VOLUME_RL_RAID0;
size = vol->v_mediasize / mdi->mdio_total_disks;
@@ -736,6 +739,7 @@ g_raid_md_sii_start(struct g_raid_softc *sc)
size = 0;
} else if (meta->type == SII_T_RAID5) {
vol->v_raid_level = G_RAID_VOLUME_RL_RAID5;
+ vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_R5LS;
size = vol->v_mediasize / (mdi->mdio_total_disks - 1);
} else if (meta->type == SII_T_JBOD) {
vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE;
@@ -744,7 +748,6 @@ g_raid_md_sii_start(struct g_raid_softc *sc)
vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN;
size = 0;
}
- vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;
vol->v_strip_size = meta->strip_sectors * 512; //ZZZ
vol->v_disks_count = mdi->mdio_total_disks;
vol->v_sectorsize = 512; //ZZZ
@@ -1144,6 +1147,8 @@ g_raid_md_ctl_sii(struct g_raid_md_object *md,
gctl_error(req, "No RAID level.");
return (-3);
}
+ if (strcasecmp(levelname, "RAID5") == 0)
+ levelname = "RAID5LS";
if (g_raid_volume_str2level(levelname, &level, &qual)) {
gctl_error(req, "Unknown RAID level '%s'.", levelname);
return (-4);
@@ -1278,7 +1283,7 @@ g_raid_md_ctl_sii(struct g_raid_md_object *md,
vol = g_raid_create_volume(sc, volname, -1);
vol->v_md_data = (void *)(intptr_t)0;
vol->v_raid_level = level;
- vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;
+ vol->v_raid_level_qualifier = qual;
vol->v_strip_size = strip;
vol->v_disks_count = numdisks;
if (level == G_RAID_VOLUME_RL_RAID0 ||
OpenPOWER on IntegriCloud