Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Feb 2011 11:27:31 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r218518 - projects/graid/head/sys/geom/raid
Message-ID:  <201102101127.p1ABRVFb020654@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 /



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102101127.p1ABRVFb020654>