Date: Tue, 22 Mar 2011 14:55:31 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r219872 - projects/graid/head/sys/geom/raid Message-ID: <201103221455.p2MEtVK7062927@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103221455.p2MEtVK7062927>