svn commit: r218518 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Thu Feb 10 11:27:31 UTC 2011
Author: mav
Date: Thu Feb 10 11:27:31 2011
New Revision: 218518
URL: http://svn.freebsd.org/changeset/base/218518
Log:
Remove RAID10 RAID level constant, not defined by DDF specification. Use
RAID1E constant instead. For even number of disks it is exactly the same,
while it is really single level transformation, as we may handle it.
Tune Intel metadata decoding, adding support for 3+ disks RAID1 and RAID1E
with odd number of disks. None of them supported by Intel RAID BIOS or other
drivers, but if I interpret numbers correctly, there is enough information
to represent them.
Modified:
projects/graid/head/sys/geom/raid/g_raid.c
projects/graid/head/sys/geom/raid/g_raid.h
projects/graid/head/sys/geom/raid/md_intel.c
Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c Thu Feb 10 10:51:12 2011 (r218517)
+++ projects/graid/head/sys/geom/raid/g_raid.c Thu Feb 10 11:27:31 2011 (r218518)
@@ -275,8 +275,6 @@ g_raid_volume_level2str(int level, int q
return ("RAID5");
case G_RAID_VOLUME_RL_RAID6:
return ("RAID6");
- case G_RAID_VOLUME_RL_RAID10:
- return ("RAID10");
case G_RAID_VOLUME_RL_RAID1E:
return ("RAID1E");
case G_RAID_VOLUME_RL_SINGLE:
@@ -310,9 +308,8 @@ g_raid_volume_str2level(const char *str,
*level = G_RAID_VOLUME_RL_RAID5;
else if (strcasecmp(str, "RAID6") == 0)
*level = G_RAID_VOLUME_RL_RAID6;
- else if (strcasecmp(str, "RAID10") == 0)
- *level = G_RAID_VOLUME_RL_RAID10;
- else if (strcasecmp(str, "RAID1E") == 0)
+ else if (strcasecmp(str, "RAID10") == 0 ||
+ strcasecmp(str, "RAID1E") == 0)
*level = G_RAID_VOLUME_RL_RAID1E;
else if (strcasecmp(str, "SINGLE") == 0)
*level = G_RAID_VOLUME_RL_SINGLE;
Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h Thu Feb 10 10:51:12 2011 (r218517)
+++ projects/graid/head/sys/geom/raid/g_raid.h Thu Feb 10 11:27:31 2011 (r218518)
@@ -216,7 +216,6 @@ struct g_raid_subdisk {
#define G_RAID_VOLUME_RL_RAID4 0x04
#define G_RAID_VOLUME_RL_RAID5 0x05
#define G_RAID_VOLUME_RL_RAID6 0x06
-#define G_RAID_VOLUME_RL_RAID10 0x0a
#define G_RAID_VOLUME_RL_RAID1E 0x11
#define G_RAID_VOLUME_RL_SINGLE 0x0f
#define G_RAID_VOLUME_RL_CONCAT 0x1f
Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c Thu Feb 10 10:51:12 2011 (r218517)
+++ projects/graid/head/sys/geom/raid/md_intel.c Thu Feb 10 11:27:31 2011 (r218518)
@@ -898,11 +898,20 @@ g_raid_md_intel_start(struct g_raid_soft
if (mmap->type == INTEL_T_RAID0)
vol->v_raid_level = G_RAID_VOLUME_RL_RAID0;
else if (mmap->type == INTEL_T_RAID1 &&
- mmap->total_disks < 4) /* >= 4 disks -> RAID10 */
- vol->v_raid_level = G_RAID_VOLUME_RL_RAID1;
- else if (mmap->type == INTEL_T_RAID1) /* SIC */
- vol->v_raid_level = G_RAID_VOLUME_RL_RAID10;
- else if (mmap->type == INTEL_T_RAID5)
+ mmap->total_domains >= 2 &&
+ mmap->total_domains <= mmap->total_disks) {
+ /* Assume total_domains is correct. */
+ if (mmap->total_domains == mmap->total_disks)
+ vol->v_raid_level = G_RAID_VOLUME_RL_RAID1;
+ else
+ vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E;
+ } else if (mmap->type == INTEL_T_RAID1) {
+ /* total_domains looks wrong. */
+ if (mmap->total_disks <= 2)
+ vol->v_raid_level = G_RAID_VOLUME_RL_RAID1;
+ else
+ vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E;
+ } else if (mmap->type == INTEL_T_RAID5)
vol->v_raid_level = G_RAID_VOLUME_RL_RAID5;
else
vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN;
@@ -1353,7 +1362,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
if (level != G_RAID_VOLUME_RL_RAID0 &&
level != G_RAID_VOLUME_RL_RAID1 &&
level != G_RAID_VOLUME_RL_RAID5 &&
- level != G_RAID_VOLUME_RL_RAID10) {
+ level != G_RAID_VOLUME_RL_RAID1E) {
gctl_error(req, "Unsupported RAID level.");
return (-5);
}
@@ -1517,8 +1526,10 @@ makedisk:
vol->v_mediasize = size;
else if (level == G_RAID_VOLUME_RL_RAID5)
vol->v_mediasize = size * (numdisks - 1);
- else /* RAID10 */
- vol->v_mediasize = size * (numdisks / 2);
+ else { /* RAID1E */
+ vol->v_mediasize = ((size * numdisks) / strip / 2) *
+ strip;
+ }
vol->v_sectorsize = sectorsize;
g_raid_start_volume(vol);
@@ -1576,7 +1587,7 @@ makedisk:
if (level != G_RAID_VOLUME_RL_RAID0 &&
level != G_RAID_VOLUME_RL_RAID1 &&
level != G_RAID_VOLUME_RL_RAID5 &&
- level != G_RAID_VOLUME_RL_RAID10) {
+ level != G_RAID_VOLUME_RL_RAID1E) {
gctl_error(req, "Unsupported RAID level.");
return (-5);
}
@@ -1695,8 +1706,10 @@ makedisk:
vol->v_mediasize = size;
else if (level == G_RAID_VOLUME_RL_RAID5)
vol->v_mediasize = size * (numdisks - 1);
- else /* RAID10 */
- vol->v_mediasize = size * (numdisks / 2);
+ else { /* RAID1E */
+ vol->v_mediasize = ((size * numdisks) / strip / 2) *
+ strip;
+ }
vol->v_sectorsize = sectorsize;
g_raid_start_volume(vol);
@@ -2141,15 +2154,15 @@ g_raid_md_write_intel(struct g_raid_md_o
if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0)
mmap0->type = INTEL_T_RAID0;
else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 ||
- vol->v_raid_level == G_RAID_VOLUME_RL_RAID10)
+ vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E)
mmap0->type = INTEL_T_RAID1;
else
mmap0->type = INTEL_T_RAID5;
mmap0->total_disks = vol->v_disks_count;
- if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID10)
- mmap0->total_domains = vol->v_disks_count / 2;
- else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1)
+ if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1)
mmap0->total_domains = vol->v_disks_count;
+ else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E)
+ mmap0->total_domains = 2;
else
mmap0->total_domains = 1;
mmap0->stripe_count = sd->sd_size / vol->v_strip_size /
More information about the svn-src-projects
mailing list