svn commit: r219921 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Wed Mar 23 16:58:04 UTC 2011
Author: mav
Date: Wed Mar 23 16:58:04 2011
New Revision: 219921
URL: http://svn.freebsd.org/changeset/base/219921
Log:
- Use RAID10 and RAID01 names more carefully. Even if they are very alike,
they suppose different disk order (aabb vs abab).
- Fix RAID01 disk order for NVidia.
Modified:
projects/graid/head/sys/geom/raid/md_nvidia.c
projects/graid/head/sys/geom/raid/md_promise.c
projects/graid/head/sys/geom/raid/md_sii.c
Modified: projects/graid/head/sys/geom/raid/md_nvidia.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_nvidia.c Wed Mar 23 16:38:29 2011 (r219920)
+++ projects/graid/head/sys/geom/raid/md_nvidia.c Wed Mar 23 16:58:04 2011 (r219921)
@@ -78,7 +78,8 @@ struct nvidia_raid_conf {
#define NVIDIA_T_RAID3 0x0083
#define NVIDIA_T_RAID5 0x0085 /* RLQ = 00/02? */
#define NVIDIA_T_RAID5_SYM 0x0095 /* RLQ = 03 */
-#define NVIDIA_T_RAID10 0x8180
+#define NVIDIA_T_RAID10 0x008a
+#define NVIDIA_T_RAID01 0x8180
#define NVIDIA_T_CONCAT 0x00ff
uint16_t dummy_3;
@@ -199,6 +200,19 @@ nvidia_meta_copy(struct nvidia_raid_conf
return (nmeta);
}
+static int
+nvidia_meta_translate_disk(struct nvidia_raid_conf *meta, int md_disk_pos)
+{
+ int disk_pos;
+
+ if (md_disk_pos >= 0 && meta->type == NVIDIA_T_RAID01) {
+ disk_pos = (md_disk_pos / meta->array_width) +
+ (md_disk_pos % meta->array_width) * meta->array_width;
+ } else
+ disk_pos = md_disk_pos;
+ return (disk_pos);
+}
+
static void
nvidia_meta_get_name(struct nvidia_raid_conf *meta, char *buf)
{
@@ -279,7 +293,7 @@ nvidia_meta_read(struct g_consumer *cp)
if (meta->type != NVIDIA_T_RAID0 && meta->type != NVIDIA_T_RAID1 &&
meta->type != NVIDIA_T_RAID3 && meta->type != NVIDIA_T_RAID5 &&
meta->type != NVIDIA_T_RAID5_SYM &&
- meta->type != NVIDIA_T_RAID10 && meta->type != NVIDIA_T_CONCAT) {
+ meta->type != NVIDIA_T_RAID01 && meta->type != NVIDIA_T_CONCAT) {
G_RAID_DEBUG(1, "NVidia unknown RAID level on %s (0x%02x)",
pp->name, meta->type);
free(meta, M_MD_NVIDIA);
@@ -426,6 +440,8 @@ g_raid_md_nvidia_start_disk(struct g_rai
disk_pos = -3;
} else
disk_pos = -3;
+ /* For RAID0+1 we need to translate order. */
+ disk_pos = nvidia_meta_translate_disk(meta, disk_pos);
if (disk_pos < 0) {
G_RAID_DEBUG1(1, sc, "Unknown, probably new or stale disk");
/* If we are in the start process, that's all for now. */
@@ -654,7 +670,7 @@ g_raid_md_nvidia_start(struct g_raid_sof
} else if (meta->type == NVIDIA_T_RAID1) {
vol->v_raid_level = G_RAID_VOLUME_RL_RAID1;
size = vol->v_mediasize;
- } else if (meta->type == NVIDIA_T_RAID10) {
+ } else if (meta->type == NVIDIA_T_RAID01) {
vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E;
size = vol->v_mediasize / (mdi->mdio_total_disks / 2);
} else if (meta->type == NVIDIA_T_CONCAT) {
@@ -1441,7 +1457,7 @@ g_raid_md_write_nvidia(struct g_raid_md_
else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1)
meta->type = NVIDIA_T_RAID1;
else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E)
- meta->type = NVIDIA_T_RAID10;
+ meta->type = NVIDIA_T_RAID01;
else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT ||
vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE)
meta->type = NVIDIA_T_CONCAT;
@@ -1488,7 +1504,9 @@ g_raid_md_write_nvidia(struct g_raid_md_
}
pd->pd_meta = nvidia_meta_copy(meta);
if ((sd = TAILQ_FIRST(&disk->d_subdisks)) != NULL) {
- pd->pd_meta->disk_number = sd->sd_pos;
+ /* For RAID0+1 we need to translate order. */
+ pd->pd_meta->disk_number =
+ nvidia_meta_translate_disk(meta, sd->sd_pos);
if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE) {
pd->pd_meta->disk_status = 0x100;
pd->pd_meta->rebuild_lba =
Modified: projects/graid/head/sys/geom/raid/md_promise.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_promise.c Wed Mar 23 16:38:29 2011 (r219920)
+++ projects/graid/head/sys/geom/raid/md_promise.c Wed Mar 23 16:58:04 2011 (r219921)
@@ -623,7 +623,7 @@ g_raid_md_promise_start_disk(struct g_ra
if (sdn >= 0) {
/* Find disk position in metadata by it's serial. */
md_disk_pos = promise_meta_find_disk(meta, pd->pd_meta[sdn]->disk.id);
- /* For RAID10 we need to translate order. */
+ /* For RAID0+1 we need to translate order. */
disk_pos = promise_meta_translate_disk(vol, md_disk_pos);
} else {
md_disk_pos = -1;
@@ -684,7 +684,7 @@ g_raid_md_promise_start_disk(struct g_ra
if (disk_pos >= 0) {
if (vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT)
esize = size / 512;
- /* For RAID10 we need to translate order. */
+ /* For RAID0+1 we need to translate order. */
md_disk_pos = promise_meta_translate_disk(vol, disk_pos);
} else {
nofit:
@@ -1725,7 +1725,7 @@ g_raid_md_write_promise(struct g_raid_md
rebuild = 0;
for (i = 0; i < vol->v_disks_count; i++) {
sd = &vol->v_subdisks[i];
- /* For RAID10 we need to translate order. */
+ /* For RAID0+1 we need to translate order. */
pos = promise_meta_translate_disk(vol, i);
meta->disks[pos].flags = PROMISE_F_VALID |
PROMISE_F_ASSIGNED;
@@ -1795,7 +1795,7 @@ g_raid_md_write_promise(struct g_raid_md
disk = sd->sd_disk;
if (disk == NULL)
continue;
- /* For RAID10 we need to translate order. */
+ /* For RAID0+1 we need to translate order. */
pos = promise_meta_translate_disk(vol, i);
pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data;
for (j = 0; j < pd->pd_subdisks; j++) {
Modified: projects/graid/head/sys/geom/raid/md_sii.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_sii.c Wed Mar 23 16:38:29 2011 (r219920)
+++ projects/graid/head/sys/geom/raid/md_sii.c Wed Mar 23 16:58:04 2011 (r219921)
@@ -59,7 +59,7 @@ struct sii_raid_conf {
uint8_t type;
#define SII_T_RAID0 0x00
#define SII_T_RAID1 0x01
-#define SII_T_RAID10 0x02
+#define SII_T_RAID01 0x02
#define SII_T_SPARE 0x03
#define SII_T_CONCAT 0x04
#define SII_T_RAID5 0x10
@@ -200,7 +200,7 @@ sii_meta_total_disks(struct sii_raid_con
return (meta->raid0_disks);
case SII_T_RAID1:
return (meta->raid1_disks);
- case SII_T_RAID10:
+ case SII_T_RAID01:
return (meta->raid0_disks * meta->raid1_disks);
case SII_T_SPARE:
case SII_T_JBOD:
@@ -225,7 +225,7 @@ sii_meta_disk_pos(struct sii_raid_conf *
case SII_T_RAID5:
case SII_T_CONCAT:
return (pdmeta->disk_number);
- case SII_T_RAID10:
+ case SII_T_RAID01:
return (pdmeta->raid1_ident * pdmeta->raid1_disks +
pdmeta->raid0_ident);
case SII_T_JBOD:
@@ -306,7 +306,7 @@ sii_meta_read(struct g_consumer *cp)
/* Check raid type. */
if (meta->type != SII_T_RAID0 && meta->type != SII_T_RAID1 &&
- meta->type != SII_T_RAID10 && meta->type != SII_T_SPARE &&
+ meta->type != SII_T_RAID01 && meta->type != SII_T_SPARE &&
meta->type != SII_T_RAID5 && meta->type != SII_T_CONCAT &&
meta->type != SII_T_JBOD) {
G_RAID_DEBUG(1, "SiI unknown RAID level on %s (0x%02x)",
@@ -729,7 +729,7 @@ g_raid_md_sii_start(struct g_raid_softc
} else if (meta->type == SII_T_RAID1) {
vol->v_raid_level = G_RAID_VOLUME_RL_RAID1;
size = vol->v_mediasize;
- } else if (meta->type == SII_T_RAID10) {
+ } else if (meta->type == SII_T_RAID01) {
vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E;
size = vol->v_mediasize / (mdi->mdio_total_disks / 2);
} else if (meta->type == SII_T_CONCAT) {
@@ -1533,7 +1533,7 @@ g_raid_md_write_sii(struct g_raid_md_obj
meta->raid0_disks = 0xff;
meta->raid1_disks = vol->v_disks_count;
} else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) {
- meta->type = SII_T_RAID10;
+ meta->type = SII_T_RAID01;
meta->raid0_disks = vol->v_disks_count / 2;
meta->raid1_disks = 2;
} else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT ||
More information about the svn-src-projects
mailing list