svn commit: r219872 - projects/graid/head/sys/geom/raid

Alexander Motin mav at FreeBSD.org
Tue Mar 22 14:55:31 UTC 2011


Author: mav
Date: Tue Mar 22 14:55:31 2011
New Revision: 219872
URL: http://svn.freebsd.org/changeset/base/219872

Log:
  Add id argument to g_raid_create_volume(). When non-negative, it is used
  as hint for choosing volume ID. Read that value from Promise metadata.
  It allows to keep volumes numbering consistent across reboots and matching
  one shown by BIOS.

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
  projects/graid/head/sys/geom/raid/md_jmicron.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/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Tue Mar 22 13:42:22 2011	(r219871)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Tue Mar 22 14:55:31 2011	(r219872)
@@ -1697,7 +1697,7 @@ g_raid_create_node(struct g_class *mp,
 }
 
 struct g_raid_volume *
-g_raid_create_volume(struct g_raid_softc *sc, const char *name)
+g_raid_create_volume(struct g_raid_softc *sc, const char *name, int id)
 {
 	struct g_raid_volume	*vol, *vol1;
 	int i;
@@ -1721,15 +1721,24 @@ g_raid_create_volume(struct g_raid_softc
 
 	/* Find free ID for this volume. */
 	g_topology_lock();
-	for (i = 0; ; i++) {
+	vol1 = vol;
+	if (id >= 0) {
 		LIST_FOREACH(vol1, &g_raid_volumes, v_global_next) {
-			if (vol1->v_global_id == i)
+			if (vol1->v_global_id == id)
+				break;
+		}
+	}
+	if (vol1 != NULL) {
+		for (id = 0; ; id++) {
+			LIST_FOREACH(vol1, &g_raid_volumes, v_global_next) {
+				if (vol1->v_global_id == id)
+					break;
+			}
+			if (vol1 == NULL)
 				break;
 		}
-		if (vol1 == NULL)
-			break;
 	}
-	vol->v_global_id = i;
+	vol->v_global_id = id;
 	LIST_INSERT_HEAD(&g_raid_volumes, vol, v_global_next);
 	g_topology_unlock();
 

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Tue Mar 22 13:42:22 2011	(r219871)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Tue Mar 22 14:55:31 2011	(r219872)
@@ -350,7 +350,7 @@ struct g_raid_softc * g_raid_create_node
     const char *name, struct g_raid_md_object *md);
 int g_raid_create_node_format(const char *format, struct g_geom **gp);
 struct g_raid_volume * g_raid_create_volume(struct g_raid_softc *sc,
-    const char *name);
+    const char *name, int id);
 struct g_raid_disk * g_raid_create_disk(struct g_raid_softc *sc);
 const char * g_raid_get_diskname(struct g_raid_disk *disk);
 

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Tue Mar 22 13:42:22 2011	(r219871)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Tue Mar 22 14:55:31 2011	(r219872)
@@ -938,7 +938,7 @@ g_raid_md_intel_start(struct g_raid_soft
 	for (i = 0; i < meta->total_volumes; i++) {
 		mvol = intel_get_volume(meta, i);
 		mmap = intel_get_map(mvol, 0);
-		vol = g_raid_create_volume(sc, mvol->name);
+		vol = g_raid_create_volume(sc, mvol->name, -1);
 		vol->v_md_data = (void *)(intptr_t)i;
 		if (mmap->type == INTEL_T_RAID0)
 			vol->v_raid_level = G_RAID_VOLUME_RL_RAID0;
@@ -1537,7 +1537,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
 
 		/* We have all we need, create things: volume, ... */
 		mdi->mdio_started = 1;
-		vol = g_raid_create_volume(sc, volname);
+		vol = g_raid_create_volume(sc, volname, -1);
 		vol->v_md_data = (void *)(intptr_t)0;
 		vol->v_raid_level = level;
 		vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;
@@ -1721,7 +1721,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
 		}
 
 		/* We have all we need, create things: volume, ... */
-		vol = g_raid_create_volume(sc, volname);
+		vol = g_raid_create_volume(sc, volname, -1);
 		vol->v_md_data = (void *)(intptr_t)i;
 		vol->v_raid_level = level;
 		vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;

Modified: projects/graid/head/sys/geom/raid/md_jmicron.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_jmicron.c	Tue Mar 22 13:42:22 2011	(r219871)
+++ projects/graid/head/sys/geom/raid/md_jmicron.c	Tue Mar 22 14:55:31 2011	(r219872)
@@ -655,7 +655,7 @@ g_raid_md_jmicron_start(struct g_raid_so
 
 	/* Create volumes and subdisks. */
 	jmicron_meta_get_name(meta, buf);
-	vol = g_raid_create_volume(sc, buf);
+	vol = g_raid_create_volume(sc, buf, -1);
 	size = ((off_t)meta->disk_sectors_high << 16) + meta->disk_sectors_low;
 	size *= 512; //ZZZ
 	if (meta->type == JMICRON_T_RAID0) {
@@ -1187,7 +1187,7 @@ g_raid_md_ctl_jmicron(struct g_raid_md_o
 		/* We have all we need, create things: volume, ... */
 		mdi->mdio_total_disks = numdisks;
 		mdi->mdio_started = 1;
-		vol = g_raid_create_volume(sc, volname);
+		vol = g_raid_create_volume(sc, volname, -1);
 		vol->v_md_data = (void *)(intptr_t)0;
 		vol->v_raid_level = level;
 		vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;

Modified: projects/graid/head/sys/geom/raid/md_promise.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_promise.c	Tue Mar 22 13:42:22 2011	(r219871)
+++ projects/graid/head/sys/geom/raid/md_promise.c	Tue Mar 22 14:55:31 2011	(r219872)
@@ -940,7 +940,7 @@ g_raid_md_promise_new_disk(struct g_raid
 		vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id);
 		if (vol == NULL) {
 			promise_meta_get_name(pdmeta, buf);
-			vol = g_raid_create_volume(sc, buf);
+			vol = g_raid_create_volume(sc, buf, pdmeta->array_number);
 			pv = malloc(sizeof(*pv), M_MD_PROMISE, M_WAITOK | M_ZERO);
 			pv->pv_id = pdmeta->volume_id;
 			vol->v_md_data = pv;
@@ -1398,7 +1398,7 @@ g_raid_md_ctl_promise(struct g_raid_md_o
 		arc4rand(&pv->pv_id, sizeof(pv->pv_id), 0);
 		pv->pv_generation = 0;
 		pv->pv_started = 1;
-		vol = g_raid_create_volume(sc, volname);
+		vol = g_raid_create_volume(sc, volname, -1);
 		vol->v_md_data = pv;
 		vol->v_raid_level = level;
 		vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;
@@ -1715,8 +1715,7 @@ g_raid_md_write_promise(struct g_raid_md
 		if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 ||
 		    vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E)
 			meta->array_width /= 2;
-		if (pv->pv_meta != NULL)
-			meta->array_number = pv->pv_meta->array_number;
+		meta->array_number = vol->v_global_id;
 		meta->total_sectors = vol->v_mediasize / vol->v_sectorsize;
 		meta->cylinders = meta->total_sectors / (255 * 63) - 1;
 		meta->heads = 254;

Modified: projects/graid/head/sys/geom/raid/md_sii.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_sii.c	Tue Mar 22 13:42:22 2011	(r219871)
+++ projects/graid/head/sys/geom/raid/md_sii.c	Tue Mar 22 14:55:31 2011	(r219872)
@@ -721,7 +721,7 @@ g_raid_md_sii_start(struct g_raid_softc 
 
 	/* Create volumes and subdisks. */
 	sii_meta_get_name(meta, buf);
-	vol = g_raid_create_volume(sc, buf);
+	vol = g_raid_create_volume(sc, buf, -1);
 	vol->v_mediasize = (off_t)meta->total_sectors * 512;
 	if (meta->type == SII_T_RAID0) {
 		vol->v_raid_level = G_RAID_VOLUME_RL_RAID0;
@@ -1276,7 +1276,7 @@ g_raid_md_ctl_sii(struct g_raid_md_objec
 		/* We have all we need, create things: volume, ... */
 		mdi->mdio_total_disks = numdisks;
 		mdi->mdio_started = 1;
-		vol = g_raid_create_volume(sc, volname);
+		vol = g_raid_create_volume(sc, volname, -1);
 		vol->v_md_data = (void *)(intptr_t)0;
 		vol->v_raid_level = level;
 		vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE;


More information about the svn-src-projects mailing list