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