diff options
author | mav <mav@FreeBSD.org> | 2012-04-19 12:30:12 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2012-04-19 12:30:12 +0000 |
commit | fdb56713f24f9603c0b1d9d04f819a450c247a91 (patch) | |
tree | c52f9a1d2117f93577e84485d022a8663b182fd4 /sys/geom/raid/md_sii.c | |
parent | a1620c99050bae85bb7454bbd11131f9502802c6 (diff) | |
download | FreeBSD-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.c | 11 |
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 || |