From owner-svn-src-projects@FreeBSD.ORG Thu Feb 10 11:27:31 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DC66D106566B; Thu, 10 Feb 2011 11:27:31 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CA2D68FC1B; Thu, 10 Feb 2011 11:27:31 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p1ABRViq020658; Thu, 10 Feb 2011 11:27:31 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p1ABRVFb020654; Thu, 10 Feb 2011 11:27:31 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201102101127.p1ABRVFb020654@svn.freebsd.org> From: Alexander Motin Date: Thu, 10 Feb 2011 11:27:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r218518 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Feb 2011 11:27:31 -0000 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 /