From owner-svn-src-projects@FreeBSD.ORG Tue Mar 22 14:55: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 B129D1065672; Tue, 22 Mar 2011 14:55: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 A0FF08FC15; Tue, 22 Mar 2011 14:55: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 p2MEtVT1062934; Tue, 22 Mar 2011 14:55:31 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2MEtVK7062927; Tue, 22 Mar 2011 14:55:31 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103221455.p2MEtVK7062927@svn.freebsd.org> From: Alexander Motin Date: Tue, 22 Mar 2011 14:55: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: r219872 - 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: Tue, 22 Mar 2011 14:55:31 -0000 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;