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>