From owner-svn-src-projects@FreeBSD.ORG Sun Jan 30 07:49:45 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 524E7106566C; Sun, 30 Jan 2011 07:49:45 +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 428558FC1E; Sun, 30 Jan 2011 07:49:45 +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 p0U7njq6061935; Sun, 30 Jan 2011 07:49:45 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0U7njnC061933; Sun, 30 Jan 2011 07:49:45 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201101300749.p0U7njnC061933@svn.freebsd.org> From: Alexander Motin Date: Sun, 30 Jan 2011 07:49:45 +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: r218083 - 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: Sun, 30 Jan 2011 07:49:45 -0000 Author: mav Date: Sun Jan 30 07:49:44 2011 New Revision: 218083 URL: http://svn.freebsd.org/changeset/base/218083 Log: Implement delayed until last provider close node destruction. Use it on system shutdown to gracefully stop rebuild and other processes and close lower level providers, allowing them do the same. Modified: projects/graid/head/sys/geom/raid/g_raid.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Sun Jan 30 02:17:47 2011 (r218082) +++ projects/graid/head/sys/geom/raid/g_raid.c Sun Jan 30 07:49:44 2011 (r218083) @@ -92,7 +92,7 @@ LIST_HEAD(, g_raid_tr_class) g_raid_tr_c LIST_HEAD(, g_raid_volume) g_raid_volumes = LIST_HEAD_INITIALIZER(g_raid_volumes); -//static eventhandler_tag g_raid_pre_sync = NULL; +static eventhandler_tag g_raid_pre_sync = NULL; static int g_raid_started = 0; static int g_raid_destroy_geom(struct gctl_req *req, struct g_class *mp, @@ -1212,7 +1212,7 @@ process: vol->v_timeout(vol, vol->v_to_arg); } } - if (sc->sc_stopping != 0) + if (sc->sc_stopping == G_RAID_DESTROY_HARD) g_raid_destroy_node(sc, 1); /* May not return. */ } } @@ -1441,9 +1441,9 @@ g_raid_update_disk(struct g_raid_disk *d static int g_raid_access(struct g_provider *pp, int acr, int acw, int ace) { - struct g_raid_volume *vol; + struct g_raid_volume *vol, *vol1; struct g_raid_softc *sc; - int dcr, dcw, dce; + int dcr, dcw, dce, opens, error = 0; g_topology_assert(); G_RAID_DEBUG(2, "Access request for %s: r%dw%de%d.", pp->name, acr, @@ -1460,14 +1460,35 @@ g_raid_access(struct g_provider *pp, int g_topology_unlock(); sx_xlock(&sc->sc_lock); + /* Deny new opens while dying. */ + if (sc->sc_stopping != 0 && (acr > 0 || acw > 0 || ace > 0)) { + error = ENXIO; + goto out; + } // if (dcw == 0 && !vol->v_idle) // g_raid_idle(vol, dcw); vol->v_provider_open += acr + acw + ace; + /* Handle delayed node destruction. */ + if (sc->sc_stopping == G_RAID_DESTROY_DELAYED && + vol->v_provider_open == 0) { + /* Count open volumes. */ + opens = 0; + TAILQ_FOREACH(vol1, &sc->sc_volumes, v_next) { + if (vol1->v_provider_open != 0) + opens++; + } + if (opens == 0) { + sc->sc_stopping = G_RAID_DESTROY_HARD; + g_raid_event_send(sc, 0, 0); /* Wake up worker. */ + } + } + /* Handle open volume destruction. */ if (vol->v_stopping && vol->v_provider_open == 0) g_raid_destroy_volume(vol); +out: sx_xunlock(&sc->sc_lock); g_topology_lock(); - return (0); + return (error); } struct g_raid_softc * @@ -1612,7 +1633,7 @@ g_raid_destroy_node(struct g_raid_softc struct g_raid_disk *disk, *tmpd; int error = 0; - sc->sc_stopping = 1; + sc->sc_stopping = G_RAID_DESTROY_HARD; TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tmpv) { if (g_raid_destroy_volume(vol)) error = EBUSY; @@ -1698,7 +1719,7 @@ g_raid_destroy_volume(struct g_raid_volu } G_RAID_DEBUG(2, "Volume %s destroyed.", vol->v_name); free(vol, M_RAID); - if (sc->sc_stopping) + if (sc->sc_stopping == G_RAID_DESTROY_HARD) g_raid_event_send(sc, 0, 0); /* Wake up worker. */ return (0); } @@ -1760,7 +1781,7 @@ g_raid_destroy(struct g_raid_softc *sc, G_RAID_DEBUG(1, "Node %s will be destroyed on last close.", sc->sc_name); -// sc->sc_stopping = 1; + sc->sc_stopping = G_RAID_DESTROY_DELAYED; return (EBUSY); case G_RAID_DESTROY_HARD: G_RAID_DEBUG(1, @@ -1770,7 +1791,7 @@ g_raid_destroy(struct g_raid_softc *sc, } /* Mark node for destruction. */ - sc->sc_stopping = 1; + sc->sc_stopping = G_RAID_DESTROY_HARD; /* Wake up worker to let it selfdestruct. */ g_raid_event_send(sc, 0, 0); /* Sleep until node destroyed. */ @@ -1970,7 +1991,6 @@ g_raid_dumpconf(struct sbuf *sb, const c } } -#if 0 static void g_raid_shutdown_pre_sync(void *arg, int howto) { @@ -1996,16 +2016,15 @@ g_raid_shutdown_pre_sync(void *arg, int g_topology_unlock(); PICKUP_GIANT(); } -#endif static void g_raid_init(struct g_class *mp) { -// g_raid_pre_sync = EVENTHANDLER_REGISTER(shutdown_pre_sync, -// g_raid_shutdown_pre_sync, mp, SHUTDOWN_PRI_FIRST); -// if (g_raid_pre_sync == NULL) -// G_RAID_DEBUG(0, "Warning! Cannot register shutdown event."); + g_raid_pre_sync = EVENTHANDLER_REGISTER(shutdown_pre_sync, + g_raid_shutdown_pre_sync, mp, SHUTDOWN_PRI_FIRST); + if (g_raid_pre_sync == NULL) + G_RAID_DEBUG(0, "Warning! Cannot register shutdown event."); g_raid_started = 1; } @@ -2013,8 +2032,8 @@ static void g_raid_fini(struct g_class *mp) { -// if (g_raid_pre_sync != NULL) -// EVENTHANDLER_DEREGISTER(shutdown_pre_sync, g_raid_pre_sync); + if (g_raid_pre_sync != NULL) + EVENTHANDLER_DEREGISTER(shutdown_pre_sync, g_raid_pre_sync); g_raid_started = 0; } From owner-svn-src-projects@FreeBSD.ORG Sun Jan 30 10:35:42 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 35D2A106566C; Sun, 30 Jan 2011 10:35:42 +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 25D568FC12; Sun, 30 Jan 2011 10:35:42 +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 p0UAZg6X068476; Sun, 30 Jan 2011 10:35:42 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0UAZgdZ068473; Sun, 30 Jan 2011 10:35:42 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201101301035.p0UAZgdZ068473@svn.freebsd.org> From: Alexander Motin Date: Sun, 30 Jan 2011 10:35:42 +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: r218084 - 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: Sun, 30 Jan 2011 10:35:42 -0000 Author: mav Date: Sun Jan 30 10:35:41 2011 New Revision: 218084 URL: http://svn.freebsd.org/changeset/base/218084 Log: Implement volume idle state tracking. Volume counted as idle when no payload write requests were running for specified number of seconds. Write volume dirty flag of Intel metadata as !v_idle. This should trigger volume resynchronization or work in SUBOPTIMAL mode after dirty reboot. Modified: projects/graid/head/sys/geom/raid/g_raid.c projects/graid/head/sys/geom/raid/md_intel.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Sun Jan 30 07:49:44 2011 (r218083) +++ projects/graid/head/sys/geom/raid/g_raid.c Sun Jan 30 10:35:41 2011 (r218084) @@ -657,7 +657,6 @@ g_raid_bump_genid(struct g_raid_softc *s static int g_raid_idle(struct g_raid_volume *vol, int acw) { - struct g_raid_disk *disk; struct g_raid_softc *sc; int timeout; @@ -665,38 +664,28 @@ g_raid_idle(struct g_raid_volume *vol, i g_topology_assert_not(); sx_assert(&sc->sc_lock, SX_XLOCKED); - if (vol->v_provider == NULL) - return (0); // if ((sc->sc_flags & G_RAID_DEVICE_FLAG_NOFAILSYNC) != 0) // return (0); if (vol->v_idle) return (0); if (vol->v_writes > 0) return (0); - if (acw > 0 || (acw == -1 && vol->v_provider->acw > 0)) { + if (acw > 0 || (acw == -1 && + vol->v_provider != NULL && vol->v_provider->acw > 0)) { timeout = g_raid_idletime - (time_uptime - vol->v_last_write); if (timeout > 0) return (timeout); } vol->v_idle = 1; -// ZZZ - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - if (disk->d_state != G_RAID_DISK_S_ACTIVE) - continue; -// if (!(disk->d_flags & G_RAID_DISK_FLAG_DIRTY)) -// continue; - G_RAID_DEBUG(1, "Disk %s (device %s) marked as clean.", - g_raid_get_diskname(disk), sc->sc_name); -// disk->d_flags &= ~G_RAID_DISK_FLAG_DIRTY; -// g_raid_update_metadata(disk); - } + G_RAID_DEBUG(1, "Volume %s (node %s) marked as clean.", + vol->v_name, sc->sc_name); + g_raid_write_metadata(sc, vol, NULL, NULL); return (0); } static void g_raid_unidle(struct g_raid_volume *vol) { - struct g_raid_disk *disk; struct g_raid_softc *sc; sc = vol->v_softc; @@ -706,16 +695,9 @@ g_raid_unidle(struct g_raid_volume *vol) // if ((sc->sc_flags & G_RAID_DEVICE_FLAG_NOFAILSYNC) != 0) // return; vol->v_idle = 0; - vol->v_last_write = time_uptime; -//ZZZ - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - if (disk->d_state != G_RAID_DISK_S_ACTIVE) - continue; - G_RAID_DEBUG(1, "Disk %s (device %s) marked as dirty.", - g_raid_get_diskname(disk), sc->sc_name); -// disk->d_flags |= G_RAID_DISK_FLAG_DIRTY; -// g_raid_update_metadata(disk); - } + G_RAID_DEBUG(1, "Volume %s (node %s) marked as dirty.", + vol->v_name, sc->sc_name); + g_raid_write_metadata(sc, vol, NULL, NULL); } static void @@ -911,14 +893,13 @@ g_raid_start_request(struct bio *bp) if (bp->bio_cmd == BIO_WRITE || bp->bio_cmd == BIO_DELETE) { if (vol->v_idle) g_raid_unidle(vol); - else - vol->v_last_write = time_uptime; + vol->v_writes++; } /* * Put request onto inflight queue, so we can check if new * synchronization requests don't collide with it. Then tell - * the tranlsation layer to start the I/O. + * the transformation layer to start the I/O. */ bioq_insert_tail(&vol->v_inflight, bp); G_RAID_TR_IOSTART(vol->v_tr, bp); @@ -936,6 +917,13 @@ g_raid_iodone(struct bio *bp, int error) vol = bp->bio_to->private; G_RAID_LOGREQ(3, bp, "Request done: %d.", error); + + /* Update stats if we done write/delete. */ + if (bp->bio_cmd == BIO_WRITE || bp->bio_cmd == BIO_DELETE) { + vol->v_writes--; + vol->v_last_write = time_uptime; + } + bioq_remove(&vol->v_inflight, bp); if (bp->bio_cmd == BIO_WRITE && vol->v_pending_lock && g_raid_is_in_locked_range(vol, bp)) { @@ -1040,13 +1028,8 @@ g_raid_unlock_range(struct g_raid_volume void g_raid_subdisk_iostart(struct g_raid_subdisk *sd, struct bio *bp) { - struct g_raid_volume *vol; struct g_consumer *cp; - vol = sd->sd_volume; - if (bp->bio_cmd == BIO_WRITE) - vol->v_writes++; - cp = sd->sd_disk->d_consumer; bp->bio_from = sd->sd_disk->d_consumer; bp->bio_to = sd->sd_disk->d_consumer->provider; @@ -1111,8 +1094,6 @@ g_raid_disk_done_request(struct bio *bp) sc = sd->sd_softc; vol = sd->sd_volume; bp->bio_from->index--; - if (bp->bio_cmd == BIO_WRITE) - vol->v_writes--; disk = bp->bio_from->private; if (disk == NULL) { g_topology_lock(); @@ -1205,8 +1186,7 @@ process: } if (rv == EWOULDBLOCK) { TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { - if (bioq_first(&vol->v_inflight) == NULL && - !vol->v_idle) + if (vol->v_writes == 0 && !vol->v_idle) g_raid_idle(vol, -1); if (vol->v_timeout) vol->v_timeout(vol, vol->v_to_arg); @@ -1465,8 +1445,8 @@ g_raid_access(struct g_provider *pp, int error = ENXIO; goto out; } -// if (dcw == 0 && !vol->v_idle) -// g_raid_idle(vol, dcw); + if (dcw == 0 && !vol->v_idle) + g_raid_idle(vol, dcw); vol->v_provider_open += acr + acw + ace; /* Handle delayed node destruction. */ if (sc->sc_stopping == G_RAID_DESTROY_DELAYED && Modified: projects/graid/head/sys/geom/raid/md_intel.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_intel.c Sun Jan 30 07:49:44 2011 (r218083) +++ projects/graid/head/sys/geom/raid/md_intel.c Sun Jan 30 10:35:41 2011 (r218084) @@ -1956,6 +1956,7 @@ g_raid_md_write_intel(struct g_raid_md_o mvol->migr_type = INTEL_MT_REPAIR; } else mvol->migr_state = 0; + mvol->dirty = !vol->v_idle; mmap0 = intel_get_map(mvol, 0); From owner-svn-src-projects@FreeBSD.ORG Sun Jan 30 12:04:22 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 378F61065693; Sun, 30 Jan 2011 12:04:22 +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 283208FC08; Sun, 30 Jan 2011 12:04:22 +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 p0UC4MLi070820; Sun, 30 Jan 2011 12:04:22 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0UC4MUp070818; Sun, 30 Jan 2011 12:04:22 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201101301204.p0UC4MUp070818@svn.freebsd.org> From: Alexander Motin Date: Sun, 30 Jan 2011 12:04:22 +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: r218086 - 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: Sun, 30 Jan 2011 12:04:22 -0000 Author: mav Date: Sun Jan 30 12:04:21 2011 New Revision: 218086 URL: http://svn.freebsd.org/changeset/base/218086 Log: Make `graid label` report name of created geom. This name is required for any further array operations, especially for scripting. Modified: projects/graid/head/sys/geom/raid/g_raid_ctl.c Modified: projects/graid/head/sys/geom/raid/g_raid_ctl.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid_ctl.c Sun Jan 30 11:23:59 2011 (r218085) +++ projects/graid/head/sys/geom/raid/g_raid_ctl.c Sun Jan 30 12:04:21 2011 (r218086) @@ -72,6 +72,7 @@ g_raid_ctl_label(struct gctl_req *req, s const char *format; int *nargs; int crstatus, ctlstatus; + char buf[64]; nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); if (nargs == NULL) { @@ -101,6 +102,12 @@ g_raid_ctl_label(struct gctl_req *req, s gctl_error(req, "Command failed: %d.", ctlstatus); if (crstatus == G_RAID_MD_TASTE_NEW) g_raid_destroy_node(sc, 0); + } else { + if (crstatus == G_RAID_MD_TASTE_NEW) + snprintf(buf, sizeof(buf), "%s created\n", sc->sc_name); + else + snprintf(buf, sizeof(buf), "%s reused\n", sc->sc_name); + gctl_set_param_err(req, "output", buf, strlen(buf) + 1); } sx_xunlock(&sc->sc_lock); g_topology_lock(); From owner-svn-src-projects@FreeBSD.ORG Sun Jan 30 12:12:25 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 8820C1065673; Sun, 30 Jan 2011 12:12:25 +0000 (UTC) (envelope-from pho@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 77BA18FC15; Sun, 30 Jan 2011 12:12:25 +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 p0UCCPFv071082; Sun, 30 Jan 2011 12:12:25 GMT (envelope-from pho@svn.freebsd.org) Received: (from pho@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0UCCPGs071077; Sun, 30 Jan 2011 12:12:25 GMT (envelope-from pho@svn.freebsd.org) Message-Id: <201101301212.p0UCCPGs071077@svn.freebsd.org> From: Peter Holm Date: Sun, 30 Jan 2011 12:12:25 +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: r218087 - projects/stress2/misc 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: Sun, 30 Jan 2011 12:12:25 -0000 Author: pho Date: Sun Jan 30 12:12:25 2011 New Revision: 218087 URL: http://svn.freebsd.org/changeset/base/218087 Log: Added test scenarios for the newfs(8) option TRIM. Added: projects/stress2/misc/trim.sh (contents, props changed) projects/stress2/misc/trim2.sh (contents, props changed) projects/stress2/misc/trim3.sh (contents, props changed) projects/stress2/misc/trim4.sh (contents, props changed) Added: projects/stress2/misc/trim.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/stress2/misc/trim.sh Sun Jan 30 12:12:25 2011 (r218087) @@ -0,0 +1,76 @@ +#!/bin/sh + +# +# Copyright (c) 2011 Peter Holm +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +# Run with marcus.cfg on a malloc backed MD with option trim. + +. ../default.cfg + +[ "`sysctl vm.md_malloc_wait | awk '{print $NF}'`" != "1" ] && \ + echo "sysctl vm.md_malloc_wait should be set to 1" +mount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart + +size="128m" +[ `uname -m` = "amd64" ] && size="1g" +[ $# -eq 0 ] && trim=-t +n=0 +for flag in '' '-U' '-U'; do + n=$((n + 1)) + echo "mdconfig -a -t malloc -o reserve -s $size -u $mdstart" + mdconfig -a -t malloc -o reserve -s $size -u $mdstart || exit 1 + bsdlabel -w md$mdstart auto + + echo "newfs $trim $flag md${mdstart}$part" + newfs $trim $flag md${mdstart}$part > /dev/null + [ $n -eq 3 ] && tunefs -? 2>&1 | grep -q "j enable" && \ + tunefs -j enable /dev/md${mdstart}$part + + mount /dev/md${mdstart}$part $mntpoint + chmod 777 $mntpoint + + export runRUNTIME=10m + export RUNDIR=$mntpoint/stressX + + su $testuser -c 'cd ..; ./run.sh marcus.cfg' > /dev/null 2>&1 + + while mount | grep $mntpoint | grep -q /dev/md; do + umount $mntpoint || sleep 1 + done + dumpfs /dev/md${mdstart}$part > /tmp/dumpfs.1 + sleep 1 + fsck -t ufs -y /dev/md${mdstart}$part > /tmp/fsck.log 2>&1 + dumpfs /dev/md${mdstart}$part > /tmp/dumpfs.2 + + diff -c /tmp/dumpfs.1 /tmp/dumpfs.2 || cat /tmp/fsck.log + mdconfig -d -u $mdstart +done +rm -f /tmp/fsck.log /tmp/dumpfs.? Added: projects/stress2/misc/trim2.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/stress2/misc/trim2.sh Sun Jan 30 12:12:25 2011 (r218087) @@ -0,0 +1,63 @@ +#!/bin/sh + +# +# Copyright (c) 2011 Peter Holm +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +# Run a test on a 128 MB malloc backed MD with UFS SU fs with option trim. +# Verify that deleted records are gone. + +. ../default.cfg + +mount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart +mdconfig -a -t malloc -o reserve -s 128m -u $mdstart || exit 1 +bsdlabel -w md$mdstart auto +[ $# -eq 0 ] && trim=-t +newfs $trim -U md${mdstart}$part > /dev/null +mount /dev/md${mdstart}$part $mntpoint + +echo "This is a Trim (TRIM) test." >> $mntpoint/file +for i in `jot 20`; do + cat $mntpoint/file $mntpoint/file > $mntpoint/file2 + mv $mntpoint/file2 $mntpoint/file +done +rm $mntpoint/file + +while mount | grep $mntpoint | grep -q /dev/md; do + umount $mntpoint || sleep 1 +done + +grep -a -qm1 Trim /dev/md${mdstart}$part && echo "Test failed" + +fsck -t ufs -y /dev/md${mdstart}$part 2>&1 | tee /tmp/fsck.log | \ + grep -v "IS CLEAN" | egrep -q -m1 "[A-Z][A-Z]" && \ + cat /tmp/fsck.log +mdconfig -d -u $mdstart +rm -f /tmp/fsck.log Added: projects/stress2/misc/trim3.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/stress2/misc/trim3.sh Sun Jan 30 12:12:25 2011 (r218087) @@ -0,0 +1,74 @@ +#!/bin/sh + +# +# Copyright (c) 2011 Peter Holm +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +# Run with marcus.cfg on a 1 GB swap backed MD with option trim. +# A variation of trim.sh + +. ../default.cfg + +mount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart + +size="1g" +[ $# -eq 0 ] && trim=-t +n=0 +for flag in '' '-U' '-U'; do + n=$((n + 1)) + echo "mdconfig -a -t swap -s $size -u $mdstart" + mdconfig -a -t swap -s $size -u $mdstart || exit 1 + bsdlabel -w md$mdstart auto + + echo "newfs $trim $flag md${mdstart}$part" + newfs $trim $flag md${mdstart}$part > /dev/null + [ $n -eq 3 ] && tunefs -? 2>&1 | grep -q "j enable" && \ + tunefs -j enable /dev/md${mdstart}$part + + mount /dev/md${mdstart}$part $mntpoint + chmod 777 $mntpoint + + export runRUNTIME=10m + export RUNDIR=$mntpoint/stressX + + su $testuser -c 'cd ..; ./run.sh marcus.cfg' > /dev/null 2>&1 + + while mount | grep $mntpoint | grep -q /dev/md; do + umount $mntpoint || sleep 1 + done + dumpfs /dev/md${mdstart}$part > /tmp/dumpfs.1 + sleep 1 + fsck -t ufs -y /dev/md${mdstart}$part > /tmp/fsck.log 2>&1 + dumpfs /dev/md${mdstart}$part > /tmp/dumpfs.2 + + diff -c /tmp/dumpfs.1 /tmp/dumpfs.2 || cat /tmp/fsck.log + mdconfig -d -u $mdstart +done +rm -f /tmp/fsck.log /tmp/dumpfs.? Added: projects/stress2/misc/trim4.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/stress2/misc/trim4.sh Sun Jan 30 12:12:25 2011 (r218087) @@ -0,0 +1,79 @@ +#!/bin/sh + +# +# Copyright (c) 2011 Peter Holm +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +# Run with marcus.cfg on a 1 GB swap backed MD with option trim. +# SU+J FS corruption seen with option trim. + +. ../default.cfg + +tunefs -? 2>&1 | grep "j enable" || exit 1 + +mount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart + +size="1g" +[ $# -eq 0 ] && trim=-t +flag="-U" +for i in `jot 6`; do + echo "Test #$i `date '+%T'`" + echo "mdconfig -a -t swap -s $size -u $mdstart" + mdconfig -a -t swap -s $size -u $mdstart || exit 1 + bsdlabel -w md$mdstart auto + + echo "newfs $trim $flag md${mdstart}$part" + newfs $trim $flag md${mdstart}$part > /dev/null + tunefs -j enable /dev/md${mdstart}$part + + mount /dev/md${mdstart}$part $mntpoint + chmod 777 $mntpoint + + export runRUNTIME=5m + export RUNDIR=$mntpoint/stressX + + su $testuser -c 'cd ..; ./run.sh marcus.cfg' > /dev/null 2>&1 + + while mount | grep $mntpoint | grep -q /dev/md; do + umount $mntpoint || sleep 1 + done + dumpfs /dev/md${mdstart}$part > /tmp/dumpfs.1 + sleep 1 + fsck -t ufs -y /dev/md${mdstart}$part > /tmp/fsck.log 2>&1 + dumpfs /dev/md${mdstart}$part > /tmp/dumpfs.2 + + if grep -q "FALLBACK TO FULL FSCK" /tmp/fsck.log; then + diff -c /tmp/dumpfs.1 /tmp/dumpfs.2 + cat /tmp/fsck.log + exit 1 + fi + mdconfig -d -u $mdstart +done +rm -f /tmp/fsck.log /tmp/dumpfs.? From owner-svn-src-projects@FreeBSD.ORG Sun Jan 30 23:14:35 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 2D7831065674; Sun, 30 Jan 2011 23:14:35 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1E2A28FC08; Sun, 30 Jan 2011 23:14:35 +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 p0UNEZP8088834; Sun, 30 Jan 2011 23:14:35 GMT (envelope-from imp@svn.freebsd.org) Received: (from imp@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0UNEZQ2088832; Sun, 30 Jan 2011 23:14:35 GMT (envelope-from imp@svn.freebsd.org) Message-Id: <201101302314.p0UNEZQ2088832@svn.freebsd.org> From: Warner Losh Date: Sun, 30 Jan 2011 23:14:34 +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: r218106 - 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: Sun, 30 Jan 2011 23:14:35 -0000 Author: imp Date: Sun Jan 30 23:14:34 2011 New Revision: 218106 URL: http://svn.freebsd.org/changeset/base/218106 Log: Improve the remap comment, add a question about failing vs degrading a disk on the Nth read error. Modified: projects/graid/head/sys/geom/raid/tr_raid1.c Modified: projects/graid/head/sys/geom/raid/tr_raid1.c ============================================================================== --- projects/graid/head/sys/geom/raid/tr_raid1.c Sun Jan 30 22:57:52 2011 (r218105) +++ projects/graid/head/sys/geom/raid/tr_raid1.c Sun Jan 30 23:14:34 2011 (r218106) @@ -720,6 +720,9 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_ /* * If there are too many read errors, we move to degraded. + * XXX Do we want to FAIL the drive (eg, make the user redo + * everything to get it back in sync), or just degrade the + * drive, which kicks off a resync? */ if (sd->sd_read_errs > SD_READ_THRESHOLD) { g_raid_fail_disk(sd->sd_softc, sd, sd->sd_disk); @@ -779,10 +782,13 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_ } if (bp->bio_cflags & G_RAID_BIO_FLAG_REMAP) { /* - * We're doing a remap write, mark the range as unlocked now - * and fail the disk if the write failed. If the write - * failed, the parent's bio isn't failed since the recovered - * read for that actually succeeded. + * We're done with a remap write, mark the range as unlocked. + * For any write errors, we agressively fail the disk since + * there was both a READ and a WRITE error at this location. Both + * types of errors generally indicates the drive is on the verge of + * total failure anyway. Better to stop trusting it now. However, + * we need to reset error to 0 in that case because we're not failing + * the original I/O which succeeded. */ G_RAID_LOGREQ(2, bp, "REMAP done %d.", bp->bio_error); g_raid_unlock_range(sd->sd_volume, bp->bio_offset, From owner-svn-src-projects@FreeBSD.ORG Mon Jan 31 22:10:02 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 456BE1065674; Mon, 31 Jan 2011 22:10:02 +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 3069A8FC1C; Mon, 31 Jan 2011 22:10:02 +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 p0VMA20U046835; Mon, 31 Jan 2011 22:10:02 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0VMA2BD046834; Mon, 31 Jan 2011 22:10:02 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201101312210.p0VMA2BD046834@svn.freebsd.org> From: Alexander Motin Date: Mon, 31 Jan 2011 22:10:02 +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: r218143 - 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: Mon, 31 Jan 2011 22:10:02 -0000 Author: mav Date: Mon Jan 31 22:10:01 2011 New Revision: 218143 URL: http://svn.freebsd.org/changeset/base/218143 Log: Remove commented genid/syncid bumping code. At this time it is functions of methadata modules. Modified: projects/graid/head/sys/geom/raid/g_raid.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Mon Jan 31 21:03:08 2011 (r218142) +++ projects/graid/head/sys/geom/raid/g_raid.c Mon Jan 31 22:10:01 2011 (r218143) @@ -603,57 +603,6 @@ g_raid_orphan(struct g_consumer *cp) G_RAID_EVENT_DISK); } -#if 0 -static void -g_raid_bump_syncid(struct g_raid_softc *sc) -{ -#if 0 - struct g_raid_disk *disk; - - g_topology_assert_not(); - sx_assert(&sc->sc_lock, SX_XLOCKED); - KASSERT(g_raid_ndisks(sc, G_RAID_SUBDISK_S_ACTIVE) > 0, - ("%s called with no active disks (device=%s).", __func__, - sc->sc_name)); - - sc->sc_syncid++; - G_RAID_DEBUG(1, "Device %s: syncid bumped to %u.", sc->sc_name, - sc->sc_syncid); - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - if (disk->d_state == G_RAID_DISK_S_ACTIVE || - disk->d_state == G_RAID_DISK_S_SYNCHRONIZING) { -// g_raid_update_metadata(disk); - } - } -#endif -} - -static void -g_raid_bump_genid(struct g_raid_softc *sc) -{ -#if 0 - struct g_raid_disk *disk; - - g_topology_assert_not(); - sx_assert(&sc->sc_lock, SX_XLOCKED); - KASSERT(g_raid_ndisks(sc, G_RAID_SUBDISK_S_ACTIVE) > 0, - ("%s called with no active disks (device=%s).", __func__, - sc->sc_name)); - - sc->sc_genid++; - G_RAID_DEBUG(1, "Device %s: genid bumped to %u.", sc->sc_name, - sc->sc_genid); - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - if (disk->d_state == G_RAID_DISK_S_ACTIVE || - disk->d_state == G_RAID_DISK_S_SYNCHRONIZING) { - disk->d_genid = sc->sc_genid; -// g_raid_update_metadata(disk); - } - } -#endif -} -#endif - static int g_raid_idle(struct g_raid_volume *vol, int acw) { From owner-svn-src-projects@FreeBSD.ORG Mon Jan 31 22:14:48 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 AB0D1106564A; Mon, 31 Jan 2011 22:14:48 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 96CB68FC1B; Mon, 31 Jan 2011 22:14:48 +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 p0VMEmVh047033; Mon, 31 Jan 2011 22:14:48 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0VMEmuE047000; Mon, 31 Jan 2011 22:14:48 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201101312214.p0VMEmuE047000@svn.freebsd.org> From: Attilio Rao Date: Mon, 31 Jan 2011 22:14:48 +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: r218144 - in projects/sv: . bin/ps bin/sh contrib/top contrib/tzdata etc etc/mail etc/periodic/daily etc/rc.d gnu/lib/libgcc gnu/lib/libgomp gnu/usr.bin/binutils lib/libc lib/libc/sys l... 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: Mon, 31 Jan 2011 22:14:48 -0000 Author: attilio Date: Mon Jan 31 22:14:47 2011 New Revision: 218144 URL: http://svn.freebsd.org/changeset/base/218144 Log: MFC Added: projects/sv/share/doc/papers/kernmalloc/appendix.ms - copied unchanged from r218142, head/share/doc/papers/kernmalloc/appendix.ms projects/sv/share/doc/papers/sysperf/appendix.ms - copied unchanged from r218142, head/share/doc/papers/sysperf/appendix.ms projects/sv/sys/dev/ath/ath_rate/sample/tx_schedules.h - copied unchanged from r218142, head/sys/dev/ath/ath_rate/sample/tx_schedules.h projects/sv/sys/dev/ath/if_ath_debug.c - copied unchanged from r218142, head/sys/dev/ath/if_ath_debug.c projects/sv/sys/dev/ath/if_ath_debug.h - copied unchanged from r218142, head/sys/dev/ath/if_ath_debug.h projects/sv/sys/dev/ath/if_ath_misc.h - copied unchanged from r218142, head/sys/dev/ath/if_ath_misc.h projects/sv/sys/dev/ath/if_ath_tx.c - copied unchanged from r218142, head/sys/dev/ath/if_ath_tx.c projects/sv/sys/dev/ath/if_ath_tx.h - copied unchanged from r218142, head/sys/dev/ath/if_ath_tx.h projects/sv/sys/modules/khelp/h_ertt/ - copied from r218142, head/sys/modules/khelp/h_ertt/ projects/sv/sys/netinet/khelp/ - copied from r218142, head/sys/netinet/khelp/ projects/sv/tools/regression/bin/sh/builtins/trap7.0 - copied unchanged from r218142, head/tools/regression/bin/sh/builtins/trap7.0 projects/sv/tools/regression/bin/sh/execution/killed2.0 - copied unchanged from r218142, head/tools/regression/bin/sh/execution/killed2.0 Modified: projects/sv/Makefile projects/sv/Makefile.inc1 projects/sv/bin/ps/ps.1 projects/sv/bin/sh/jobs.c projects/sv/bin/sh/var.c projects/sv/contrib/tzdata/australasia projects/sv/contrib/tzdata/northamerica projects/sv/etc/ftpusers projects/sv/etc/group projects/sv/etc/mail/aliases projects/sv/etc/master.passwd projects/sv/etc/periodic/daily/800.scrub-zfs projects/sv/etc/rc.d/rpcbind projects/sv/gnu/lib/libgcc/Makefile projects/sv/gnu/lib/libgomp/Makefile projects/sv/gnu/usr.bin/binutils/Makefile.inc0 projects/sv/lib/libc/Makefile projects/sv/lib/libc/sys/Makefile.inc projects/sv/lib/libc/sys/ptrace.2 projects/sv/lib/libelf/elf_data.c projects/sv/libexec/rtld-elf/amd64/rtld_machdep.h projects/sv/libexec/rtld-elf/arm/rtld_machdep.h projects/sv/libexec/rtld-elf/i386/rtld_machdep.h projects/sv/libexec/rtld-elf/ia64/rtld_machdep.h projects/sv/libexec/rtld-elf/map_object.c projects/sv/libexec/rtld-elf/mips/rtld_machdep.h projects/sv/libexec/rtld-elf/powerpc/rtld_machdep.h projects/sv/libexec/rtld-elf/powerpc64/rtld_machdep.h projects/sv/libexec/rtld-elf/rtld.c projects/sv/libexec/rtld-elf/sparc64/rtld_machdep.h projects/sv/sbin/fdisk/fdisk.c projects/sv/sbin/geom/class/part/gpart.8 projects/sv/sbin/hastctl/hastctl.c projects/sv/sbin/hastd/control.c projects/sv/sbin/hastd/hast.h projects/sv/sbin/hastd/hastd.c projects/sv/sbin/hastd/hastd.h projects/sv/sbin/hastd/pjdlog.c projects/sv/sbin/hastd/pjdlog.h projects/sv/sbin/hastd/primary.c projects/sv/sbin/hastd/proto.c projects/sv/sbin/hastd/proto.h projects/sv/sbin/hastd/proto_common.c projects/sv/sbin/hastd/proto_impl.h projects/sv/sbin/hastd/proto_socketpair.c projects/sv/sbin/hastd/proto_tcp4.c projects/sv/sbin/hastd/proto_uds.c projects/sv/sbin/hastd/secondary.c projects/sv/sbin/hastd/subr.c projects/sv/sbin/hastd/subr.h projects/sv/sbin/ifconfig/ifieee80211.c projects/sv/sbin/iscontrol/config.c projects/sv/sbin/iscontrol/fsm.c projects/sv/sbin/mount/mount.8 projects/sv/share/doc/papers/kernmalloc/Makefile projects/sv/share/doc/papers/sysperf/Makefile projects/sv/share/examples/etc/make.conf projects/sv/share/man/man4/altq.4 projects/sv/share/man/man4/ixgb.4 projects/sv/share/man/man4/nfe.4 projects/sv/share/man/man4/re.4 projects/sv/share/man/man7/build.7 projects/sv/share/man/man9/Makefile projects/sv/share/man/man9/sbuf.9 projects/sv/share/syscons/keymaps/Makefile projects/sv/sys/amd64/amd64/machdep.c projects/sv/sys/amd64/amd64/vm_machdep.c projects/sv/sys/amd64/linux32/linux.h projects/sv/sys/amd64/linux32/linux32_machdep.c projects/sv/sys/amd64/linux32/linux32_proto.h projects/sv/sys/amd64/linux32/syscalls.master projects/sv/sys/arm/include/fdt.h projects/sv/sys/arm/s3c2xx0/std.ln2410sbc projects/sv/sys/cam/ata/ata_xpt.c projects/sv/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c projects/sv/sys/cddl/compat/opensolaris/sys/atomic.h projects/sv/sys/compat/linprocfs/linprocfs.c projects/sv/sys/compat/linux/linux_futex.c projects/sv/sys/compat/linux/linux_futex.h projects/sv/sys/compat/linux/linux_misc.c projects/sv/sys/compat/linux/linux_misc.h projects/sv/sys/conf/files projects/sv/sys/dev/ahci/ahci.c projects/sv/sys/dev/alc/if_alc.c projects/sv/sys/dev/ata/ata-pci.h projects/sv/sys/dev/ata/chipsets/ata-intel.c projects/sv/sys/dev/ath/ath_hal/ah.c projects/sv/sys/dev/ath/ath_hal/ah.h projects/sv/sys/dev/ath/ath_hal/ah_debug.h projects/sv/sys/dev/ath/ath_hal/ah_eeprom_v4k.c projects/sv/sys/dev/ath/ath_hal/ah_eeprom_v4k.h projects/sv/sys/dev/ath/ath_hal/ar5212/ar5212.h projects/sv/sys/dev/ath/ath_hal/ar5416/ar2133.c projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416.h projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416phy.h projects/sv/sys/dev/ath/ath_hal/ar5416/ar5416reg.h projects/sv/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c projects/sv/sys/dev/ath/ath_hal/ar9002/ar9280.h projects/sv/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c projects/sv/sys/dev/ath/ath_hal/ar9002/ar9285.h projects/sv/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c projects/sv/sys/dev/ath/ath_hal/ar9002/ar9285v2.ini projects/sv/sys/dev/ath/ath_rate/sample/sample.c projects/sv/sys/dev/ath/if_ath.c projects/sv/sys/dev/ath/if_athvar.h projects/sv/sys/dev/cs/if_cs.c projects/sv/sys/dev/cs/if_csreg.h projects/sv/sys/dev/cs/if_csvar.h projects/sv/sys/dev/cxgb/cxgb_sge.c projects/sv/sys/dev/fdt/fdt_common.c projects/sv/sys/dev/fdt/fdt_pci.c projects/sv/sys/dev/fdt/fdtbus.c projects/sv/sys/dev/flash/mx25l.c projects/sv/sys/dev/ichsmb/ichsmb_pci.c projects/sv/sys/dev/ichwd/ichwd.c projects/sv/sys/dev/ichwd/ichwd.h projects/sv/sys/dev/md/md.c projects/sv/sys/dev/mii/miidevs projects/sv/sys/dev/mii/rlphy.c projects/sv/sys/dev/nfe/if_nfe.c projects/sv/sys/dev/re/if_re.c projects/sv/sys/dev/siis/siis.c projects/sv/sys/dev/siis/siis.h projects/sv/sys/dev/tsec/if_tsec_fdt.c projects/sv/sys/dev/uart/uart_tty.c projects/sv/sys/dev/usb/usb_freebsd.h projects/sv/sys/dev/xen/netfront/netfront.c projects/sv/sys/fs/nfs/nfsport.h projects/sv/sys/fs/procfs/procfs_dbregs.c projects/sv/sys/fs/procfs/procfs_fpregs.c projects/sv/sys/fs/procfs/procfs_map.c projects/sv/sys/fs/procfs/procfs_regs.c projects/sv/sys/geom/geom_disk.c projects/sv/sys/geom/journal/g_journal.c projects/sv/sys/geom/part/g_part.c projects/sv/sys/geom/part/g_part.h projects/sv/sys/geom/part/g_part_bsd.c projects/sv/sys/geom/part/g_part_ebr.c projects/sv/sys/geom/part/g_part_gpt.c projects/sv/sys/geom/part/g_part_mbr.c projects/sv/sys/i386/i386/machdep.c projects/sv/sys/i386/linux/linux_machdep.c projects/sv/sys/i386/linux/linux_proto.h projects/sv/sys/i386/linux/syscalls.master projects/sv/sys/kern/kern_descrip.c projects/sv/sys/kern/kern_fork.c projects/sv/sys/kern/kern_jail.c projects/sv/sys/kern/kern_malloc.c projects/sv/sys/kern/kern_proc.c projects/sv/sys/kern/kern_sig.c projects/sv/sys/kern/kern_sysctl.c projects/sv/sys/kern/subr_lock.c projects/sv/sys/kern/subr_sleepqueue.c projects/sv/sys/kern/subr_trap.c projects/sv/sys/kern/subr_witness.c projects/sv/sys/kern/sys_process.c projects/sv/sys/kern/uipc_syscalls.c projects/sv/sys/kern/vfs_mount.c projects/sv/sys/kern/vfs_subr.c projects/sv/sys/mips/include/sf_buf.h projects/sv/sys/mips/mips/uio_machdep.c projects/sv/sys/mips/mips/vm_machdep.c projects/sv/sys/modules/ath/Makefile projects/sv/sys/modules/khelp/Makefile projects/sv/sys/net/if.c projects/sv/sys/net80211/ieee80211_ioctl.c projects/sv/sys/net80211/ieee80211_scan.c projects/sv/sys/netinet/if_ether.c projects/sv/sys/netinet/in_pcb.c projects/sv/sys/netinet/sctp.h projects/sv/sys/netinet/sctp_cc_functions.c projects/sv/sys/netinet/sctp_constants.h projects/sv/sys/netinet/sctp_header.h projects/sv/sys/netinet/sctp_indata.c projects/sv/sys/netinet/sctp_indata.h projects/sv/sys/netinet/sctp_input.c projects/sv/sys/netinet/sctp_output.c projects/sv/sys/netinet/sctp_output.h projects/sv/sys/netinet/sctp_pcb.c projects/sv/sys/netinet/sctp_pcb.h projects/sv/sys/netinet/sctp_structs.h projects/sv/sys/netinet/sctp_sysctl.c projects/sv/sys/netinet/sctp_sysctl.h projects/sv/sys/netinet/sctp_timer.c projects/sv/sys/netinet/sctp_uio.h projects/sv/sys/netinet/sctp_usrreq.c projects/sv/sys/netinet/sctputil.c projects/sv/sys/netinet/tcp_usrreq.c projects/sv/sys/pci/if_rlreg.h projects/sv/sys/powerpc/aim/trap.c projects/sv/sys/powerpc/include/fdt.h projects/sv/sys/powerpc/include/intr_machdep.h projects/sv/sys/powerpc/include/openpicvar.h projects/sv/sys/powerpc/mambo/mambo_openpic.c projects/sv/sys/powerpc/mpc85xx/atpic.c projects/sv/sys/powerpc/mpc85xx/isa.c projects/sv/sys/powerpc/mpc85xx/nexus.c projects/sv/sys/powerpc/mpc85xx/openpic_fdt.c projects/sv/sys/powerpc/mpc85xx/pci_fdt.c projects/sv/sys/powerpc/powermac/cpcht.c projects/sv/sys/powerpc/powermac/hrowpic.c projects/sv/sys/powerpc/powermac/openpic_macio.c projects/sv/sys/powerpc/powerpc/exec_machdep.c projects/sv/sys/powerpc/powerpc/intr_machdep.c projects/sv/sys/powerpc/powerpc/openpic.c projects/sv/sys/powerpc/powerpc/pic_if.m projects/sv/sys/powerpc/ps3/ps3pic.c projects/sv/sys/powerpc/psim/openpic_iobus.c projects/sv/sys/sys/diskmbr.h projects/sv/sys/sys/gpt.h projects/sv/sys/sys/proc.h projects/sv/sys/sys/ptrace.h projects/sv/sys/sys/sysctl.h projects/sv/sys/sys/sysent.h projects/sv/sys/vm/uma_core.c projects/sv/sys/vm/vm_map.c projects/sv/sys/vm/vm_page.c projects/sv/sys/vm/vm_phys.c projects/sv/sys/vm/vm_reserv.c projects/sv/tools/tools/ath/ath_ee_v4k_print/v4k.c projects/sv/tools/tools/ath/athpow/athpow.c projects/sv/usr.bin/csup/updater.c projects/sv/usr.bin/getopt/getopt.1 projects/sv/usr.bin/ktrdump/ktrdump.8 projects/sv/usr.bin/ktrdump/ktrdump.c projects/sv/usr.bin/man/man.sh projects/sv/usr.sbin/Makefile.mips projects/sv/usr.sbin/newsyslog/newsyslog.8 projects/sv/usr.sbin/newsyslog/newsyslog.c projects/sv/usr.sbin/newsyslog/newsyslog.conf.5 projects/sv/usr.sbin/newsyslog/pathnames.h Directory Properties: projects/sv/ (props changed) projects/sv/cddl/contrib/opensolaris/ (props changed) projects/sv/contrib/bind9/ (props changed) projects/sv/contrib/binutils/ (props changed) projects/sv/contrib/bzip2/ (props changed) projects/sv/contrib/dialog/ (props changed) projects/sv/contrib/ee/ (props changed) projects/sv/contrib/expat/ (props changed) projects/sv/contrib/file/ (props changed) projects/sv/contrib/gdb/ (props changed) projects/sv/contrib/gdtoa/ (props changed) projects/sv/contrib/gnu-sort/ (props changed) projects/sv/contrib/groff/ (props changed) projects/sv/contrib/less/ (props changed) projects/sv/contrib/libpcap/ (props changed) projects/sv/contrib/llvm/ (props changed) projects/sv/contrib/llvm/tools/clang/ (props changed) projects/sv/contrib/ncurses/ (props changed) projects/sv/contrib/netcat/ (props changed) projects/sv/contrib/ntp/ (props changed) projects/sv/contrib/one-true-awk/ (props changed) projects/sv/contrib/openbsm/ (props changed) projects/sv/contrib/openpam/ (props changed) projects/sv/contrib/pf/ (props changed) projects/sv/contrib/sendmail/ (props changed) projects/sv/contrib/tcpdump/ (props changed) projects/sv/contrib/tcsh/ (props changed) projects/sv/contrib/top/ (props changed) projects/sv/contrib/top/install-sh (props changed) projects/sv/contrib/tzcode/stdtime/ (props changed) projects/sv/contrib/tzcode/zic/ (props changed) projects/sv/contrib/tzdata/ (props changed) projects/sv/contrib/wpa/ (props changed) projects/sv/contrib/xz/ (props changed) projects/sv/crypto/openssh/ (props changed) projects/sv/crypto/openssl/ (props changed) projects/sv/lib/libc/ (props changed) projects/sv/lib/libc/stdtime/ (props changed) projects/sv/lib/libutil/ (props changed) projects/sv/lib/libz/ (props changed) projects/sv/sbin/ (props changed) projects/sv/sbin/ipfw/ (props changed) projects/sv/share/mk/bsd.arch.inc.mk (props changed) projects/sv/share/zoneinfo/ (props changed) projects/sv/sys/ (props changed) projects/sv/sys/amd64/include/xen/ (props changed) projects/sv/sys/cddl/contrib/opensolaris/ (props changed) projects/sv/sys/contrib/dev/acpica/ (props changed) projects/sv/sys/contrib/octeon-sdk/ (props changed) projects/sv/sys/contrib/pf/ (props changed) projects/sv/sys/contrib/x86emu/ (props changed) projects/sv/usr.bin/calendar/ (props changed) projects/sv/usr.bin/csup/ (props changed) projects/sv/usr.bin/procstat/ (props changed) projects/sv/usr.sbin/zic/ (props changed) Modified: projects/sv/Makefile ============================================================================== --- projects/sv/Makefile Mon Jan 31 22:10:01 2011 (r218143) +++ projects/sv/Makefile Mon Jan 31 22:14:47 2011 (r218144) @@ -28,7 +28,8 @@ # delete-old-dirs - Delete obsolete directories. # delete-old-files - Delete obsolete files. # delete-old-libs - Delete obsolete libraries. -# targets - Print a list of supported TARGET/TARGET_ARCH pairs. +# targets - Print a list of supported TARGET/TARGET_ARCH pairs +# for world and kernel targets. # # This makefile is simple by design. The FreeBSD make automatically reads # the /usr/share/mk/sys.mk unless the -m argument is specified on the @@ -125,6 +126,38 @@ BINMAKE= \ -m ${.CURDIR}/share/mk _MAKE= PATH=${PATH} ${BINMAKE} -f Makefile.inc1 +# Guess machine architecture from machine type, and vice versa. +.if !defined(TARGET_ARCH) && defined(TARGET) +_TARGET_ARCH= ${TARGET:S/pc98/i386/:S/sun4v/sparc64/:S/mips/mipsel/} +.elif !defined(TARGET) && defined(TARGET_ARCH) && \ + ${TARGET_ARCH} != ${MACHINE_ARCH} +_TARGET= ${TARGET_ARCH:C/mips.*e[lb]/mips/:C/armeb/arm/} +.endif +# Legacy names, for a transition period mips:mips -> mipsel:mips +.if defined(TARGET) && defined(TARGET_ARCH) && \ + ${TARGET_ARCH} == "mips" && ${TARGET} == "mips" +.warning "TARGET_ARCH of mips is deprecated in favor of mipsel or mipseb" +.if defined(TARGET_BIG_ENDIAN) +_TARGET_ARCH=mipseb +.else +_TARGET_ARCH=mipsel +.endif +.endif +# arm with TARGET_BIG_ENDIAN -> armeb +.if defined(TARGET_ARCH) && ${TARGET_ARCH} == "arm" && defined(TARGET_BIG_ENDIAN) +.warning "TARGET_ARCH of arm with TARGET_BIG_ENDIAN is deprecated. use armeb" +_TARGET_ARCH=armeb +.endif +.if defined(TARGET) && !defined(_TARGET) +_TARGET=${TARGET} +.endif +.if defined(TARGET_ARCH) && !defined(_TARGET_ARCH) +_TARGET_ARCH=${TARGET_ARCH} +.endif +# Otherwise, default to current machine type and architecture. +_TARGET?= ${MACHINE} +_TARGET_ARCH?= ${MACHINE_ARCH} + # # Make sure we have an up-to-date make(1). Only world and buildworld # should do this as those are the initial targets used for upgrades. @@ -172,8 +205,7 @@ cleanworld: # ${TGTS}: - ${_+_}@cd ${.CURDIR}; \ - ${_MAKE} ${.TARGET} + ${_+_}cd ${.CURDIR}; ${_MAKE} TARGET=${_TARGET} TARGET_ARCH=${_TARGET_ARCH} ${.TARGET} # Set a reasonable default .MAIN: all @@ -297,7 +329,7 @@ TARGET_ARCHES_${target}?= ${target} .endfor targets: - @echo "Supported TARGETS/TARGET_ARCH pairs" + @echo "Supported TARGET/TARGET_ARCH pairs for world and kernel targets" .for target in ${TARGETS} .for target_arch in ${TARGET_ARCHES_${target}} @echo " ${target}/${target_arch}" Modified: projects/sv/Makefile.inc1 ============================================================================== --- projects/sv/Makefile.inc1 Mon Jan 31 22:10:01 2011 (r218143) +++ projects/sv/Makefile.inc1 Mon Jan 31 22:14:47 2011 (r218144) @@ -116,32 +116,6 @@ VERSION!= uname -srp VERSION+= ${OSRELDATE} .endif -# Guess machine architecture from machine type, and vice versa. -.if !defined(TARGET_ARCH) && defined(TARGET) -TARGET_ARCH= ${TARGET:S/pc98/i386/:S/sun4v/sparc64/:S/mips/mipsel/} -.elif !defined(TARGET) && defined(TARGET_ARCH) && \ - ${TARGET_ARCH} != ${MACHINE_ARCH} -TARGET= ${TARGET_ARCH:C/mips.*e[lb]/mips/:C/armeb/arm/} -.endif -# Legacy names, for a transition period mips:mips -> mipsel:mips -.if defined(TARGET) && defined(TARGET_ARCH) && \ - ${TARGET_ARCH} == "mips" && ${TARGET} == "mips" -.warning "TARGET_ARCH of mips is deprecated in favor of mipsel or mipseb" -.if defined(TARGET_BIG_ENDIAN) -TARGET_ARCH=mipseb -.else -TARGET_ARCH=mipsel -.endif -.endif -# arm with TARGET_BIG_ENDIAN -> armeb -.if defined(TARGET_ARCH) && ${TARGET_ARCH} == "arm" && defined(TARGET_BIG_ENDIAN) -.warning "TARGET_ARCH of arm with TARGET_BIG_ENDIAN is deprecated. use armeb" -TARGET_ARCH=armeb -.endif -# Otherwise, default to current machine type and architecture. -TARGET?= ${MACHINE} -TARGET_ARCH?= ${MACHINE_ARCH} - KNOWN_ARCHES?= amd64 arm armeb/arm i386 i386/pc98 ia64 mipsel/mips mipseb/mips mips64el/mips mips64eb/mips mipsn32el/mips mipsn32eb/mips powerpc powerpc64/powerpc sparc64 sparc64/sun4v .if ${TARGET} == ${TARGET_ARCH} _t= ${TARGET} Modified: projects/sv/bin/ps/ps.1 ============================================================================== --- projects/sv/bin/ps/ps.1 Mon Jan 31 22:10:01 2011 (r218143) +++ projects/sv/bin/ps/ps.1 Mon Jan 31 22:14:47 2011 (r218144) @@ -288,6 +288,7 @@ the include file .It Dv "P_ADVLOCK" Ta No "0x00001 Process may hold a POSIX advisory lock" .It Dv "P_CONTROLT" Ta No "0x00002 Has a controlling terminal" .It Dv "P_KTHREAD" Ta No "0x00004 Kernel thread" +.It Dv "P_FOLLOWFORK" Ta No "0x00008 Attach debugger to new children" .It Dv "P_PPWAIT" Ta No "0x00010 Parent is waiting for child to exec/exit" .It Dv "P_PROFIL" Ta No "0x00020 Has started profiling" .It Dv "P_STOPPROF" Ta No "0x00040 Has thread in requesting to stop prof" Modified: projects/sv/bin/sh/jobs.c ============================================================================== --- projects/sv/bin/sh/jobs.c Mon Jan 31 22:10:01 2011 (r218143) +++ projects/sv/bin/sh/jobs.c Mon Jan 31 22:14:47 2011 (r218144) @@ -1056,13 +1056,13 @@ dowait(int block, struct job *job) } if (sig > 0 && sig != SIGINT && sig != SIGPIPE) { if (sig < sys_nsig && sys_siglist[sig]) - out1str(sys_siglist[sig]); + out2str(sys_siglist[sig]); else - out1fmt("Signal %d", sig); + outfmt(out2, "Signal %d", sig); if (coredump) - out1str(" (core dumped)"); - out1c('\n'); - flushout(out1); + out2str(" (core dumped)"); + out2c('\n'); + flushout(out2); } } else { TRACE(("Not printing status, rootshell=%d, job=%p\n", rootshell, job)); Modified: projects/sv/bin/sh/var.c ============================================================================== --- projects/sv/bin/sh/var.c Mon Jan 31 22:10:01 2011 (r218143) +++ projects/sv/bin/sh/var.c Mon Jan 31 22:14:47 2011 (r218144) @@ -600,9 +600,8 @@ var_compare(const void *a, const void *b /* - * Command to list all variables which are set. Currently this command - * is invoked from the set command when the set command is called without - * any variables. + * Command to list all variables which are set. This is invoked from the + * set command when it is called without any options or operands. */ int @@ -840,9 +839,7 @@ setvarcmd(int argc, char **argv) /* - * The unset builtin command. We unset the function before we unset the - * variable to allow a function to be unset when there is a readonly variable - * with the same name. + * The unset builtin command. */ int Modified: projects/sv/contrib/tzdata/australasia ============================================================================== --- projects/sv/contrib/tzdata/australasia Mon Jan 31 22:10:01 2011 (r218143) +++ projects/sv/contrib/tzdata/australasia Mon Jan 31 22:14:47 2011 (r218144) @@ -1,5 +1,5 @@ #
-# @(#)australasia	8.20
+# @(#)australasia	8.22
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -84,14 +84,13 @@ Rule	AS	1986	only	-	Oct	19	2:00s	1:00	-
 Rule	AS	1987	2007	-	Oct	lastSun	2:00s	1:00	-
 Rule	AS	1972	only	-	Feb	27	2:00s	0	-
 Rule	AS	1973	1985	-	Mar	Sun>=1	2:00s	0	-
-Rule	AS	1986	1989	-	Mar	Sun>=15	2:00s	0	-
-Rule	AS	1990	only	-	Mar	Sun>=18	2:00s	0	-
-Rule	AS	1991	only	-	Mar	Sun>=1	2:00s	0	-
-Rule	AS	1992	only	-	Mar	Sun>=18	2:00s	0	-
-Rule	AS	1993	only	-	Mar	Sun>=1	2:00s	0	-
-Rule	AS	1994	only	-	Mar	Sun>=18	2:00s	0	-
+Rule	AS	1986	1990	-	Mar	Sun>=15	2:00s	0	-
+Rule	AS	1991	only	-	Mar	3	2:00s	0	-
+Rule	AS	1992	only	-	Mar	22	2:00s	0	-
+Rule	AS	1993	only	-	Mar	7	2:00s	0	-
+Rule	AS	1994	only	-	Mar	20	2:00s	0	-
 Rule	AS	1995	2005	-	Mar	lastSun	2:00s	0	-
-Rule	AS	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AS	2006	only	-	Apr	2	2:00s	0	-
 Rule	AS	2007	only	-	Mar	lastSun	2:00s	0	-
 Rule	AS	2008	max	-	Apr	Sun>=1	2:00s	0	-
 Rule	AS	2008	max	-	Oct	Sun>=1	2:00s	1:00	-

Modified: projects/sv/contrib/tzdata/northamerica
==============================================================================
--- projects/sv/contrib/tzdata/northamerica	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/contrib/tzdata/northamerica	Mon Jan 31 22:14:47 2011	(r218144)
@@ -1,5 +1,5 @@
 # 
-# @(#)northamerica	8.34
+# %W%
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -471,20 +471,50 @@ Zone America/Adak	 12:13:21 -	LMT	1867 O
 #  three votes for and one against."
 
 # Hawaii
-#
-# From Arthur David Olson:
-# And then there's Hawaii.
-# DST was observed for one day in 1933;
-# standard time was changed by half an hour in 1947;
-# it's always standard as of 1986.
-#
-# From Paul Eggert:
-# Shanks says the 1933 experiment lasted for three weeks.  Go with Shanks.
-#
-Zone Pacific/Honolulu	-10:31:26 -	LMT	1900 Jan  1 12:00
-			-10:30	-	HST	1933 Apr 30 2:00
-			-10:30	1:00	HDT	1933 May 21 2:00
-			-10:30	US	H%sT	1947 Jun  8 2:00
+
+# From Arthur David Olson (2010-12-09):
+# "Hawaiian Time" by Robert C. Schmitt and Doak C. Cox appears on pages 207-225
+# of volume 26 of The Hawaiian Journal of History (1992). As of 2010-12-09,
+# the article is available at
+# 
+# http://evols.library.manoa.hawaii.edu/bitstream/10524/239/2/JL26215.pdf
+# 
+# and indicates that standard time was adopted effective noon, January
+# 13, 1896 (page 218), that in "1933, the Legislature decreed daylight
+# saving for the period between the last Sunday of each April and the
+# last Sunday of each September, but less than a month later repealed the
+# act," (page 220), that year-round daylight saving time was in effect
+# from 1942-02-09 to 1945-09-30 (page 221, with no time of day given for
+# when clocks changed) and that clocks were changed by 30 minutes
+# effective the second Sunday of June, 1947 (page 219, with no time of
+# day given for when clocks changed). A footnote for the 1933 changes
+# cites Session Laws of Hawaii 1933, "Act. 90 (approved 26 Apr. 1933)
+# and Act 163 (approved 21 May 1933)."
+
+# From Arthur David Olson (2011-01-19):
+# The following is from "Laws of the Territory of Hawaii Passed by the
+# Seventeenth Legislature: Regular Session 1933," available (as of
+# 2011-01-19) at American University's Pence Law Library. Page 85: "Act
+# 90...At 2 o'clock ante meridian of the last Sunday in April of each
+# year, the standard time of this Territory shall be advanced one
+# hour...This Act shall take effect upon its approval. Approved this 26th
+# day of April, A. D. 1933. LAWRENCE M JUDD, Governor of the Territory of
+# Hawaii." Page 172:  "Act 163...Act 90 of the Session Laws of 1933 is
+# hereby repealed...This Act shall take effect upon its approval, upon
+# which date the standard time of this Territory shall be restored to
+# that existing immediately prior to the taking effect of said Act 90.
+# Approved this 21st day of May, A. D. 1933. LAWRENCE M. JUDD, Governor
+# of the Territory of Hawaii."
+#
+# Note that 1933-05-21 was a Sunday.
+# We're left to guess the time of day when Act 163 was approved; guess noon.
+
+Zone Pacific/Honolulu	-10:31:26 -	LMT	1896 Jan 13 12:00 #Schmitt&Cox
+			-10:30	-	HST	1933 Apr 30 2:00 #Laws 1933
+			-10:30	1:00	HDT	1933 May 21 12:00 #Laws 1933+12
+			-10:30	-	HST	1942 Feb 09 2:00 #Schmitt&Cox+2
+			-10:30	1:00	HDT	1945 Sep 30 2:00 #Schmitt&Fox+2
+			-10:30	US	H%sT	1947 Jun  8 2:00 #Schmitt&Fox+2
 			-10:00	-	HST
 
 # Now we turn to US areas that have diverged from the consensus since 1970.

Modified: projects/sv/etc/ftpusers
==============================================================================
--- projects/sv/etc/ftpusers	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/etc/ftpusers	Mon Jan 31 22:14:47 2011	(r218144)
@@ -20,6 +20,7 @@ _dhcp
 uucp
 pop
 www
+hast
 nobody
 mailnull
 smmsp

Modified: projects/sv/etc/group
==============================================================================
--- projects/sv/etc/group	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/etc/group	Mon Jan 31 22:14:47 2011	(r218144)
@@ -27,5 +27,6 @@ dialer:*:68:
 network:*:69:
 audit:*:77:
 www:*:80:
+hast:*:845:
 nogroup:*:65533:
 nobody:*:65534:

Modified: projects/sv/etc/mail/aliases
==============================================================================
--- projects/sv/etc/mail/aliases	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/etc/mail/aliases	Mon Jan 31 22:14:47 2011	(r218144)
@@ -30,6 +30,7 @@ bin:	root
 bind:	root
 daemon:	root
 games:	root
+hast:	root
 kmem:	root
 mailnull: postmaster
 man:	root

Modified: projects/sv/etc/master.passwd
==============================================================================
--- projects/sv/etc/master.passwd	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/etc/master.passwd	Mon Jan 31 22:14:47 2011	(r218144)
@@ -20,4 +20,5 @@ _dhcp:*:65:65::0:0:dhcp programs:/var/em
 uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/local/libexec/uucp/uucico
 pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
 www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
+hast:*:845:845::0:0:HAST unprivileged user:/var/empty:/usr/sbin/nologin
 nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin

Modified: projects/sv/etc/periodic/daily/800.scrub-zfs
==============================================================================
--- projects/sv/etc/periodic/daily/800.scrub-zfs	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/etc/periodic/daily/800.scrub-zfs	Mon Jan 31 22:14:47 2011	(r218144)
@@ -5,6 +5,10 @@
 
 # If there is a global system configuration file, suck it in.
 #
+
+newline="
+" # A single newline
+
 if [ -r /etc/defaults/periodic.conf ]
 then
     . /etc/defaults/periodic.conf
@@ -24,17 +28,19 @@ case "$daily_scrub_zfs_enable" in
 
 	for pool in ${daily_scrub_zfs_pools}; do
 		# sanity check
-		_status=$(zpool list ${pool} | sed -n -e '$p')
+		_status=$(zpool list "${pool}" 2> /dev/null)
 		if [ $? -ne 0 ]; then
 			echo "   WARNING: pool '${pool}' specified in"
 			echo "            '/etc/periodic.conf:daily_scrub_zfs_pools'"
 			echo "            does not exist"
 			continue
 		fi
-		if echo ${_status} | grep -q FAULTED; then
+		_status=${_status##*$newline}
+		case ${_status} in
+		*FAULTED*)
 			echo "Skipping faulted pool: ${pool}"
-			continue
-		fi
+			continue ;;
+		esac
 
 		# successful only if there is at least one pool to scrub
 		rc=0

Modified: projects/sv/etc/rc.d/rpcbind
==============================================================================
--- projects/sv/etc/rc.d/rpcbind	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/etc/rc.d/rpcbind	Mon Jan 31 22:14:47 2011	(r218144)
@@ -13,5 +13,7 @@ name="rpcbind"
 rcvar=`set_rcvar`
 command="/usr/sbin/${name}"
 
+stop_postcmd='/bin/rm -f /var/run/rpcbind.*'
+
 load_rc_config $name
 run_rc_command "$1"

Modified: projects/sv/gnu/lib/libgcc/Makefile
==============================================================================
--- projects/sv/gnu/lib/libgcc/Makefile	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/gnu/lib/libgcc/Makefile	Mon Jan 31 22:14:47 2011	(r218144)
@@ -121,8 +121,9 @@ LIB2FUNCS_EXTRA = floatunsidf.c floatuns
 
 .if ${TARGET_CPUARCH} == mips
 LIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c
-# XXX do we need n32 here?
-.if ${TARGET_ARCH:Mmips64*} != ""
+# ABIs other than o32 need this
+.if ${TARGET_ARCH:Mmips64*} != "" || \
+    ${TARGET_ARCH:Mmipsn32*} != ""
 LIB2FUNCS_EXTRA+= floatdidf.c fixunsdfsi.c
 LIB2FUNCS_EXTRA+= floatdisf.c floatundidf.c
 LIB2FUNCS_EXTRA+= fixsfdi.c floatundisf.c

Modified: projects/sv/gnu/lib/libgomp/Makefile
==============================================================================
--- projects/sv/gnu/lib/libgomp/Makefile	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/gnu/lib/libgomp/Makefile	Mon Jan 31 22:14:47 2011	(r218144)
@@ -25,7 +25,7 @@ VERSION_MAP=	${SRCDIR}/libgomp.map
 # Target-specific OpenMP configuration
 .if ${MACHINE_CPUARCH} == arm || ${MACHINE_CPUARCH} == i386 || \
     ${MACHINE_ARCH} == powerpc || \
-    ${MACHINE_ARCH} == mipsel || ${MACHINE_ARCH} == mipseb
+    (${MACHINE_CPUARCH} == mips &&  ${MACHINE_ARCH:Mmips64*} == "")
 OMP_LOCK_ALIGN	=	4
 OMP_LOCK_KIND=		4
 OMP_LOCK_SIZE=		4

Modified: projects/sv/gnu/usr.bin/binutils/Makefile.inc0
==============================================================================
--- projects/sv/gnu/usr.bin/binutils/Makefile.inc0	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/gnu/usr.bin/binutils/Makefile.inc0	Mon Jan 31 22:14:47 2011	(r218144)
@@ -28,7 +28,7 @@ SRCDIR=	${.CURDIR}/${RELSRC}
 
 .if ${TARGET_CPUARCH} == "arm" || ${TARGET_CPUARCH} == "i386" || \
 	${TARGET_ARCH} == "powerpc" || \
-	${TARGET_ARCH} == "mipsel" || ${TARGET_ARCH} == "mipseb"
+	(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips64*} == "")
 CFLAGS+= -DBFD_DEFAULT_TARGET_SIZE=32
 .else
 CFLAGS+= -DBFD_DEFAULT_TARGET_SIZE=64

Modified: projects/sv/lib/libc/Makefile
==============================================================================
--- projects/sv/lib/libc/Makefile	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/lib/libc/Makefile	Mon Jan 31 22:14:47 2011	(r218144)
@@ -68,6 +68,7 @@ NOASM=
     ${LIBC_ARCH} != "ia64" && \
     ${LIBC_ARCH} != "powerpc64" && \
     ${LIBC_ARCH} != "sparc64" && \
+    ${MACHINE_ARCH:Mmipsn32*} == "" && \
     ${MACHINE_ARCH:Mmips64*} == ""
 .include "${.CURDIR}/quad/Makefile.inc"
 .endif

Modified: projects/sv/lib/libc/sys/Makefile.inc
==============================================================================
--- projects/sv/lib/libc/sys/Makefile.inc	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/lib/libc/sys/Makefile.inc	Mon Jan 31 22:14:47 2011	(r218144)
@@ -53,16 +53,23 @@ SYM_MAPS+=	${.CURDIR}/sys/Symbol.map
 # Generated files
 CLEANFILES+=	${SASM} ${SPSEUDO}
 
+.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" || \
+    ${MACHINE_CPUARCH} == "powerpc"
+NOTE_GNU_STACK='\t.section .note.GNU-stack,"",%%progbits\n'
+.else
+NOTE_GNU_STACK=''
+.endif
+
 ${SASM}:
 	printf '#include "compat.h"\n' > ${.TARGET}
 	printf '#include "SYS.h"\nRSYSCALL(${.PREFIX})\n' >> ${.TARGET}
-	printf '\t.section .note.GNU-stack,"",%%progbits\n' >>${.TARGET}
+	printf  ${NOTE_GNU_STACK} >>${.TARGET}
 
 ${SPSEUDO}:
 	printf '#include "compat.h"\n' > ${.TARGET}
 	printf '#include "SYS.h"\nPSEUDO(${.PREFIX:S/_//})\n' \
 	    >> ${.TARGET}
-	printf '\t.section .note.GNU-stack,"",%%progbits\n' >>${.TARGET}
+	printf ${NOTE_GNU_STACK} >>${.TARGET}
 
 MAN+=	abort2.2 accept.2 access.2 acct.2 adjtime.2 \
 	aio_cancel.2 aio_error.2 aio_read.2 aio_return.2 \

Modified: projects/sv/lib/libc/sys/ptrace.2
==============================================================================
--- projects/sv/lib/libc/sys/ptrace.2	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/lib/libc/sys/ptrace.2	Mon Jan 31 22:14:47 2011	(r218144)
@@ -2,7 +2,7 @@
 .\"	$NetBSD: ptrace.2,v 1.2 1995/02/27 12:35:37 cgd Exp $
 .\"
 .\" This file is in the public domain.
-.Dd July 10, 2010
+.Dd January 23, 2011
 .Dt PTRACE 2
 .Os
 .Sh NAME
@@ -295,6 +295,8 @@ struct ptrace_lwpinfo {
 	sigset_t pl_sigmask;
 	sigset_t pl_siglist;
 	siginfo_t pl_siginfo;
+	char	pl_tdname[MAXCOMLEN + 1];
+	int	pl_child_pid;
 };
 .Ed
 .Pp
@@ -345,6 +347,14 @@ Indicates that
 member of
 .Vt "struct ptrace_lwpinfo"
 contains valid information.
+.It PL_FLAG_FORKED
+Indicates that the process is returning from a call to
+.Fn fork 2
+that created a new child process.
+The process identifier of the new process is available in the
+.Va pl_child_pid
+member of
+.Vt "struct ptrace_lwpinfo" .
 .El
 .It pl_sigmask
 The current signal mask of the LWP
@@ -356,11 +366,20 @@ on an LWP siglist until the thread is se
 The siginfo that accompanies the signal pending.
 Only valid for
 .Dv PL_EVENT_SIGNAL
-kind of stop, when
-.Va pl_flags
-has
+stop when
 .Dv PL_FLAG_SI
-set.
+is set in
+.Va pl_flags .
+.It pl_tdname
+The name of the thread.
+.It pl_child_pid
+The process identifier of the new child process.
+Only valid for a
+.Dv PL_EVENT_SIGNAL
+stop when
+.Dv PL_FLAG_FORKED
+is set in
+.Va pl_flags .
 .El
 .It PT_GETNUMLWPS
 This request returns the number of kernel threads associated with the
@@ -391,6 +410,21 @@ This request will trace the specified pr
 .It PT_SYSCALL
 This request will trace the specified process
 on each system call entry and exit.
+.It PT_FOLLOW_FORK
+This request controls tracing for new child processes of a traced process.
+If
+.Fa data
+is non-zero,
+then new child processes will enable tracing and stop before executing their
+first instruction.
+If
+.Fa data
+is zero, then new child processes will execute without tracing enabled.
+By default, tracing is not enabled for new child processes.
+Child processes do not inherit this property.
+The traced process will set the
+.Dv PL_FLAG_FORKED
+flag upon exit from a system call that creates a new process.
 .It PT_VM_TIMESTAMP
 This request returns the generation number or timestamp of the memory map of
 the traced process as the return value from
@@ -567,6 +601,7 @@ function appeared in
 .At v7 .
 .Sh BUGS
 The
+.Dv PL_FLAG_FORKED ,
 .Dv PL_FLAG_SCE ,
 .Dv PL_FLAG_SCX
 and

Modified: projects/sv/lib/libelf/elf_data.c
==============================================================================
--- projects/sv/lib/libelf/elf_data.c	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/lib/libelf/elf_data.c	Mon Jan 31 22:14:47 2011	(r218144)
@@ -115,8 +115,10 @@ elf_getdata(Elf_Scn *s, Elf_Data *d)
 	d->d_type    = elftype;
 	d->d_version = e->e_version;
 
-	if (sh_type == SHT_NOBITS)
+	if (sh_type == SHT_NOBITS || sh_size == 0) {
+	        STAILQ_INSERT_TAIL(&s->s_data, d, d_next);
 		return (d);
+        }
 
 	if ((d->d_buf = malloc(msz*count)) == NULL) {
 		(void) _libelf_release_data(d);

Modified: projects/sv/libexec/rtld-elf/amd64/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/amd64/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/amd64/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -73,4 +73,7 @@ typedef struct {
 
 extern void *__tls_get_addr(tls_index *ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
+#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
+
 #endif

Modified: projects/sv/libexec/rtld-elf/arm/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/arm/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/arm/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -69,4 +69,7 @@ void _rtld_bind_start(void);
 
 extern void *__tls_get_addr(tls_index *ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
+#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
+
 #endif

Modified: projects/sv/libexec/rtld-elf/i386/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/i386/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/i386/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -74,4 +74,7 @@ typedef struct {
 extern void *___tls_get_addr(tls_index *ti) __attribute__((__regparm__(1)));
 extern void *__tls_get_addr(tls_index *ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
+#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
+
 #endif

Modified: projects/sv/libexec/rtld-elf/ia64/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/ia64/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/ia64/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -65,4 +65,7 @@ void call_initfini_pointer(const struct 
 
 extern void *__tls_get_addr(unsigned long module, unsigned long offset);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	0
+#define	RTLD_DEFAULT_STACK_EXEC		0
+
 #endif

Modified: projects/sv/libexec/rtld-elf/map_object.c
==============================================================================
--- projects/sv/libexec/rtld-elf/map_object.c	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/map_object.c	Mon Jan 31 22:14:47 2011	(r218144)
@@ -101,7 +101,7 @@ map_object(int fd, const char *path, con
     phdyn = phinterp = phtls = NULL;
     phdr_vaddr = 0;
     segs = alloca(sizeof(segs[0]) * hdr->e_phnum);
-    stack_flags = PF_X | PF_R | PF_W;
+    stack_flags = RTLD_DEFAULT_STACK_PF_EXEC | PF_R | PF_W;
     while (phdr < phlimit) {
 	switch (phdr->p_type) {
 

Modified: projects/sv/libexec/rtld-elf/mips/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/mips/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/mips/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -69,4 +69,7 @@ void _rtld_bind_start(void);
 
 extern void *__tls_get_addr(tls_index *ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
+#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
+
 #endif

Modified: projects/sv/libexec/rtld-elf/powerpc/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/powerpc/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/powerpc/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -84,4 +84,7 @@ typedef struct {
 
 extern void *__tls_get_addr(tls_index* ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
+#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
+
 #endif

Modified: projects/sv/libexec/rtld-elf/powerpc64/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/powerpc64/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/powerpc64/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -76,4 +76,7 @@ typedef struct {
 
 extern void *__tls_get_addr(tls_index* ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	PF_X
+#define	RTLD_DEFAULT_STACK_EXEC		PROT_EXEC
+
 #endif

Modified: projects/sv/libexec/rtld-elf/rtld.c
==============================================================================
--- projects/sv/libexec/rtld-elf/rtld.c	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/rtld.c	Mon Jan 31 22:14:47 2011	(r218144)
@@ -93,7 +93,6 @@ static void *fill_search_info(const char
 static char *find_library(const char *, const Obj_Entry *);
 static const char *gethints(void);
 static void init_dag(Obj_Entry *);
-static void init_dag1(Obj_Entry *, Obj_Entry *, DoneList *);
 static void init_rtld(caddr_t, Elf_Auxinfo **);
 static void initlist_add_neededs(Needed_Entry *, Objlist *);
 static void initlist_add_objects(Obj_Entry *, Obj_Entry **, Objlist *);
@@ -191,7 +190,7 @@ extern Elf_Dyn _DYNAMIC;
 
 int osreldate, pagesize;
 
-static int stack_prot = PROT_READ | PROT_WRITE | PROT_EXEC;
+static int stack_prot = PROT_READ | PROT_WRITE | RTLD_DEFAULT_STACK_EXEC;
 static int max_stack_flags;
 
 /*
@@ -1331,28 +1330,33 @@ gethints(void)
 static void
 init_dag(Obj_Entry *root)
 {
+    const Needed_Entry *needed;
+    const Objlist_Entry *elm;
     DoneList donelist;
 
     if (root->dag_inited)
 	return;
     donelist_init(&donelist);
-    init_dag1(root, root, &donelist);
-    root->dag_inited = true;
-}
-
-static void
-init_dag1(Obj_Entry *root, Obj_Entry *obj, DoneList *dlp)
-{
-    const Needed_Entry *needed;
 
-    if (donelist_check(dlp, obj))
-	return;
+    /* Root object belongs to own DAG. */
+    objlist_push_tail(&root->dldags, root);
+    objlist_push_tail(&root->dagmembers, root);
+    donelist_check(&donelist, root);
 
-    objlist_push_tail(&obj->dldags, root);
-    objlist_push_tail(&root->dagmembers, obj);
-    for (needed = obj->needed;  needed != NULL;  needed = needed->next)
-	if (needed->obj != NULL)
-	    init_dag1(root, needed->obj, dlp);
+    /*
+     * Add dependencies of root object to DAG in breadth order
+     * by exploiting the fact that each new object get added
+     * to the tail of the dagmembers list.
+     */
+    STAILQ_FOREACH(elm, &root->dagmembers, link) {
+	for (needed = elm->obj->needed; needed != NULL; needed = needed->next) {
+	    if (needed->obj == NULL || donelist_check(&donelist, needed->obj))
+		continue;
+	    objlist_push_tail(&needed->obj->dldags, root);
+	    objlist_push_tail(&root->dagmembers, needed->obj);
+	}
+    }
+    root->dag_inited = true;
 }
 
 /*
@@ -1385,7 +1389,7 @@ init_rtld(caddr_t mapbase, Elf_Auxinfo *
 	digest_dynamic1(&objtmp, 1, &dyn_rpath, &dyn_soname);
 	assert(objtmp.needed == NULL);
 #if !defined(__mips__)
-	/* MIPS and SH{3,5} have a bogus DT_TEXTREL. */
+	/* MIPS has a bogus DT_TEXTREL. */
 	assert(!objtmp.textrel);
 #endif
 
@@ -2320,32 +2324,28 @@ do_dlsym(void *handle, const char *name,
 
 	donelist_init(&donelist);
 	if (obj->mainprog) {
-	    /* Search main program and all libraries loaded by it. */
-	    res = symlook_list(&req, &list_main, &donelist);
+            /* Handle obtained by dlopen(NULL, ...) implies global scope. */
+	    res = symlook_global(&req, &donelist);
 	    if (res == 0) {
 		def = req.sym_out;
 		defobj = req.defobj_out;
-	    } else {
-		/*
-		 * We do not distinguish between 'main' object and
-		 * global scope.  If symbol is not defined by objects
-		 * loaded at startup, continue search among
-		 * dynamically loaded objects with RTLD_GLOBAL scope.
-		 */
-		res = symlook_list(&req, &list_global, &donelist);
+	    }
+	    /*
+	     * Search the dynamic linker itself, and possibly resolve the
+	     * symbol from there.  This is how the application links to
+	     * dynamic linker services such as dlopen.
+	     */
+	    if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) {
+		res = symlook_obj(&req, &obj_rtld);
 		if (res == 0) {
 		    def = req.sym_out;
 		    defobj = req.defobj_out;
 		}
 	    }
-	} else {
-	    Needed_Entry fake;
-
+	}
+	else {
 	    /* Search the whole DAG rooted at the given object. */
-	    fake.next = NULL;
-	    fake.obj = (Obj_Entry *)obj;
-	    fake.name = 0;
-	    res = symlook_needed(&req, &fake, &donelist);
+	    res = symlook_list(&req, &obj->dagmembers, &donelist);
 	    if (res == 0) {
 		def = req.sym_out;
 		defobj = req.defobj_out;
@@ -2800,7 +2800,12 @@ get_program_var_addr(const char *name, R
     donelist_init(&donelist);
     if (symlook_global(&req, &donelist) != 0)
 	return (NULL);
-    return ((const void **)(req.defobj_out->relocbase + req.sym_out->st_value));
+    if (ELF_ST_TYPE(req.sym_out->st_info) == STT_FUNC)
+	return ((const void **)make_function_pointer(req.sym_out,
+	  req.defobj_out));
+    else
+	return ((const void **)(req.defobj_out->relocbase +
+	  req.sym_out->st_value));
 }
 
 /*
@@ -2955,53 +2960,33 @@ symlook_list(SymLook *req, const Objlist
 }
 
 /*
- * Search the symbol table of a shared object and all objects needed
- * by it for a symbol of the given name.  Search order is
- * breadth-first.  Returns a pointer to the symbol, or NULL if no
- * definition was found.
+ * Search the chain of DAGS cointed to by the given Needed_Entry
+ * for a symbol of the given name.  Each DAG is scanned completely
+ * before advancing to the next one.  Returns a pointer to the symbol,
+ * or NULL if no definition was found.
  */
 static int
 symlook_needed(SymLook *req, const Needed_Entry *needed, DoneList *dlp)
 {
-    const Elf_Sym *def, *def_w;
+    const Elf_Sym *def;
     const Needed_Entry *n;
-    const Obj_Entry *defobj, *defobj1;
+    const Obj_Entry *defobj;
     SymLook req1;
     int res;
 
-    def = def_w = NULL;
+    def = NULL;
     defobj = NULL;
     symlook_init_from_req(&req1, req);
     for (n = needed; n != NULL; n = n->next) {
-	if (n->obj == NULL || donelist_check(dlp, n->obj) ||
-	    (res = symlook_obj(&req1, n->obj)) != 0)
+	if (n->obj == NULL ||
+	    (res = symlook_list(&req1, &n->obj->dagmembers, dlp)) != 0)
 	    continue;
-	def = req1.sym_out;
-	defobj = req1.defobj_out;
-	if (ELF_ST_BIND(def->st_info) != STB_WEAK) {
-	    req->defobj_out = defobj;
-	    req->sym_out = def;
-	    return (0);
-	}
-    }
-    /*
-     * There we come when either symbol definition is not found in
-     * directly needed objects, or found symbol is weak.
-     */
-    for (n = needed; n != NULL; n = n->next) {
-	if (n->obj == NULL)
-	    continue;
-	res = symlook_needed(&req1, n->obj->needed, dlp);
-	if (res != 0)
-	    continue;
-	def_w = req1.sym_out;
-	defobj1 = req1.defobj_out;
-	if (def == NULL || ELF_ST_BIND(def_w->st_info) != STB_WEAK) {
-	    def = def_w;
-	    defobj = defobj1;
+	if (def == NULL || ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK) {
+	    def = req1.sym_out;
+	    defobj = req1.defobj_out;
+	    if (ELF_ST_BIND(def->st_info) != STB_WEAK)
+		break;
 	}
-	if (ELF_ST_BIND(def_w->st_info) != STB_WEAK)
-	    break;
     }
     if (def != NULL) {
 	req->sym_out = def;
@@ -3719,10 +3704,17 @@ locate_dependency(const Obj_Entry *obj, 
     }
 
     for (needed = obj->needed;  needed != NULL;  needed = needed->next) {
-	if (needed->obj == NULL)
-	    continue;
-	if (object_match_name(needed->obj, name))
-	    return needed->obj;
+	if (strcmp(obj->strtab + needed->name, name) == 0 ||
+	  (needed->obj != NULL && object_match_name(needed->obj, name))) {
+	    /*
+	     * If there is DT_NEEDED for the name we are looking for,
+	     * we are all set.  Note that object might not be found if
+	     * dependency was not loaded yet, so the function can
+	     * return NULL here.  This is expected and handled
+	     * properly by the caller.
+	     */
+	    return (needed->obj);
+	}
     }
     _rtld_error("%s: Unexpected inconsistency: dependency %s not found",
 	obj->path, name);
@@ -3848,6 +3840,8 @@ rtld_verify_object_versions(Obj_Entry *o
     vn = obj->verneed;
     while (vn != NULL) {
 	depobj = locate_dependency(obj, obj->strtab + vn->vn_file);
+	if (depobj == NULL)
+	    return (-1);
 	vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
 	for (;;) {
 	    if (check_object_provided_version(obj, depobj, vna))

Modified: projects/sv/libexec/rtld-elf/sparc64/rtld_machdep.h
==============================================================================
--- projects/sv/libexec/rtld-elf/sparc64/rtld_machdep.h	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/libexec/rtld-elf/sparc64/rtld_machdep.h	Mon Jan 31 22:14:47 2011	(r218144)
@@ -65,4 +65,7 @@ typedef struct {
 
 extern void *__tls_get_addr(tls_index *ti);
 
+#define	RTLD_DEFAULT_STACK_PF_EXEC	0
+#define	RTLD_DEFAULT_STACK_EXEC		0
+
 #endif

Modified: projects/sv/sbin/fdisk/fdisk.c
==============================================================================
--- projects/sv/sbin/fdisk/fdisk.c	Mon Jan 31 22:10:01 2011	(r218143)
+++ projects/sv/sbin/fdisk/fdisk.c	Mon Jan 31 22:14:47 2011	(r218144)
@@ -49,7 +49,10 @@ __FBSDID("$FreeBSD$");
 
 int iotest;
 
-#define NOSECTORS ((u_int32_t)-1)
+#define NO_DISK_SECTORS ((u_int32_t)-1)
+#define NO_TRACK_CYLINDERS 1023
+#define NO_TRACK_HEADS 255
+#define NO_TRACK_SECTORS 63
 #define LBUF 100
 static char lbuf[LBUF];
 
@@ -62,7 +65,7 @@ static char lbuf[LBUF];
  *	Created.
  */
 
-#define Decimal(str, ans, tmp, nbits) if (decimal(str, &tmp, ans, nbits)) ans = tmp
+#define Decimal(str, ans, tmp, maxval) if (decimal(str, &tmp, ans, maxval)) ans = tmp
 
 #define RoundCyl(x) ((((x) + cylsecs - 1) / cylsecs) * cylsecs)
 
@@ -247,7 +250,7 @@ static int get_params(void);
 static int read_s0(void);
 static int write_s0(void);
 static int ok(const char *str);
-static int decimal(const char *str, int *num, int deflt, int nbits);
+static int decimal(const char *str, int *num, int deflt, uint32_t maxval);
 static int read_config(char *config_file);
 static void reset_boot(void);
 static int sanitize_partition(struct dos_partition *);
@@ -572,9 +575,9 @@ change_part(int i)
 	}
 
 	do {
-		Decimal("sysid (165=FreeBSD)", partp->dp_typ, tmp, sizeof(partp->dp_typ) * 8);
-		Decimal("start", partp->dp_start, tmp, sizeof(partp->dp_start) * 8);
-		Decimal("size", partp->dp_size, tmp, sizeof(partp->dp_size) * 8);
+		Decimal("sysid (165=FreeBSD)", partp->dp_typ, tmp, 255);
+		Decimal("start", partp->dp_start, tmp, NO_DISK_SECTORS);
+		Decimal("size", partp->dp_size, tmp, NO_DISK_SECTORS);
 		if (!sanitize_partition(partp)) {
 			warnx("ERROR: failed to adjust; setting sysid to 0");
 			partp->dp_typ = 0;
@@ -586,9 +589,9 @@ change_part(int i)
 			tcyl = DPCYL(partp->dp_scyl,partp->dp_ssect);
 			thd = partp->dp_shd;
 			tsec = DPSECT(partp->dp_ssect);
-			Decimal("beginning cylinder", tcyl, tmp, 10);
-			Decimal("beginning head", thd, tmp, sizeof(partp->dp_shd) * 8);
-			Decimal("beginning sector", tsec, tmp, 6);
+			Decimal("beginning cylinder", tcyl, tmp, NO_TRACK_CYLINDERS);
+			Decimal("beginning head", thd, tmp, NO_TRACK_HEADS);
+			Decimal("beginning sector", tsec, tmp, NO_TRACK_SECTORS);
 			partp->dp_scyl = DOSCYL(tcyl);
 			partp->dp_ssect = DOSSECT(tsec,tcyl);
 			partp->dp_shd = thd;
@@ -596,9 +599,9 @@ change_part(int i)
 			tcyl = DPCYL(partp->dp_ecyl,partp->dp_esect);
 			thd = partp->dp_ehd;
 			tsec = DPSECT(partp->dp_esect);
-			Decimal("ending cylinder", tcyl, tmp, 10);
-			Decimal("ending head", thd, tmp, sizeof(partp->dp_ehd) * 8);
-			Decimal("ending sector", tsec, tmp, 6);
+			Decimal("ending cylinder", tcyl, tmp, NO_TRACK_CYLINDERS);
+			Decimal("ending head", thd, tmp, NO_TRACK_HEADS);
+			Decimal("ending sector", tsec, tmp, NO_TRACK_SECTORS);
 			partp->dp_ecyl = DOSCYL(tcyl);
 			partp->dp_esect = DOSSECT(tsec,tcyl);
 			partp->dp_ehd = thd;
@@ -915,16 +918,12 @@ ok(const char *str)
 }
 
 static int
-decimal(const char *str, int *num, int deflt, int nbits)
+decimal(const char *str, int *num, int deflt, uint32_t maxval)
 {
-	long long acc = 0, limit;
+	long long acc = 0;
 	int c;
 	char *cp;
 
-	if (nbits == 0) {
-		nbits = sizeof(*num) * 8;
-	}
-	limit = (long long)1 << nbits;
 	while (1) {
 		printf("Supply a decimal value for \"%s\" [%d] ", str, deflt);
 		fflush(stdout);
@@ -941,7 +940,7 @@ decimal(const char *str, int *num, int d
 			return 0;
 		while ((c = *cp++)) {
 			if (c <= '9' && c >= '0') {
-				if (acc < limit)
+				if (maxval > 0 && acc <= maxval)
 					acc = acc * 10 + c - '0';
 			} else
 				break;
@@ -949,10 +948,11 @@ decimal(const char *str, int *num, int d
 		if (c == ' ' || c == '\t')
 			while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
 		if (!c) {
-			if (acc >= limit) {
-				acc = limit - 1;
-				printf("%s is too big, it will be truncated to %lld\n",
-				    lbuf, acc);
+			if (maxval > 0 && acc > maxval) {
+				acc = maxval;
+				printf("%s exceeds maximum value allowed for "
+				  "this field. The value has been reduced "
+				  "to %lld\n", lbuf, acc);
 			}
 			*num = acc;
 			return 1;
@@ -1108,7 +1108,7 @@ str2sectors(const char *str)
 	if (str == end || *end == '\0') {
 		warnx("ERROR line %d: unexpected size: \'%s\'",
 		    current_line_number, str);
-		return NOSECTORS;
+		return NO_DISK_SECTORS;
 	}
 
 	if (*end == 'K') 
@@ -1120,7 +1120,7 @@ str2sectors(const char *str)
 	else {
 		warnx("ERROR line %d: unexpected modifier: %c "
 		    "(not K/M/G)", current_line_number, *end);
-		return NOSECTORS;
+		return NO_DISK_SECTORS;
 	}
 
 	return val;
@@ -1170,7 +1170,7 @@ process_partition(CMD *command)
 			}
 		} else {
 			partp->dp_start = str2sectors(command->args[2].arg_str);
-			if (partp->dp_start == NOSECTORS)
+			if (partp->dp_start == NO_DISK_SECTORS)
 				break;
 		}
 	} else
@@ -1182,7 +1182,7 @@ process_partition(CMD *command)
 			    dos_cylsecs) - partp->dp_start;
 		else {
 			partp->dp_size = str2sectors(command->args[3].arg_str);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@FreeBSD.ORG  Tue Feb  1 09:27:24 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 638B4106564A;
	Tue,  1 Feb 2011 09:27:24 +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 5234D8FC0C;
	Tue,  1 Feb 2011 09:27:24 +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 p119ROdc065539;
	Tue, 1 Feb 2011 09:27:24 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p119ROkW065537;
	Tue, 1 Feb 2011 09:27:24 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102010927.p119ROkW065537@svn.freebsd.org>
From: Alexander Motin 
Date: Tue, 1 Feb 2011 09:27:24 +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: r218161 - 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, 01 Feb 2011 09:27:24 -0000

Author: mav
Date: Tue Feb  1 09:27:24 2011
New Revision: 218161
URL: http://svn.freebsd.org/changeset/base/218161

Log:
  Map status 1 is UNINITIALIZED.

Modified:
  projects/graid/head/sys/geom/raid/md_intel.c

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Tue Feb  1 08:10:18 2011	(r218160)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Tue Feb  1 09:27:24 2011	(r218161)
@@ -51,7 +51,7 @@ struct intel_raid_map {
 	uint16_t	strip_sectors;
 	uint8_t		status;
 #define INTEL_S_READY           0x00
-#define INTEL_S_DISABLED        0x01
+#define INTEL_S_UNINITIALIZED   0x01
 #define INTEL_S_DEGRADED        0x02
 #define INTEL_S_FAILURE         0x03
 

From owner-svn-src-projects@FreeBSD.ORG  Tue Feb  1 17:42:57 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 F23FE106566C;
	Tue,  1 Feb 2011 17:42:57 +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 E09088FC1B;
	Tue,  1 Feb 2011 17:42:57 +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 p11HgvKH080002;
	Tue, 1 Feb 2011 17:42:57 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p11Hgv75079999;
	Tue, 1 Feb 2011 17:42:57 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102011742.p11Hgv75079999@svn.freebsd.org>
From: Alexander Motin 
Date: Tue, 1 Feb 2011 17:42:57 +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: r218174 - projects/graid/head/sys/dev/led
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, 01 Feb 2011 17:42:58 -0000

Author: mav
Date: Tue Feb  1 17:42:57 2011
New Revision: 218174
URL: http://svn.freebsd.org/changeset/base/218174

Log:
  Add simple in-kernel API for controlling leds.

Modified:
  projects/graid/head/sys/dev/led/led.c
  projects/graid/head/sys/dev/led/led.h

Modified: projects/graid/head/sys/dev/led/led.c
==============================================================================
--- projects/graid/head/sys/dev/led/led.c	Tue Feb  1 16:15:31 2011	(r218173)
+++ projects/graid/head/sys/dev/led/led.c	Tue Feb  1 17:42:57 2011	(r218174)
@@ -26,6 +26,7 @@ __FBSDID("$FreeBSD$");
 
 struct ledsc {
 	LIST_ENTRY(ledsc)	list;
+	char			*name;
 	void			*private;
 	int			unit;
 	led_t			*func;
@@ -83,71 +84,43 @@ led_timeout(void *p)
 }
 
 static int
-led_state(struct cdev *dev, struct sbuf *sb, int state)
+led_state(struct ledsc *sc, struct sbuf **sb, int state)
 {
 	struct sbuf *sb2 = NULL;
-	struct ledsc *sc;
 
-	mtx_lock(&led_mtx);
-	sc = dev->si_drv1;
-	if (sc != NULL) {
-		sb2 = sc->spec;
-		sc->spec = sb;
-		if (sb != NULL) {
-			sc->str = sbuf_data(sb);
-			sc->ptr = sc->str;
-		} else {
-			sc->str = NULL;
-			sc->ptr = NULL;
-			sc->func(sc->private, state);
-		}
-		sc->count = 0;
+	sb2 = sc->spec;
+	sc->spec = *sb;
+	if (*sb != NULL) {
+		sc->str = sbuf_data(*sb);
+		sc->ptr = sc->str;
+	} else {
+		sc->str = NULL;
+		sc->ptr = NULL;
+		sc->func(sc->private, state);
 	}
-	mtx_unlock(&led_mtx);
-	if (sb2 != NULL)
-		sbuf_delete(sb2);
-	if (sc == NULL)
-		return (ENXIO);
+	sc->count = 0;
+	*sb = sb2;
 	return(0);
 }
 
 static int
-led_write(struct cdev *dev, struct uio *uio, int ioflag)
+led_parse(const char *s, struct sbuf **sb, int *state)
 {
-	int error;
-	char *s, *s2;
-	struct sbuf *sb = NULL;
-	int i;
-
-	if (dev->si_drv1 == NULL)
-		return (ENXIO);
-
-	if (uio->uio_resid > 512)
-		return (EINVAL);
-	s2 = s = malloc(uio->uio_resid + 1, M_DEVBUF, M_WAITOK);
-	s[uio->uio_resid] = '\0';
-	error = uiomove(s, uio->uio_resid, uio);
-	if (error) {
-		free(s2, M_DEVBUF);
-		return (error);
-	}
+	int i, error;
 
 	/*
 	 * Handle "on" and "off" immediately so people can flash really
 	 * fast from userland if they want to
 	 */
 	if (*s == '0' || *s == '1') {
-		error = led_state(dev, NULL, *s & 1);
-		free(s2, M_DEVBUF);
-		return(error);
+		*state = *s & 1;
+		return (0);
 	}
 
-	sb = sbuf_new_auto();
-	if (sb == NULL) {
-		free(s2, M_DEVBUF);
+	*state = 0;
+	*sb = sbuf_new_auto();
+	if (*sb == NULL)
 		return (ENOMEM);
-	}
-		
 	switch(s[0]) {
 		/*
 		 * Flash, default is 100msec/100msec.
@@ -158,7 +131,7 @@ led_write(struct cdev *dev, struct uio *
 				i = s[1] - '1';
 			else
 				i = 0;
-			sbuf_printf(sb, "%c%c", 'A' + i, 'a' + i);
+			sbuf_printf(*sb, "%c%c", 'A' + i, 'a' + i);
 			break;
 		/*
 		 * Digits, flashes out numbers.
@@ -172,10 +145,10 @@ led_write(struct cdev *dev, struct uio *
 				if (i == 0)
 					i = 10;
 				for (; i > 1; i--) 
-					sbuf_cat(sb, "Aa");
-				sbuf_cat(sb, "Aj");
+					sbuf_cat(*sb, "Aa");
+				sbuf_cat(*sb, "Aj");
 			}
-			sbuf_cat(sb, "jj");
+			sbuf_cat(*sb, "jj");
 			break;
 		/*
 		 * String, roll your own.
@@ -190,7 +163,7 @@ led_write(struct cdev *dev, struct uio *
 				    (*s >= 'A' && *s <= 'J') ||
 				    *s == 'U' || *s <= 'u' ||
 					*s == '.')
-					sbuf_bcat(sb, s, 1);
+					sbuf_bcat(*sb, s, 1);
 			}
 			break;
 		/*
@@ -205,29 +178,82 @@ led_write(struct cdev *dev, struct uio *
 		case 'm':
 			for(s++; *s; s++) {
 				if (*s == '.')
-					sbuf_cat(sb, "aA");
+					sbuf_cat(*sb, "aA");
 				else if (*s == '-')
-					sbuf_cat(sb, "aC");
+					sbuf_cat(*sb, "aC");
 				else if (*s == ' ')
-					sbuf_cat(sb, "b");
+					sbuf_cat(*sb, "b");
 				else if (*s == '\n')
-					sbuf_cat(sb, "d");
+					sbuf_cat(*sb, "d");
 			}
-			sbuf_cat(sb, "j");
+			sbuf_cat(*sb, "j");
 			break;
 		default:
-			sbuf_delete(sb);
-			free(s2, M_DEVBUF);
+			sbuf_delete(*sb);
 			return (EINVAL);
 	}
-	error = sbuf_finish(sb);
-	free(s2, M_DEVBUF);
-	if (error != 0 || sbuf_len(sb) == 0) {
-		sbuf_delete(sb);
+	error = sbuf_finish(*sb);
+	if (error != 0 || sbuf_len(*sb) == 0) {
+		*sb = NULL;
+		return (error);
+	}
+	return (0);
+}
+
+static int
+led_write(struct cdev *dev, struct uio *uio, int ioflag)
+{
+	struct ledsc	*sc;
+	char *s;
+	struct sbuf *sb = NULL;
+	int error, state = 0;
+
+	if (uio->uio_resid > 512)
+		return (EINVAL);
+	s = malloc(uio->uio_resid + 1, M_DEVBUF, M_WAITOK);
+	s[uio->uio_resid] = '\0';
+	error = uiomove(s, uio->uio_resid, uio);
+	if (error) {
+		free(s, M_DEVBUF);
 		return (error);
 	}
+	error = led_parse(s, &sb, &state);
+	free(s, M_DEVBUF);
+	if (error)
+		return (error);
+	mtx_lock(&led_mtx);
+	sc = dev->si_drv1;
+	if (sc != NULL)
+		error = led_state(sc, &sb, state);
+	mtx_unlock(&led_mtx);
+	if (sb != NULL)
+		sbuf_delete(sb);
+	return (error);
+}
 
-	return (led_state(dev, sb, 0));
+int
+led_set(char const *name, char const *cmd)
+{
+	struct ledsc	*sc;
+	struct sbuf *sb = NULL;
+	int error, state = 0;
+
+	error = led_parse(cmd, &sb, &state);
+	if (error)
+		return (error);
+	mtx_lock(&led_mtx);
+	LIST_FOREACH(sc, &led_list, list) {
+		if (strcmp(sc->name, name) == 0)
+			break;
+	}
+	if (sc != NULL)
+		error = led_state(sc, &sb, state);
+	else
+		error = ENOENT;
+	mtx_unlock(&led_mtx);
+	if (sb != NULL)
+		sbuf_delete(sb);
+	return (0);
 }
 
 static struct cdevsw led_cdevsw = {
@@ -250,6 +276,7 @@ led_create_state(led_t *func, void *priv
 	sc = malloc(sizeof *sc, M_LED, M_WAITOK | M_ZERO);
 
 	sx_xlock(&led_sx);
+	sc->name = strdup(name, M_LED);
 	sc->unit = alloc_unr(led_unit);
 	sc->private = priv;
 	sc->func = func;
@@ -287,6 +314,7 @@ led_destroy(struct cdev *dev)
 	destroy_dev(dev);
 	if (sc->spec != NULL)
 		sbuf_delete(sc->spec);
+	free(sc->name, M_LED);
 	free(sc, M_LED);
 	sx_xunlock(&led_sx);
 }

Modified: projects/graid/head/sys/dev/led/led.h
==============================================================================
--- projects/graid/head/sys/dev/led/led.h	Tue Feb  1 16:15:31 2011	(r218173)
+++ projects/graid/head/sys/dev/led/led.h	Tue Feb  1 17:42:57 2011	(r218174)
@@ -18,4 +18,6 @@ struct cdev *led_create_state(led_t *, v
 struct cdev *led_create(led_t *, void *, char const *);
 void	led_destroy(struct cdev *);
 
+int	led_set(char const *, char const *);
+
 #endif

From owner-svn-src-projects@FreeBSD.ORG  Wed Feb  2 19:20:21 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 AF98A1065674;
	Wed,  2 Feb 2011 19:20:21 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 996F68FC08;
	Wed,  2 Feb 2011 19:20:21 +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 p12JKLjn019190;
	Wed, 2 Feb 2011 19:20:21 GMT (envelope-from dim@svn.freebsd.org)
Received: (from dim@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p12JKL0x019166;
	Wed, 2 Feb 2011 19:20:21 GMT (envelope-from dim@svn.freebsd.org)
Message-Id: <201102021920.p12JKL0x019166@svn.freebsd.org>
From: Dimitry Andric 
Date: Wed, 2 Feb 2011 19:20:21 +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: r218200 - in projects/binutils-2.17: . bin/sh
	contrib/top contrib/tzdata etc etc/mail etc/rc.d
	gnu/lib/libgomp lib/csu/mips lib/libkvm lib/liblzma
	libexec/rtld-elf sbin/hastd sbin/ifcon...
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: Wed, 02 Feb 2011 19:20:21 -0000

Author: dim
Date: Wed Feb  2 19:20:20 2011
New Revision: 218200
URL: http://svn.freebsd.org/changeset/base/218200

Log:
  Sync: merge r218029 through r218199 from ^/head.

Added:
  projects/binutils-2.17/sys/dev/ath/if_ath_debug.c
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_debug.c
  projects/binutils-2.17/sys/dev/ath/if_ath_debug.h
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_debug.h
  projects/binutils-2.17/sys/dev/ath/if_ath_misc.h
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_misc.h
  projects/binutils-2.17/sys/dev/ath/if_ath_tx.c
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_tx.c
  projects/binutils-2.17/sys/dev/ath/if_ath_tx.h
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_tx.h
  projects/binutils-2.17/sys/dev/ath/if_ath_tx_ht.c
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_tx_ht.c
  projects/binutils-2.17/sys/dev/ath/if_ath_tx_ht.h
     - copied unchanged from r218199, head/sys/dev/ath/if_ath_tx_ht.h
  projects/binutils-2.17/sys/modules/cc/cc_chd/
     - copied from r218199, head/sys/modules/cc/cc_chd/
  projects/binutils-2.17/sys/modules/cc/cc_hd/
     - copied from r218199, head/sys/modules/cc/cc_hd/
  projects/binutils-2.17/sys/modules/cc/cc_vegas/
     - copied from r218199, head/sys/modules/cc/cc_vegas/
  projects/binutils-2.17/sys/netinet/cc/cc_chd.c
     - copied unchanged from r218199, head/sys/netinet/cc/cc_chd.c
  projects/binutils-2.17/sys/netinet/cc/cc_hd.c
     - copied unchanged from r218199, head/sys/netinet/cc/cc_hd.c
  projects/binutils-2.17/sys/netinet/cc/cc_vegas.c
     - copied unchanged from r218199, head/sys/netinet/cc/cc_vegas.c
  projects/binutils-2.17/tools/regression/bin/sh/execution/killed2.0
     - copied unchanged from r218199, head/tools/regression/bin/sh/execution/killed2.0
Modified:
  projects/binutils-2.17/Makefile
  projects/binutils-2.17/Makefile.inc1
  projects/binutils-2.17/bin/sh/jobs.c
  projects/binutils-2.17/contrib/top/display.c
  projects/binutils-2.17/contrib/tzdata/australasia
  projects/binutils-2.17/contrib/tzdata/northamerica
  projects/binutils-2.17/etc/ftpusers
  projects/binutils-2.17/etc/group
  projects/binutils-2.17/etc/mail/aliases
  projects/binutils-2.17/etc/master.passwd
  projects/binutils-2.17/etc/rc.d/rpcbind
  projects/binutils-2.17/gnu/lib/libgomp/Makefile
  projects/binutils-2.17/lib/csu/mips/crt1.c
  projects/binutils-2.17/lib/libkvm/kvm.c
  projects/binutils-2.17/lib/liblzma/config.h
  projects/binutils-2.17/libexec/rtld-elf/rtld.c
  projects/binutils-2.17/sbin/hastd/hast.h
  projects/binutils-2.17/sbin/hastd/hastd.c
  projects/binutils-2.17/sbin/hastd/hastd.h
  projects/binutils-2.17/sbin/hastd/pjdlog.c
  projects/binutils-2.17/sbin/hastd/pjdlog.h
  projects/binutils-2.17/sbin/hastd/primary.c
  projects/binutils-2.17/sbin/hastd/proto.c
  projects/binutils-2.17/sbin/hastd/proto.h
  projects/binutils-2.17/sbin/hastd/proto_common.c
  projects/binutils-2.17/sbin/hastd/proto_impl.h
  projects/binutils-2.17/sbin/hastd/proto_socketpair.c
  projects/binutils-2.17/sbin/hastd/proto_tcp4.c
  projects/binutils-2.17/sbin/hastd/proto_uds.c
  projects/binutils-2.17/sbin/hastd/secondary.c
  projects/binutils-2.17/sbin/hastd/subr.c
  projects/binutils-2.17/sbin/hastd/subr.h
  projects/binutils-2.17/sbin/ifconfig/ifieee80211.c
  projects/binutils-2.17/share/syscons/keymaps/Makefile
  projects/binutils-2.17/sys/amd64/amd64/uio_machdep.c
  projects/binutils-2.17/sys/amd64/linux32/linux32_machdep.c
  projects/binutils-2.17/sys/amd64/linux32/linux32_proto.h
  projects/binutils-2.17/sys/amd64/linux32/syscalls.master
  projects/binutils-2.17/sys/arm/arm/uio_machdep.c
  projects/binutils-2.17/sys/arm/include/fdt.h
  projects/binutils-2.17/sys/arm/s3c2xx0/std.ln2410sbc
  projects/binutils-2.17/sys/cddl/compat/opensolaris/sys/types.h
  projects/binutils-2.17/sys/compat/linprocfs/linprocfs.c
  projects/binutils-2.17/sys/compat/linux/linux_futex.c
  projects/binutils-2.17/sys/compat/linux/linux_futex.h
  projects/binutils-2.17/sys/compat/linux/linux_misc.c
  projects/binutils-2.17/sys/compat/linux/linux_misc.h
  projects/binutils-2.17/sys/conf/files
  projects/binutils-2.17/sys/conf/kern.pre.mk
  projects/binutils-2.17/sys/dev/ahci/ahci.c
  projects/binutils-2.17/sys/dev/alc/if_alc.c
  projects/binutils-2.17/sys/dev/ata/ata-pci.h
  projects/binutils-2.17/sys/dev/ata/chipsets/ata-intel.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ah.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ah.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ah_internal.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar5416/ar5416.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar5416/ar5416phy.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar5416/ar5416reg.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar9002/ar9280.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar9002/ar9285.h
  projects/binutils-2.17/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c
  projects/binutils-2.17/sys/dev/ath/ath_rate/amrr/amrr.c
  projects/binutils-2.17/sys/dev/ath/ath_rate/onoe/onoe.c
  projects/binutils-2.17/sys/dev/ath/ath_rate/sample/sample.c
  projects/binutils-2.17/sys/dev/ath/if_ath.c
  projects/binutils-2.17/sys/dev/ath/if_athrate.h
  projects/binutils-2.17/sys/dev/ath/if_athvar.h
  projects/binutils-2.17/sys/dev/cs/if_cs.c
  projects/binutils-2.17/sys/dev/cs/if_csreg.h
  projects/binutils-2.17/sys/dev/cs/if_csvar.h
  projects/binutils-2.17/sys/dev/fdt/fdt_common.c
  projects/binutils-2.17/sys/dev/fdt/fdt_pci.c
  projects/binutils-2.17/sys/dev/fdt/fdtbus.c
  projects/binutils-2.17/sys/dev/flash/mx25l.c
  projects/binutils-2.17/sys/dev/ichsmb/ichsmb_pci.c
  projects/binutils-2.17/sys/dev/ichwd/ichwd.c
  projects/binutils-2.17/sys/dev/ichwd/ichwd.h
  projects/binutils-2.17/sys/dev/sound/pci/hda/hdac.c
  projects/binutils-2.17/sys/dev/tsec/if_tsec_fdt.c
  projects/binutils-2.17/sys/dev/usb/serial/u3g.c
  projects/binutils-2.17/sys/dev/usb/usb_pf.c
  projects/binutils-2.17/sys/dev/usb/usb_pf.h
  projects/binutils-2.17/sys/dev/usb/usbdevs
  projects/binutils-2.17/sys/dev/xen/netfront/netfront.c
  projects/binutils-2.17/sys/fs/ext2fs/ext2_alloc.c
  projects/binutils-2.17/sys/fs/ext2fs/ext2_mount.h
  projects/binutils-2.17/sys/fs/ext2fs/ext2_vfsops.c
  projects/binutils-2.17/sys/fs/ext2fs/ext2fs.h
  projects/binutils-2.17/sys/i386/i386/uio_machdep.c
  projects/binutils-2.17/sys/i386/linux/linux_machdep.c
  projects/binutils-2.17/sys/i386/linux/linux_proto.h
  projects/binutils-2.17/sys/i386/linux/syscalls.master
  projects/binutils-2.17/sys/ia64/ia64/uio_machdep.c
  projects/binutils-2.17/sys/kern/imgact_elf.c
  projects/binutils-2.17/sys/kern/subr_uio.c
  projects/binutils-2.17/sys/kern/uipc_usrreq.c
  projects/binutils-2.17/sys/kern/vfs_mount.c
  projects/binutils-2.17/sys/kern/vfs_subr.c
  projects/binutils-2.17/sys/mips/mips/uio_machdep.c
  projects/binutils-2.17/sys/modules/ath/Makefile
  projects/binutils-2.17/sys/modules/cc/Makefile
  projects/binutils-2.17/sys/net80211/ieee80211_ioctl.c
  projects/binutils-2.17/sys/net80211/ieee80211_scan.c
  projects/binutils-2.17/sys/netinet/cc.h
  projects/binutils-2.17/sys/netinet/cc/cc_newreno.c
  projects/binutils-2.17/sys/netinet/sctp.h
  projects/binutils-2.17/sys/netinet/sctp_cc_functions.c
  projects/binutils-2.17/sys/netinet/sctp_constants.h
  projects/binutils-2.17/sys/netinet/sctp_header.h
  projects/binutils-2.17/sys/netinet/sctp_indata.c
  projects/binutils-2.17/sys/netinet/sctp_indata.h
  projects/binutils-2.17/sys/netinet/sctp_input.c
  projects/binutils-2.17/sys/netinet/sctp_output.c
  projects/binutils-2.17/sys/netinet/sctp_output.h
  projects/binutils-2.17/sys/netinet/sctp_pcb.c
  projects/binutils-2.17/sys/netinet/sctp_pcb.h
  projects/binutils-2.17/sys/netinet/sctp_structs.h
  projects/binutils-2.17/sys/netinet/sctp_sysctl.c
  projects/binutils-2.17/sys/netinet/sctp_sysctl.h
  projects/binutils-2.17/sys/netinet/sctp_timer.c
  projects/binutils-2.17/sys/netinet/sctp_uio.h
  projects/binutils-2.17/sys/netinet/sctputil.c
  projects/binutils-2.17/sys/netinet/sctputil.h
  projects/binutils-2.17/sys/netinet/tcp_usrreq.c
  projects/binutils-2.17/sys/powerpc/include/fdt.h
  projects/binutils-2.17/sys/powerpc/include/intr_machdep.h
  projects/binutils-2.17/sys/powerpc/include/openpicvar.h
  projects/binutils-2.17/sys/powerpc/mambo/mambo_openpic.c
  projects/binutils-2.17/sys/powerpc/mpc85xx/atpic.c
  projects/binutils-2.17/sys/powerpc/mpc85xx/isa.c
  projects/binutils-2.17/sys/powerpc/mpc85xx/nexus.c
  projects/binutils-2.17/sys/powerpc/mpc85xx/openpic_fdt.c
  projects/binutils-2.17/sys/powerpc/mpc85xx/pci_fdt.c
  projects/binutils-2.17/sys/powerpc/ofw/ofw_pcib_pci.c
  projects/binutils-2.17/sys/powerpc/ofw/ofw_pcibus.c
  projects/binutils-2.17/sys/powerpc/powermac/cpcht.c
  projects/binutils-2.17/sys/powerpc/powermac/grackle.c
  projects/binutils-2.17/sys/powerpc/powermac/hrowpic.c
  projects/binutils-2.17/sys/powerpc/powermac/macgpio.c
  projects/binutils-2.17/sys/powerpc/powermac/macio.c
  projects/binutils-2.17/sys/powerpc/powermac/openpic_macio.c
  projects/binutils-2.17/sys/powerpc/powermac/uninorth.c
  projects/binutils-2.17/sys/powerpc/powermac/uninorthpci.c
  projects/binutils-2.17/sys/powerpc/powerpc/intr_machdep.c
  projects/binutils-2.17/sys/powerpc/powerpc/openpic.c
  projects/binutils-2.17/sys/powerpc/powerpc/pic_if.m
  projects/binutils-2.17/sys/powerpc/powerpc/uio_machdep.c
  projects/binutils-2.17/sys/powerpc/ps3/ps3pic.c
  projects/binutils-2.17/sys/powerpc/psim/openpic_iobus.c
  projects/binutils-2.17/sys/sparc64/sparc64/uio_machdep.c
  projects/binutils-2.17/sys/sun4v/sun4v/uio_machdep.c
  projects/binutils-2.17/sys/sys/uio.h
  projects/binutils-2.17/sys/sys/vnode.h
  projects/binutils-2.17/sys/ufs/ffs/ffs_rawread.c
  projects/binutils-2.17/sys/ufs/ffs/ffs_softdep.c
  projects/binutils-2.17/sys/vm/vm_map.c
  projects/binutils-2.17/sys/vm/vm_page.c
  projects/binutils-2.17/tools/tools/ath/athpow/athpow.c
  projects/binutils-2.17/usr.sbin/newsyslog/newsyslog.8
  projects/binutils-2.17/usr.sbin/newsyslog/newsyslog.c
  projects/binutils-2.17/usr.sbin/newsyslog/newsyslog.conf.5
  projects/binutils-2.17/usr.sbin/newsyslog/pathnames.h
Directory Properties:
  projects/binutils-2.17/   (props changed)
  projects/binutils-2.17/cddl/contrib/opensolaris/   (props changed)
  projects/binutils-2.17/contrib/bind9/   (props changed)
  projects/binutils-2.17/contrib/binutils/   (props changed)
  projects/binutils-2.17/contrib/bzip2/   (props changed)
  projects/binutils-2.17/contrib/dialog/   (props changed)
  projects/binutils-2.17/contrib/ee/   (props changed)
  projects/binutils-2.17/contrib/expat/   (props changed)
  projects/binutils-2.17/contrib/file/   (props changed)
  projects/binutils-2.17/contrib/gdb/   (props changed)
  projects/binutils-2.17/contrib/gdtoa/   (props changed)
  projects/binutils-2.17/contrib/gnu-sort/   (props changed)
  projects/binutils-2.17/contrib/groff/   (props changed)
  projects/binutils-2.17/contrib/less/   (props changed)
  projects/binutils-2.17/contrib/libpcap/   (props changed)
  projects/binutils-2.17/contrib/llvm/   (props changed)
  projects/binutils-2.17/contrib/llvm/tools/clang/   (props changed)
  projects/binutils-2.17/contrib/ncurses/   (props changed)
  projects/binutils-2.17/contrib/netcat/   (props changed)
  projects/binutils-2.17/contrib/ntp/   (props changed)
  projects/binutils-2.17/contrib/one-true-awk/   (props changed)
  projects/binutils-2.17/contrib/openbsm/   (props changed)
  projects/binutils-2.17/contrib/openpam/   (props changed)
  projects/binutils-2.17/contrib/pf/   (props changed)
  projects/binutils-2.17/contrib/sendmail/   (props changed)
  projects/binutils-2.17/contrib/tcpdump/   (props changed)
  projects/binutils-2.17/contrib/tcsh/   (props changed)
  projects/binutils-2.17/contrib/top/   (props changed)
  projects/binutils-2.17/contrib/top/install-sh   (props changed)
  projects/binutils-2.17/contrib/tzcode/stdtime/   (props changed)
  projects/binutils-2.17/contrib/tzcode/zic/   (props changed)
  projects/binutils-2.17/contrib/tzdata/   (props changed)
  projects/binutils-2.17/contrib/wpa/   (props changed)
  projects/binutils-2.17/contrib/xz/   (props changed)
  projects/binutils-2.17/crypto/openssh/   (props changed)
  projects/binutils-2.17/crypto/openssl/   (props changed)
  projects/binutils-2.17/lib/libc/   (props changed)
  projects/binutils-2.17/lib/libc/stdtime/   (props changed)
  projects/binutils-2.17/lib/libutil/   (props changed)
  projects/binutils-2.17/lib/libz/   (props changed)
  projects/binutils-2.17/sbin/   (props changed)
  projects/binutils-2.17/sbin/ipfw/   (props changed)
  projects/binutils-2.17/share/mk/bsd.arch.inc.mk   (props changed)
  projects/binutils-2.17/share/zoneinfo/   (props changed)
  projects/binutils-2.17/sys/   (props changed)
  projects/binutils-2.17/sys/amd64/include/xen/   (props changed)
  projects/binutils-2.17/sys/cddl/contrib/opensolaris/   (props changed)
  projects/binutils-2.17/sys/contrib/dev/acpica/   (props changed)
  projects/binutils-2.17/sys/contrib/octeon-sdk/   (props changed)
  projects/binutils-2.17/sys/contrib/pf/   (props changed)
  projects/binutils-2.17/sys/contrib/x86emu/   (props changed)
  projects/binutils-2.17/usr.bin/calendar/   (props changed)
  projects/binutils-2.17/usr.bin/csup/   (props changed)
  projects/binutils-2.17/usr.bin/procstat/   (props changed)
  projects/binutils-2.17/usr.sbin/zic/   (props changed)

Modified: projects/binutils-2.17/Makefile
==============================================================================
--- projects/binutils-2.17/Makefile	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/Makefile	Wed Feb  2 19:20:20 2011	(r218200)
@@ -126,6 +126,38 @@ BINMAKE= \
 	-m ${.CURDIR}/share/mk
 _MAKE=	PATH=${PATH} ${BINMAKE} -f Makefile.inc1
 
+# Guess machine architecture from machine type, and vice versa.
+.if !defined(TARGET_ARCH) && defined(TARGET)
+_TARGET_ARCH=	${TARGET:S/pc98/i386/:S/sun4v/sparc64/:S/mips/mipsel/}
+.elif !defined(TARGET) && defined(TARGET_ARCH) && \
+    ${TARGET_ARCH} != ${MACHINE_ARCH}
+_TARGET=		${TARGET_ARCH:C/mips.*e[lb]/mips/:C/armeb/arm/}
+.endif
+# Legacy names, for a transition period mips:mips -> mipsel:mips
+.if defined(TARGET) && defined(TARGET_ARCH) && \
+    ${TARGET_ARCH} == "mips" && ${TARGET} == "mips"
+.warning "TARGET_ARCH of mips is deprecated in favor of mipsel or mipseb"
+.if defined(TARGET_BIG_ENDIAN)
+_TARGET_ARCH=mipseb
+.else
+_TARGET_ARCH=mipsel
+.endif
+.endif
+# arm with TARGET_BIG_ENDIAN -> armeb
+.if defined(TARGET_ARCH) && ${TARGET_ARCH} == "arm" && defined(TARGET_BIG_ENDIAN)
+.warning "TARGET_ARCH of arm with TARGET_BIG_ENDIAN is deprecated.  use armeb"
+_TARGET_ARCH=armeb
+.endif
+.if defined(TARGET) && !defined(_TARGET)
+_TARGET=${TARGET}
+.endif
+.if defined(TARGET_ARCH) && !defined(_TARGET_ARCH)
+_TARGET_ARCH=${TARGET_ARCH}
+.endif
+# Otherwise, default to current machine type and architecture.
+_TARGET?=	${MACHINE}
+_TARGET_ARCH?=	${MACHINE_ARCH}
+
 #
 # Make sure we have an up-to-date make(1). Only world and buildworld
 # should do this as those are the initial targets used for upgrades.
@@ -173,8 +205,7 @@ cleanworld:
 #
 
 ${TGTS}:
-	${_+_}@cd ${.CURDIR}; \
-		${_MAKE} ${.TARGET}
+	${_+_}cd ${.CURDIR}; ${_MAKE} TARGET=${_TARGET} TARGET_ARCH=${_TARGET_ARCH} ${.TARGET}
 
 # Set a reasonable default
 .MAIN:	all

Modified: projects/binutils-2.17/Makefile.inc1
==============================================================================
--- projects/binutils-2.17/Makefile.inc1	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/Makefile.inc1	Wed Feb  2 19:20:20 2011	(r218200)
@@ -116,32 +116,6 @@ VERSION!=	uname -srp
 VERSION+=	${OSRELDATE}
 .endif
 
-# Guess machine architecture from machine type, and vice versa.
-.if !defined(TARGET_ARCH) && defined(TARGET)
-TARGET_ARCH=	${TARGET:S/pc98/i386/:S/sun4v/sparc64/:S/mips/mipsel/}
-.elif !defined(TARGET) && defined(TARGET_ARCH) && \
-    ${TARGET_ARCH} != ${MACHINE_ARCH}
-TARGET=		${TARGET_ARCH:C/mips.*e[lb]/mips/:C/armeb/arm/}
-.endif
-# Legacy names, for a transition period mips:mips -> mipsel:mips
-.if defined(TARGET) && defined(TARGET_ARCH) && \
-    ${TARGET_ARCH} == "mips" && ${TARGET} == "mips"
-.warning "TARGET_ARCH of mips is deprecated in favor of mipsel or mipseb"
-.if defined(TARGET_BIG_ENDIAN)
-TARGET_ARCH=mipseb
-.else
-TARGET_ARCH=mipsel
-.endif
-.endif
-# arm with TARGET_BIG_ENDIAN -> armeb
-.if defined(TARGET_ARCH) && ${TARGET_ARCH} == "arm" && defined(TARGET_BIG_ENDIAN)
-.warning "TARGET_ARCH of arm with TARGET_BIG_ENDIAN is deprecated.  use armeb"
-TARGET_ARCH=armeb
-.endif
-# Otherwise, default to current machine type and architecture.
-TARGET?=	${MACHINE}
-TARGET_ARCH?=	${MACHINE_ARCH}
-
 KNOWN_ARCHES?=	amd64 arm armeb/arm i386 i386/pc98 ia64 mipsel/mips mipseb/mips mips64el/mips mips64eb/mips mipsn32el/mips mipsn32eb/mips powerpc powerpc64/powerpc sparc64 sparc64/sun4v
 .if ${TARGET} == ${TARGET_ARCH}
 _t=		${TARGET}

Modified: projects/binutils-2.17/bin/sh/jobs.c
==============================================================================
--- projects/binutils-2.17/bin/sh/jobs.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/bin/sh/jobs.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -1056,13 +1056,13 @@ dowait(int block, struct job *job)
 			}
 		if (sig > 0 && sig != SIGINT && sig != SIGPIPE) {
 			if (sig < sys_nsig && sys_siglist[sig])
-				out1str(sys_siglist[sig]);
+				out2str(sys_siglist[sig]);
 			else
-				out1fmt("Signal %d", sig);
+				outfmt(out2, "Signal %d", sig);
 			if (coredump)
-				out1str(" (core dumped)");
-			out1c('\n');
-			flushout(out1);
+				out2str(" (core dumped)");
+			out2c('\n');
+			flushout(out2);
 		}
 	} else {
 		TRACE(("Not printing status, rootshell=%d, job=%p\n", rootshell, job));

Modified: projects/binutils-2.17/contrib/top/display.c
==============================================================================
--- projects/binutils-2.17/contrib/top/display.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/contrib/top/display.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -447,12 +447,14 @@ for (cpu = 0; cpu < num_cpus; cpu++) {
     /* print tag and bump lastline */
     if (num_cpus == 1)
 	printf("\nCPU: ");
-    else
-	printf("\nCPU %d: ", cpu);
+    else {
+	value = printf("\nCPU %d: ", cpu);
+	while (value++ <= cpustates_column)
+		printf(" ");
+    }
     lastline++;
 
     /* now walk thru the names and print the line */
-    Move_to(cpustates_column, y_cpustates + cpu);
     while ((thisname = *names++) != NULL)
     {
 	if (*thisname != '\0')
@@ -532,7 +534,7 @@ z_cpustates()
     register char **names;
     register char *thisname;
     register int *lp;
-    int cpu;
+    int cpu, value;
 
 for (cpu = 0; cpu < num_cpus; cpu++) {
     names = cpustate_names;
@@ -540,11 +542,13 @@ for (cpu = 0; cpu < num_cpus; cpu++) {
     /* show tag and bump lastline */
     if (num_cpus == 1)
 	printf("\nCPU: ");
-    else
-	printf("\nCPU %d: ", cpu);
+    else {
+	value = printf("\nCPU %d: ", cpu);
+	while (value++ <= cpustates_column)
+		printf(" ");
+    }
     lastline++;
 
-    Move_to(cpustates_column, y_cpustates + cpu);
     while ((thisname = *names++) != NULL)
     {
 	if (*thisname != '\0')

Modified: projects/binutils-2.17/contrib/tzdata/australasia
==============================================================================
--- projects/binutils-2.17/contrib/tzdata/australasia	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/contrib/tzdata/australasia	Wed Feb  2 19:20:20 2011	(r218200)
@@ -1,5 +1,5 @@
 # 
-# @(#)australasia	8.20
+# @(#)australasia	8.22
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -84,14 +84,13 @@ Rule	AS	1986	only	-	Oct	19	2:00s	1:00	-
 Rule	AS	1987	2007	-	Oct	lastSun	2:00s	1:00	-
 Rule	AS	1972	only	-	Feb	27	2:00s	0	-
 Rule	AS	1973	1985	-	Mar	Sun>=1	2:00s	0	-
-Rule	AS	1986	1989	-	Mar	Sun>=15	2:00s	0	-
-Rule	AS	1990	only	-	Mar	Sun>=18	2:00s	0	-
-Rule	AS	1991	only	-	Mar	Sun>=1	2:00s	0	-
-Rule	AS	1992	only	-	Mar	Sun>=18	2:00s	0	-
-Rule	AS	1993	only	-	Mar	Sun>=1	2:00s	0	-
-Rule	AS	1994	only	-	Mar	Sun>=18	2:00s	0	-
+Rule	AS	1986	1990	-	Mar	Sun>=15	2:00s	0	-
+Rule	AS	1991	only	-	Mar	3	2:00s	0	-
+Rule	AS	1992	only	-	Mar	22	2:00s	0	-
+Rule	AS	1993	only	-	Mar	7	2:00s	0	-
+Rule	AS	1994	only	-	Mar	20	2:00s	0	-
 Rule	AS	1995	2005	-	Mar	lastSun	2:00s	0	-
-Rule	AS	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AS	2006	only	-	Apr	2	2:00s	0	-
 Rule	AS	2007	only	-	Mar	lastSun	2:00s	0	-
 Rule	AS	2008	max	-	Apr	Sun>=1	2:00s	0	-
 Rule	AS	2008	max	-	Oct	Sun>=1	2:00s	1:00	-

Modified: projects/binutils-2.17/contrib/tzdata/northamerica
==============================================================================
--- projects/binutils-2.17/contrib/tzdata/northamerica	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/contrib/tzdata/northamerica	Wed Feb  2 19:20:20 2011	(r218200)
@@ -1,5 +1,5 @@
 # 
-# @(#)northamerica	8.34
+# %W%
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -471,20 +471,50 @@ Zone America/Adak	 12:13:21 -	LMT	1867 O
 #  three votes for and one against."
 
 # Hawaii
-#
-# From Arthur David Olson:
-# And then there's Hawaii.
-# DST was observed for one day in 1933;
-# standard time was changed by half an hour in 1947;
-# it's always standard as of 1986.
-#
-# From Paul Eggert:
-# Shanks says the 1933 experiment lasted for three weeks.  Go with Shanks.
-#
-Zone Pacific/Honolulu	-10:31:26 -	LMT	1900 Jan  1 12:00
-			-10:30	-	HST	1933 Apr 30 2:00
-			-10:30	1:00	HDT	1933 May 21 2:00
-			-10:30	US	H%sT	1947 Jun  8 2:00
+
+# From Arthur David Olson (2010-12-09):
+# "Hawaiian Time" by Robert C. Schmitt and Doak C. Cox appears on pages 207-225
+# of volume 26 of The Hawaiian Journal of History (1992). As of 2010-12-09,
+# the article is available at
+# 
+# http://evols.library.manoa.hawaii.edu/bitstream/10524/239/2/JL26215.pdf
+# 
+# and indicates that standard time was adopted effective noon, January
+# 13, 1896 (page 218), that in "1933, the Legislature decreed daylight
+# saving for the period between the last Sunday of each April and the
+# last Sunday of each September, but less than a month later repealed the
+# act," (page 220), that year-round daylight saving time was in effect
+# from 1942-02-09 to 1945-09-30 (page 221, with no time of day given for
+# when clocks changed) and that clocks were changed by 30 minutes
+# effective the second Sunday of June, 1947 (page 219, with no time of
+# day given for when clocks changed). A footnote for the 1933 changes
+# cites Session Laws of Hawaii 1933, "Act. 90 (approved 26 Apr. 1933)
+# and Act 163 (approved 21 May 1933)."
+
+# From Arthur David Olson (2011-01-19):
+# The following is from "Laws of the Territory of Hawaii Passed by the
+# Seventeenth Legislature: Regular Session 1933," available (as of
+# 2011-01-19) at American University's Pence Law Library. Page 85: "Act
+# 90...At 2 o'clock ante meridian of the last Sunday in April of each
+# year, the standard time of this Territory shall be advanced one
+# hour...This Act shall take effect upon its approval. Approved this 26th
+# day of April, A. D. 1933. LAWRENCE M JUDD, Governor of the Territory of
+# Hawaii." Page 172:  "Act 163...Act 90 of the Session Laws of 1933 is
+# hereby repealed...This Act shall take effect upon its approval, upon
+# which date the standard time of this Territory shall be restored to
+# that existing immediately prior to the taking effect of said Act 90.
+# Approved this 21st day of May, A. D. 1933. LAWRENCE M. JUDD, Governor
+# of the Territory of Hawaii."
+#
+# Note that 1933-05-21 was a Sunday.
+# We're left to guess the time of day when Act 163 was approved; guess noon.
+
+Zone Pacific/Honolulu	-10:31:26 -	LMT	1896 Jan 13 12:00 #Schmitt&Cox
+			-10:30	-	HST	1933 Apr 30 2:00 #Laws 1933
+			-10:30	1:00	HDT	1933 May 21 12:00 #Laws 1933+12
+			-10:30	-	HST	1942 Feb 09 2:00 #Schmitt&Cox+2
+			-10:30	1:00	HDT	1945 Sep 30 2:00 #Schmitt&Fox+2
+			-10:30	US	H%sT	1947 Jun  8 2:00 #Schmitt&Fox+2
 			-10:00	-	HST
 
 # Now we turn to US areas that have diverged from the consensus since 1970.

Modified: projects/binutils-2.17/etc/ftpusers
==============================================================================
--- projects/binutils-2.17/etc/ftpusers	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/etc/ftpusers	Wed Feb  2 19:20:20 2011	(r218200)
@@ -20,6 +20,7 @@ _dhcp
 uucp
 pop
 www
+hast
 nobody
 mailnull
 smmsp

Modified: projects/binutils-2.17/etc/group
==============================================================================
--- projects/binutils-2.17/etc/group	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/etc/group	Wed Feb  2 19:20:20 2011	(r218200)
@@ -27,5 +27,6 @@ dialer:*:68:
 network:*:69:
 audit:*:77:
 www:*:80:
+hast:*:845:
 nogroup:*:65533:
 nobody:*:65534:

Modified: projects/binutils-2.17/etc/mail/aliases
==============================================================================
--- projects/binutils-2.17/etc/mail/aliases	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/etc/mail/aliases	Wed Feb  2 19:20:20 2011	(r218200)
@@ -30,6 +30,7 @@ bin:	root
 bind:	root
 daemon:	root
 games:	root
+hast:	root
 kmem:	root
 mailnull: postmaster
 man:	root

Modified: projects/binutils-2.17/etc/master.passwd
==============================================================================
--- projects/binutils-2.17/etc/master.passwd	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/etc/master.passwd	Wed Feb  2 19:20:20 2011	(r218200)
@@ -20,4 +20,5 @@ _dhcp:*:65:65::0:0:dhcp programs:/var/em
 uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/local/libexec/uucp/uucico
 pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
 www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
+hast:*:845:845::0:0:HAST unprivileged user:/var/empty:/usr/sbin/nologin
 nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin

Modified: projects/binutils-2.17/etc/rc.d/rpcbind
==============================================================================
--- projects/binutils-2.17/etc/rc.d/rpcbind	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/etc/rc.d/rpcbind	Wed Feb  2 19:20:20 2011	(r218200)
@@ -13,5 +13,7 @@ name="rpcbind"
 rcvar=`set_rcvar`
 command="/usr/sbin/${name}"
 
+stop_postcmd='/bin/rm -f /var/run/rpcbind.*'
+
 load_rc_config $name
 run_rc_command "$1"

Modified: projects/binutils-2.17/gnu/lib/libgomp/Makefile
==============================================================================
--- projects/binutils-2.17/gnu/lib/libgomp/Makefile	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/gnu/lib/libgomp/Makefile	Wed Feb  2 19:20:20 2011	(r218200)
@@ -47,14 +47,14 @@ gstdint.h:
 CLEANFILES+= gstdint.h
 
 .for HFILE in libgomp_f.h omp.h omp_lib.h
-${HFILE}: ${SRCDIR}/${HFILE}.in
+${HFILE}: ${SRCDIR}/${HFILE}.in ${.CURDIR}/Makefile
 	sed -e 's/@OMP_LOCK_ALIGN@/${OMP_LOCK_ALIGN}/g' \
 	    -e 's/@OMP_LOCK_KIND@/${OMP_LOCK_KIND}/g' \
 	    -e 's/@OMP_LOCK_SIZE@/${OMP_LOCK_SIZE}/g' \
 	    -e 's/@OMP_NEST_LOCK_ALIGN@/${OMP_NEST_LOCK_ALIGN}/g' \
 	    -e 's/@OMP_NEST_LOCK_KIND@/${OMP_NEST_LOCK_KIND}/g' \
 	    -e 's/@OMP_NEST_LOCK_SIZE@/${OMP_NEST_LOCK_SIZE}/g' \
-	    < ${.ALLSRC} > ${.TARGET}
+	    < ${SRCDIR}/${HFILE}.in > ${.TARGET}
 CLEANFILES+= ${HFILE}
 .endfor
 

Modified: projects/binutils-2.17/lib/csu/mips/crt1.c
==============================================================================
--- projects/binutils-2.17/lib/csu/mips/crt1.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/lib/csu/mips/crt1.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -83,7 +83,7 @@ __start(char **ap,
 	argv = ap + 1;
 	env  = ap + 2 + argc;
 	environ = env;
-	if(argc > 0 && argv[0] != NULL) {
+	if (argc > 0 && argv[0] != NULL) {
 		const char *s;
 		__progname = argv[0];
 		for (s = __progname; *s != '\0'; s++)

Modified: projects/binutils-2.17/lib/libkvm/kvm.c
==============================================================================
--- projects/binutils-2.17/lib/libkvm/kvm.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/lib/libkvm/kvm.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -454,11 +454,11 @@ again:
 			p->n_other = 0;
 			p->n_desc = 0;
 			if (_kvm_vnet_initialized(kd, initialize) &&
-			    !strcmp(prefix, VNET_SYMPREFIX) == 0)
+			    strcmp(prefix, VNET_SYMPREFIX) == 0)
 				p->n_value =
 				    _kvm_vnet_validaddr(kd, lookup.symvalue);
 			else if (_kvm_dpcpu_initialized(kd, initialize) &&
-			    !strcmp(prefix, DPCPU_SYMPREFIX) == 0)
+			    strcmp(prefix, DPCPU_SYMPREFIX) == 0)
 				p->n_value =
 				    _kvm_dpcpu_validaddr(kd, lookup.symvalue);
 			else

Modified: projects/binutils-2.17/lib/liblzma/config.h
==============================================================================
--- projects/binutils-2.17/lib/liblzma/config.h	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/lib/liblzma/config.h	Wed Feb  2 19:20:20 2011	(r218200)
@@ -66,7 +66,6 @@
 #define SIZEOF_SIZE_T 8
 #define STDC_HEADERS 1
 #define TUKLIB_CPUCORES_SYSCTL 1
-#define TUKLIB_FAST_UNALIGNED_ACCESS 1
 #define TUKLIB_PHYSMEM_SYSCONF 1
 #ifndef _ALL_SOURCE
 # define _ALL_SOURCE 1

Modified: projects/binutils-2.17/libexec/rtld-elf/rtld.c
==============================================================================
--- projects/binutils-2.17/libexec/rtld-elf/rtld.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/libexec/rtld-elf/rtld.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -93,7 +93,6 @@ static void *fill_search_info(const char
 static char *find_library(const char *, const Obj_Entry *);
 static const char *gethints(void);
 static void init_dag(Obj_Entry *);
-static void init_dag1(Obj_Entry *, Obj_Entry *, DoneList *);
 static void init_rtld(caddr_t, Elf_Auxinfo **);
 static void initlist_add_neededs(Needed_Entry *, Objlist *);
 static void initlist_add_objects(Obj_Entry *, Obj_Entry **, Objlist *);
@@ -1331,28 +1330,33 @@ gethints(void)
 static void
 init_dag(Obj_Entry *root)
 {
+    const Needed_Entry *needed;
+    const Objlist_Entry *elm;
     DoneList donelist;
 
     if (root->dag_inited)
 	return;
     donelist_init(&donelist);
-    init_dag1(root, root, &donelist);
-    root->dag_inited = true;
-}
-
-static void
-init_dag1(Obj_Entry *root, Obj_Entry *obj, DoneList *dlp)
-{
-    const Needed_Entry *needed;
 
-    if (donelist_check(dlp, obj))
-	return;
+    /* Root object belongs to own DAG. */
+    objlist_push_tail(&root->dldags, root);
+    objlist_push_tail(&root->dagmembers, root);
+    donelist_check(&donelist, root);
 
-    objlist_push_tail(&obj->dldags, root);
-    objlist_push_tail(&root->dagmembers, obj);
-    for (needed = obj->needed;  needed != NULL;  needed = needed->next)
-	if (needed->obj != NULL)
-	    init_dag1(root, needed->obj, dlp);
+    /*
+     * Add dependencies of root object to DAG in breadth order
+     * by exploiting the fact that each new object get added
+     * to the tail of the dagmembers list.
+     */
+    STAILQ_FOREACH(elm, &root->dagmembers, link) {
+	for (needed = elm->obj->needed; needed != NULL; needed = needed->next) {
+	    if (needed->obj == NULL || donelist_check(&donelist, needed->obj))
+		continue;
+	    objlist_push_tail(&needed->obj->dldags, root);
+	    objlist_push_tail(&root->dagmembers, needed->obj);
+	}
+    }
+    root->dag_inited = true;
 }
 
 /*
@@ -2320,32 +2324,28 @@ do_dlsym(void *handle, const char *name,
 
 	donelist_init(&donelist);
 	if (obj->mainprog) {
-	    /* Search main program and all libraries loaded by it. */
-	    res = symlook_list(&req, &list_main, &donelist);
+            /* Handle obtained by dlopen(NULL, ...) implies global scope. */
+	    res = symlook_global(&req, &donelist);
 	    if (res == 0) {
 		def = req.sym_out;
 		defobj = req.defobj_out;
-	    } else {
-		/*
-		 * We do not distinguish between 'main' object and
-		 * global scope.  If symbol is not defined by objects
-		 * loaded at startup, continue search among
-		 * dynamically loaded objects with RTLD_GLOBAL scope.
-		 */
-		res = symlook_list(&req, &list_global, &donelist);
+	    }
+	    /*
+	     * Search the dynamic linker itself, and possibly resolve the
+	     * symbol from there.  This is how the application links to
+	     * dynamic linker services such as dlopen.
+	     */
+	    if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) {
+		res = symlook_obj(&req, &obj_rtld);
 		if (res == 0) {
 		    def = req.sym_out;
 		    defobj = req.defobj_out;
 		}
 	    }
-	} else {
-	    Needed_Entry fake;
-
+	}
+	else {
 	    /* Search the whole DAG rooted at the given object. */
-	    fake.next = NULL;
-	    fake.obj = (Obj_Entry *)obj;
-	    fake.name = 0;
-	    res = symlook_needed(&req, &fake, &donelist);
+	    res = symlook_list(&req, &obj->dagmembers, &donelist);
 	    if (res == 0) {
 		def = req.sym_out;
 		defobj = req.defobj_out;
@@ -2960,53 +2960,33 @@ symlook_list(SymLook *req, const Objlist
 }
 
 /*
- * Search the symbol table of a shared object and all objects needed
- * by it for a symbol of the given name.  Search order is
- * breadth-first.  Returns a pointer to the symbol, or NULL if no
- * definition was found.
+ * Search the chain of DAGS cointed to by the given Needed_Entry
+ * for a symbol of the given name.  Each DAG is scanned completely
+ * before advancing to the next one.  Returns a pointer to the symbol,
+ * or NULL if no definition was found.
  */
 static int
 symlook_needed(SymLook *req, const Needed_Entry *needed, DoneList *dlp)
 {
-    const Elf_Sym *def, *def_w;
+    const Elf_Sym *def;
     const Needed_Entry *n;
-    const Obj_Entry *defobj, *defobj1;
+    const Obj_Entry *defobj;
     SymLook req1;
     int res;
 
-    def = def_w = NULL;
+    def = NULL;
     defobj = NULL;
     symlook_init_from_req(&req1, req);
     for (n = needed; n != NULL; n = n->next) {
-	if (n->obj == NULL || donelist_check(dlp, n->obj) ||
-	    (res = symlook_obj(&req1, n->obj)) != 0)
+	if (n->obj == NULL ||
+	    (res = symlook_list(&req1, &n->obj->dagmembers, dlp)) != 0)
 	    continue;
-	def = req1.sym_out;
-	defobj = req1.defobj_out;
-	if (ELF_ST_BIND(def->st_info) != STB_WEAK) {
-	    req->defobj_out = defobj;
-	    req->sym_out = def;
-	    return (0);
-	}
-    }
-    /*
-     * There we come when either symbol definition is not found in
-     * directly needed objects, or found symbol is weak.
-     */
-    for (n = needed; n != NULL; n = n->next) {
-	if (n->obj == NULL)
-	    continue;
-	res = symlook_needed(&req1, n->obj->needed, dlp);
-	if (res != 0)
-	    continue;
-	def_w = req1.sym_out;
-	defobj1 = req1.defobj_out;
-	if (def == NULL || ELF_ST_BIND(def_w->st_info) != STB_WEAK) {
-	    def = def_w;
-	    defobj = defobj1;
+	if (def == NULL || ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK) {
+	    def = req1.sym_out;
+	    defobj = req1.defobj_out;
+	    if (ELF_ST_BIND(def->st_info) != STB_WEAK)
+		break;
 	}
-	if (ELF_ST_BIND(def_w->st_info) != STB_WEAK)
-	    break;
     }
     if (def != NULL) {
 	req->sym_out = def;
@@ -3724,10 +3704,17 @@ locate_dependency(const Obj_Entry *obj, 
     }
 
     for (needed = obj->needed;  needed != NULL;  needed = needed->next) {
-	if (needed->obj == NULL)
-	    continue;
-	if (object_match_name(needed->obj, name))
-	    return needed->obj;
+	if (strcmp(obj->strtab + needed->name, name) == 0 ||
+	  (needed->obj != NULL && object_match_name(needed->obj, name))) {
+	    /*
+	     * If there is DT_NEEDED for the name we are looking for,
+	     * we are all set.  Note that object might not be found if
+	     * dependency was not loaded yet, so the function can
+	     * return NULL here.  This is expected and handled
+	     * properly by the caller.
+	     */
+	    return (needed->obj);
+	}
     }
     _rtld_error("%s: Unexpected inconsistency: dependency %s not found",
 	obj->path, name);
@@ -3853,6 +3840,8 @@ rtld_verify_object_versions(Obj_Entry *o
     vn = obj->verneed;
     while (vn != NULL) {
 	depobj = locate_dependency(obj, obj->strtab + vn->vn_file);
+	if (depobj == NULL)
+	    return (-1);
 	vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
 	for (;;) {
 	    if (check_object_provided_version(obj, depobj, vna))

Modified: projects/binutils-2.17/sbin/hastd/hast.h
==============================================================================
--- projects/binutils-2.17/sbin/hastd/hast.h	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/sbin/hastd/hast.h	Wed Feb  2 19:20:20 2011	(r218200)
@@ -81,6 +81,7 @@
 #define	HIO_FLUSH		4
 #define	HIO_KEEPALIVE		5
 
+#define	HAST_USER	"hast"
 #define	HAST_TIMEOUT	5
 #define	HAST_CONFIG	"/etc/hast.conf"
 #define	HAST_CONTROL	"/var/run/hastctl"

Modified: projects/binutils-2.17/sbin/hastd/hastd.c
==============================================================================
--- projects/binutils-2.17/sbin/hastd/hastd.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/sbin/hastd/hastd.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2009-2010 The FreeBSD Foundation
- * Copyright (c) 2010 Pawel Jakub Dawidek 
+ * Copyright (c) 2010-2011 Pawel Jakub Dawidek 
  * All rights reserved.
  *
  * This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -34,9 +34,9 @@ __FBSDID("$FreeBSD$");
 #include 
 #include 
 #include 
+#include 
 #include 
 
-#include 
 #include 
 #include 
 #include 
@@ -93,6 +93,172 @@ g_gate_load(void)
 	}
 }
 
+void
+descriptors_cleanup(struct hast_resource *res)
+{
+	struct hast_resource *tres;
+
+	TAILQ_FOREACH(tres, &cfg->hc_resources, hr_next) {
+		if (tres == res) {
+			PJDLOG_VERIFY(res->hr_role == HAST_ROLE_SECONDARY ||
+			    (res->hr_remotein == NULL &&
+			     res->hr_remoteout == NULL));
+			continue;
+		}
+		if (tres->hr_remotein != NULL)
+			proto_close(tres->hr_remotein);
+		if (tres->hr_remoteout != NULL)
+			proto_close(tres->hr_remoteout);
+	}
+	if (cfg->hc_controlin != NULL)
+		proto_close(cfg->hc_controlin);
+	proto_close(cfg->hc_controlconn);
+	proto_close(cfg->hc_listenconn);
+	(void)pidfile_close(pfh);
+	hook_fini();
+	pjdlog_fini();
+}
+
+static const char *
+dtype2str(mode_t mode)
+{
+
+	if (S_ISBLK(mode))
+		return ("block device");
+	else if (S_ISCHR(mode)) 
+		return ("character device");
+	else if (S_ISDIR(mode)) 
+		return ("directory");
+	else if (S_ISFIFO(mode))
+		return ("pipe or FIFO");
+	else if (S_ISLNK(mode)) 
+		return ("symbolic link");
+	else if (S_ISREG(mode)) 
+		return ("regular file");
+	else if (S_ISSOCK(mode))
+		return ("socket");
+	else if (S_ISWHT(mode)) 
+		return ("whiteout");
+	else
+		return ("unknown");
+}
+
+void
+descriptors_assert(const struct hast_resource *res, int pjdlogmode)
+{
+	char msg[256];
+	struct stat sb;
+	long maxfd;
+	bool isopen;
+	mode_t mode;
+	int fd;
+
+	/*
+	 * At this point descriptor to syslog socket is closed, so if we want
+	 * to log assertion message, we have to first store it in 'msg' local
+	 * buffer and then open syslog socket and log it.
+	 */
+	msg[0] = '\0';
+
+	maxfd = sysconf(_SC_OPEN_MAX);
+	if (maxfd < 0) {
+		pjdlog_errno(LOG_WARNING, "sysconf(_SC_OPEN_MAX) failed");
+		maxfd = 16384;
+	}
+	for (fd = 0; fd <= maxfd; fd++) {
+		if (fstat(fd, &sb) == 0) {
+			isopen = true;
+			mode = sb.st_mode;
+		} else if (errno == EBADF) {
+			isopen = false;
+			mode = 0;
+		} else {
+			isopen = true;	/* silence gcc */
+			mode = 0;	/* silence gcc */
+			snprintf(msg, sizeof(msg),
+			    "Unable to fstat descriptor %d: %s", fd,
+			    strerror(errno));
+		}
+		if (fd == STDIN_FILENO || fd == STDOUT_FILENO ||
+		    fd == STDERR_FILENO) {
+			if (!isopen) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (%s) is closed, but should be open.",
+				    fd, (fd == STDIN_FILENO ? "stdin" :
+				    (fd == STDOUT_FILENO ? "stdout" : "stderr")));
+				break;
+			}
+		} else if (fd == proto_descriptor(res->hr_event)) {
+			if (!isopen) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (event) is closed, but should be open.",
+				    fd);
+				break;
+			}
+			if (!S_ISSOCK(mode)) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (event) is %s, but should be %s.",
+				    fd, dtype2str(mode), dtype2str(S_IFSOCK));
+				break;
+			}
+		} else if (fd == proto_descriptor(res->hr_ctrl)) {
+			if (!isopen) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (ctrl) is closed, but should be open.",
+				    fd);
+				break;
+			}
+			if (!S_ISSOCK(mode)) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (ctrl) is %s, but should be %s.",
+				    fd, dtype2str(mode), dtype2str(S_IFSOCK));
+				break;
+			}
+		} else if (res->hr_role == HAST_ROLE_SECONDARY &&
+		    fd == proto_descriptor(res->hr_remotein)) {
+			if (!isopen) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (remote in) is closed, but should be open.",
+				    fd);
+				break;
+			}
+			if (!S_ISSOCK(mode)) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (remote in) is %s, but should be %s.",
+				    fd, dtype2str(mode), dtype2str(S_IFSOCK));
+				break;
+			}
+		} else if (res->hr_role == HAST_ROLE_SECONDARY &&
+		    fd == proto_descriptor(res->hr_remoteout)) {
+			if (!isopen) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (remote out) is closed, but should be open.",
+				    fd);
+				break;
+			}
+			if (!S_ISSOCK(mode)) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d (remote out) is %s, but should be %s.",
+				    fd, dtype2str(mode), dtype2str(S_IFSOCK));
+				break;
+			}
+		} else {
+			if (isopen) {
+				snprintf(msg, sizeof(msg),
+				    "Descriptor %d is open (%s), but should be closed.",
+				    fd, dtype2str(mode));
+				break;
+			}
+		}
+	}
+	if (msg[0] != '\0') {
+		pjdlog_init(pjdlogmode);
+		pjdlog_prefix_set("[%s] (%s) ", res->hr_name,
+		    role2str(res->hr_role));
+		PJDLOG_ABORT("%s", msg);
+	}
+}
+
 static void
 child_exit_log(unsigned int pid, int status)
 {
@@ -161,7 +327,7 @@ resource_needs_restart(const struct hast
     const struct hast_resource *res1)
 {
 
-	assert(strcmp(res0->hr_name, res1->hr_name) == 0);
+	PJDLOG_ASSERT(strcmp(res0->hr_name, res1->hr_name) == 0);
 
 	if (strcmp(res0->hr_provname, res1->hr_provname) != 0)
 		return (true);
@@ -186,9 +352,9 @@ resource_needs_reload(const struct hast_
     const struct hast_resource *res1)
 {
 
-	assert(strcmp(res0->hr_name, res1->hr_name) == 0);
-	assert(strcmp(res0->hr_provname, res1->hr_provname) == 0);
-	assert(strcmp(res0->hr_localpath, res1->hr_localpath) == 0);
+	PJDLOG_ASSERT(strcmp(res0->hr_name, res1->hr_name) == 0);
+	PJDLOG_ASSERT(strcmp(res0->hr_provname, res1->hr_provname) == 0);
+	PJDLOG_ASSERT(strcmp(res0->hr_localpath, res1->hr_localpath) == 0);
 
 	if (res0->hr_role != HAST_ROLE_PRIMARY)
 		return (false);
@@ -210,7 +376,7 @@ resource_reload(const struct hast_resour
 	struct nv *nvin, *nvout;
 	int error;
 
-	assert(res->hr_role == HAST_ROLE_PRIMARY);
+	PJDLOG_ASSERT(res->hr_role == HAST_ROLE_PRIMARY);
 
 	nvout = nv_alloc();
 	nv_add_uint8(nvout, HASTCTL_RELOAD, "cmd");
@@ -357,7 +523,7 @@ hastd_reload(void)
 			if (strcmp(cres->hr_name, nres->hr_name) == 0)
 				break;
 		}
-		assert(cres != NULL);
+		PJDLOG_ASSERT(cres != NULL);
 		if (resource_needs_restart(cres, nres)) {
 			pjdlog_info("Resource %s configuration was modified, restarting it.",
 			    cres->hr_name);
@@ -533,10 +699,10 @@ listen_accept(void)
 	 * we have to cancel those and accept the new connection.
 	 */
 	if (token == NULL) {
-		assert(res->hr_remoteout == NULL);
+		PJDLOG_ASSERT(res->hr_remoteout == NULL);
 		pjdlog_debug(1, "Initial connection from %s.", raddr);
 		if (res->hr_workerpid != 0) {
-			assert(res->hr_remotein == NULL);
+			PJDLOG_ASSERT(res->hr_remotein == NULL);
 			pjdlog_debug(1,
 			    "Worker process exists (pid=%u), stopping it.",
 			    (unsigned int)res->hr_workerpid);
@@ -676,29 +842,29 @@ main_loop(void)
 				hastd_reload();
 				break;
 			default:
-				assert(!"invalid condition");
+				PJDLOG_ABORT("Unexpected signal (%d).", signo);
 			}
 		}
 
 		/* Setup descriptors for select(2). */
 		FD_ZERO(&rfds);
 		maxfd = fd = proto_descriptor(cfg->hc_controlconn);
-		assert(fd >= 0);
+		PJDLOG_ASSERT(fd >= 0);
 		FD_SET(fd, &rfds);
 		fd = proto_descriptor(cfg->hc_listenconn);
-		assert(fd >= 0);
+		PJDLOG_ASSERT(fd >= 0);
 		FD_SET(fd, &rfds);
 		maxfd = fd > maxfd ? fd : maxfd;
 		TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) {
 			if (res->hr_event == NULL)
 				continue;
 			fd = proto_descriptor(res->hr_event);
-			assert(fd >= 0);
+			PJDLOG_ASSERT(fd >= 0);
 			FD_SET(fd, &rfds);
 			maxfd = fd > maxfd ? fd : maxfd;
 		}
 
-		assert(maxfd + 1 <= (int)FD_SETSIZE);
+		PJDLOG_ASSERT(maxfd + 1 <= (int)FD_SETSIZE);
 		ret = select(maxfd + 1, &rfds, NULL, NULL, &seltimeout);
 		if (ret == 0)
 			hook_check();
@@ -790,7 +956,7 @@ main(int argc, char *argv[])
 	}
 
 	cfg = yy_config_parse(cfgpath, true);
-	assert(cfg != NULL);
+	PJDLOG_ASSERT(cfg != NULL);
 
 	/*
 	 * Restore default actions for interesting signals in case parent

Modified: projects/binutils-2.17/sbin/hastd/hastd.h
==============================================================================
--- projects/binutils-2.17/sbin/hastd/hastd.h	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/sbin/hastd/hastd.h	Wed Feb  2 19:20:20 2011	(r218200)
@@ -43,6 +43,9 @@ extern const char *cfgpath;
 extern bool sigexit_received;
 extern struct pidfh *pfh;
 
+void descriptors_cleanup(struct hast_resource *res);
+void descriptors_assert(const struct hast_resource *res, int pjdlogmode);
+
 void hastd_primary(struct hast_resource *res);
 void hastd_secondary(struct hast_resource *res, struct nv *nvin);
 

Modified: projects/binutils-2.17/sbin/hastd/pjdlog.c
==============================================================================
--- projects/binutils-2.17/sbin/hastd/pjdlog.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/sbin/hastd/pjdlog.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -43,8 +43,7 @@ __FBSDID("$FreeBSD$");
 #include "pjdlog.h"
 
 static bool pjdlog_initialized = false;
-static int pjdlog_mode = PJDLOG_MODE_STD;
-static int pjdlog_debug_level = 0;
+static int pjdlog_mode, pjdlog_debug_level;
 static char pjdlog_prefix[128];
 
 void
@@ -57,6 +56,8 @@ pjdlog_init(int mode)
 	if (mode == PJDLOG_MODE_SYSLOG)
 		openlog(NULL, LOG_PID | LOG_NDELAY, LOG_DAEMON);
 	pjdlog_mode = mode;
+	pjdlog_debug_level = 0;
+	bzero(pjdlog_prefix, sizeof(pjdlog_prefix));
 
 	pjdlog_initialized = true;
 }
@@ -436,10 +437,10 @@ pjdlog_exitx(int exitcode, const char *f
 }
 
 /*
- * Log assertion and exit.
+ * Log failure message and exit.
  */
 void
-pjdlog_verify(const char *func, const char *file, int line,
+pjdlog_abort(const char *func, const char *file, int line,
     const char *failedexpr, const char *fmt, ...)
 {
 	va_list ap;

Modified: projects/binutils-2.17/sbin/hastd/pjdlog.h
==============================================================================
--- projects/binutils-2.17/sbin/hastd/pjdlog.h	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/sbin/hastd/pjdlog.h	Wed Feb  2 19:20:20 2011	(r218200)
@@ -89,22 +89,22 @@ void pjdlogv_exit(int exitcode, const ch
 void pjdlog_exitx(int exitcode, const char *fmt, ...) __printflike(2, 3) __dead2;
 void pjdlogv_exitx(int exitcode, const char *fmt, va_list ap) __printflike(2, 0) __dead2;
 
-void pjdlog_verify(const char *func, const char *file, int line,
-    const char *failedexpr, const char *fmt, ...) __printflike(5, 6);
+void pjdlog_abort(const char *func, const char *file, int line,
+    const char *failedexpr, const char *fmt, ...) __printflike(5, 6) __dead2;
 
 #define	PJDLOG_VERIFY(expr)	do {					\
 	if (!(expr)) {							\
-		pjdlog_verify(__func__, __FILE__, __LINE__, #expr,	\
+		pjdlog_abort(__func__, __FILE__, __LINE__, #expr,	\
 		    __func__);						\
 	}								\
 } while (0)
 #define	PJDLOG_RVERIFY(expr, ...)	do {				\
 	if (!(expr)) {							\
-		pjdlog_verify(__func__, __FILE__, __LINE__, #expr,	\
+		pjdlog_abort(__func__, __FILE__, __LINE__, #expr,	\
 		    __VA_ARGS__);					\
 	}								\
 } while (0)
-#define	PJDLOG_ABORT(...)	pjdlog_verify(__func__, __FILE__,	\
+#define	PJDLOG_ABORT(...)	pjdlog_abort(__func__, __FILE__,	\
 				    __LINE__, NULL, __VA_ARGS__)
 #ifdef NDEBUG
 #define	PJDLOG_ASSERT(expr)	do { } while (0)

Modified: projects/binutils-2.17/sbin/hastd/primary.c
==============================================================================
--- projects/binutils-2.17/sbin/hastd/primary.c	Wed Feb  2 18:44:02 2011	(r218199)
+++ projects/binutils-2.17/sbin/hastd/primary.c	Wed Feb  2 19:20:20 2011	(r218200)
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
 
 #include 
 
-#include 
 #include 
 #include 
 #include 
@@ -266,7 +265,7 @@ primary_exit(int exitcode, const char *f
 {
 	va_list ap;
 
-	assert(exitcode != EX_OK);
+	PJDLOG_ASSERT(exitcode != EX_OK);
 	va_start(ap, fmt);
 	pjdlogv_errno(LOG_ERR, fmt, ap);
 	va_end(ap);
@@ -293,8 +292,8 @@ hast_activemap_flush(struct hast_resourc
 	size_t size;
 
 	buf = activemap_bitmap(res->hr_amp, &size);
-	assert(buf != NULL);
-	assert((size % res->hr_local_sectorsize) == 0);
+	PJDLOG_ASSERT(buf != NULL);
+	PJDLOG_ASSERT((size % res->hr_local_sectorsize) == 0);
 	if (pwrite(res->hr_localfd, buf, size, METADATA_SIZE) !=
 	    (ssize_t)size) {
 		KEEP_ERRNO(pjdlog_errno(LOG_ERR,
@@ -503,8 +502,8 @@ init_remote(struct hast_resource *res, s
 	uint32_t mapsize;
 	size_t size;
 
-	assert((inp == NULL && outp == NULL) || (inp != NULL && outp != NULL));
-	assert(real_remote(res));
+	PJDLOG_ASSERT((inp == NULL && outp == NULL) || (inp != NULL && outp != NULL));
+	PJDLOG_ASSERT(real_remote(res));
 
 	in = out = NULL;
 	errmsg = NULL;
@@ -516,7 +515,7 @@ init_remote(struct hast_resource *res, s
 		    res->hr_remoteaddr);
 	}
 	/* Try to connect, but accept failure. */
-	if (proto_connect(out) < 0) {
+	if (proto_connect(out, HAST_TIMEOUT) < 0) {
 		pjdlog_errno(LOG_WARNING, "Unable to connect to %s",
 		    res->hr_remoteaddr);
 		goto close;
@@ -583,7 +582,7 @@ init_remote(struct hast_resource *res, s
 		    res->hr_remoteaddr);
 	}
 	/* Try to connect, but accept failure. */
-	if (proto_connect(in) < 0) {
+	if (proto_connect(in, HAST_TIMEOUT) < 0) {
 		pjdlog_errno(LOG_WARNING, "Unable to connect to %s",
 		    res->hr_remoteaddr);
 		goto close;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@FreeBSD.ORG  Wed Feb  2 21:49:29 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 C4F621065695;
	Wed,  2 Feb 2011 21:49:29 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id B3AAD8FC17;
	Wed,  2 Feb 2011 21:49:29 +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 p12LnTa3022967;
	Wed, 2 Feb 2011 21:49:29 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p12LnTPs022965;
	Wed, 2 Feb 2011 21:49:29 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102022149.p12LnTPs022965@svn.freebsd.org>
From: Warner Losh 
Date: Wed, 2 Feb 2011 21:49:29 +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: r218204 - 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: Wed, 02 Feb 2011 21:49:29 -0000

Author: imp
Date: Wed Feb  2 21:49:29 2011
New Revision: 218204
URL: http://svn.freebsd.org/changeset/base/218204

Log:
  this comment is stale

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Wed Feb  2 21:48:53 2011	(r218203)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Wed Feb  2 21:49:29 2011	(r218204)
@@ -306,11 +306,6 @@ g_raid_tr_raid1_rebuild_start(struct g_r
 	G_RAID_DEBUG(2, "Kicking off a rebuild at %jd...",
 	    trs->trso_failed_sd->sd_rebuild_pos);
 	trs->trso_type = TR_RAID1_REBUILD;
-/*
- * I'm not sure when to reset this and when to use what's there already.
- * XXX
- */
-//	trs->trso_failed_sd->sd_rebuild_pos = 0;
 	trs->trso_buffer = malloc(SD_REBUILD_SLAB, M_TR_raid1, M_WAITOK);
 	trs->trso_meta_update = SD_REBUILD_META_UPDATE;
 	vol->v_to_arg = trs;

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 07:20:10 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 C57E21065672;
	Thu,  3 Feb 2011 07:20:10 +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 B1F478FC0C;
	Thu,  3 Feb 2011 07:20:10 +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 p137KAx3037097;
	Thu, 3 Feb 2011 07:20:10 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p137KALf037094;
	Thu, 3 Feb 2011 07:20:10 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102030720.p137KALf037094@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 07:20:10 +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: r218209 - projects/graid/7/sys/cam/scsi
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: Thu, 03 Feb 2011 07:20:10 -0000

Author: mav
Date: Thu Feb  3 07:20:10 2011
New Revision: 218209
URL: http://svn.freebsd.org/changeset/base/218209

Log:
  Add files missed in last CAM sync commit.

Added:
  projects/graid/7/sys/cam/scsi/smp_all.c   (contents, props changed)
  projects/graid/7/sys/cam/scsi/smp_all.h   (contents, props changed)

Added: projects/graid/7/sys/cam/scsi/smp_all.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/graid/7/sys/cam/scsi/smp_all.c	Thu Feb  3 07:20:10 2011	(r218209)
@@ -0,0 +1,620 @@
+/*-
+ * Copyright (c) 2010 Spectra Logic Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $Id: //depot/users/kenm/FreeBSD-test/sys/cam/scsi/smp_all.c#4 $
+ */
+
+/*
+ * Serial Management Protocol helper functions.
+ */
+
+#include 
+__FBSDID("$FreeBSD$");
+
+#include 
+#include 
+#ifdef _KERNEL
+#include 
+#include 
+#include 
+#else /* _KERNEL */
+#include 
+#include 
+#include 
+#include 
+#include 
+#endif /* _KERNEL */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#ifndef _KERNEL
+#include 
+#endif
+
+static char *smp_yesno(int val);
+
+static char *
+smp_yesno(int val)
+{
+	char *str;
+
+	if (val)
+		str = "Yes";
+	else
+		str = "No";
+
+	return (str);
+}
+
+struct smp_error_table_entry {
+	uint8_t	function_result;
+	const char *desc;
+};
+
+/* List current as of SPL Revision 7 */
+static struct smp_error_table_entry smp_error_table[] = {
+	{SMP_FR_ACCEPTED, "SMP Function Accepted"},
+	{SMP_FR_UNKNOWN_FUNC, "Unknown SMP Function"},
+	{SMP_FR_FUNCTION_FAILED, "SMP Function Failed"},
+	{SMP_FR_INVALID_REQ_FRAME_LEN, "Invalid Request Frame Length"},
+	{SMP_FR_INVALID_EXP_CHG_CNT, "Invalid Expander Change Count"},
+	{SMP_FR_BUSY, "Busy"},
+	{SMP_FR_INCOMPLETE_DESC_LIST, "Incomplete Descriptor List"},
+	{SMP_FR_PHY_DOES_NOT_EXIST, "Phy Does Not Exist"},
+	{SMP_FR_INDEX_DOES_NOT_EXIST, "Index Does Not Exist"},
+	{SMP_FR_PHY_DOES_NOT_SUP_SATA, "Phy Does Not Support SATA"},
+	{SMP_FR_UNKNOWN_PHY_OP, "Unknown Phy Operation"},
+	{SMP_FR_UNKNOWN_PHY_TEST_FUNC, "Unknown Phy Test Function"},
+	{SMP_FR_PHY_TEST_FUNC_INPROG, "Phy Test Function In Progress"},
+	{SMP_FR_PHY_VACANT, "Phy Vacant"},
+	{SMP_FR_UNKNOWN_PHY_EVENT_SRC, "Unknown Phy Event Source"},
+	{SMP_FR_UNKNOWN_DESC_TYPE, "Unknown Descriptor Type"},
+	{SMP_FR_UNKNOWN_PHY_FILTER, "Unknown Phy Filter"},
+	{SMP_FR_AFFILIATION_VIOLATION, "Affiliation Violation"},
+	{SMP_FR_SMP_ZONE_VIOLATION, "SMP Zone Violation"},
+	{SMP_FR_NO_MGMT_ACCESS_RIGHTS, "No Management Access Rights"},
+	{SMP_FR_UNKNOWN_ED_ZONING_VAL, "Unknown Enable Disable Zoning Value"},
+	{SMP_FR_ZONE_LOCK_VIOLATION, "Zone Lock Violation"},
+	{SMP_FR_NOT_ACTIVATED, "Not Activated"},
+	{SMP_FR_ZG_OUT_OF_RANGE, "Zone Group Out of Range"},
+	{SMP_FR_NO_PHYS_PRESENCE, "No Physical Presence"},
+	{SMP_FR_SAVING_NOT_SUP, "Saving Not Supported"},
+	{SMP_FR_SRC_ZONE_DNE, "Source Zone Group Does Not Exist"},
+	{SMP_FR_DISABLED_PWD_NOT_SUP, "Disabled Password Not Supported"}
+};
+
+const char *
+smp_error_desc(int function_result)
+{
+	int i;
+
+	for (i = 0; i < (sizeof(smp_error_table)/sizeof(smp_error_table[0]));
+	     i++){
+		if (function_result == smp_error_table[i].function_result)
+			return (smp_error_table[i].desc);
+	}
+	return ("Reserved Function Result");
+}
+
+/* List current as of SPL Revision 7 */
+struct smp_cmd_table_entry {
+	uint8_t	cmd_num;
+	const char *desc;
+} smp_cmd_table[] = {
+	{SMP_FUNC_REPORT_GENERAL, "REPORT GENERAL"},
+	{SMP_FUNC_REPORT_MANUF_INFO, "REPORT MANUFACTURER INFORMATION"},
+	{SMP_FUNC_REPORT_SC_STATUS, "REPORT SELF-CONFIGURATION STATUS"},
+	{SMP_FUNC_REPORT_ZONE_PERM_TBL, "REPORT ZONE PERMISSION TABLE"},
+	{SMP_FUNC_REPORT_BROADCAST, "REPORT BROADCAST"},
+	{SMP_FUNC_DISCOVER, "DISCOVER"},
+	{SMP_FUNC_REPORT_PHY_ERR_LOG, "REPORT PHY ERROR LOG"},
+	{SMP_FUNC_REPORT_PHY_SATA, "REPORT PHY SATA"},
+	{SMP_FUNC_REPORT_ROUTE_INFO, "REPORT ROUTE INFORMATION"},
+	{SMP_FUNC_REPORT_PHY_EVENT, "REPORT PHY EVENT"},
+	{SMP_FUNC_DISCOVER_LIST, "DISCOVER LIST"},
+	{SMP_FUNC_REPORT_PHY_EVENT_LIST, "REPORT PHY EVENT LIST"},
+	{SMP_FUNC_REPORT_EXP_RTL, "REPORT EXPANDER ROUTE TABLE LIST"},
+	{SMP_FUNC_CONFIG_GENERAL, "CONFIGURE GENERAL"},
+	{SMP_FUNC_ENABLE_DISABLE_ZONING, "ENABLE DISABLE ZONING"},
+	{SMP_FUNC_ZONED_BROADCAST, "ZONED BROADCAST"},
+	{SMP_FUNC_ZONE_LOCK, "ZONE LOCK"},
+	{SMP_FUNC_ZONE_ACTIVATE, "ZONE ACTIVATE"},
+	{SMP_FUNC_ZONE_UNLOCK, "ZONE UNLOCK"},
+	{SMP_FUNC_CONFIG_ZM_PWD, "CONFIGURE ZONE MANAGER PASSWORD"},
+	{SMP_FUNC_CONFIG_ZONE_PHY_INFO, "CONFIGURE ZONE PHY INFORMATION"},
+	{SMP_FUNC_CONFIG_ZONE_PERM_TBL, "CONFIGURE ZONE PERMISSION TABLE"},
+	{SMP_FUNC_CONFIG_ROUTE_INFO, "CONFIGURE ROUTE INFORMATION"},
+	{SMP_FUNC_PHY_CONTROL, "PHY CONTROL"},
+	{SMP_FUNC_PHY_TEST_FUNC, "PHY TEST FUNCTION"},
+	{SMP_FUNC_CONFIG_PHY_EVENT, "CONFIGURE PHY EVENT"}
+};
+
+const char *
+smp_command_desc(uint8_t cmd_num)
+{
+	int i;
+
+	for (i = 0; i < (sizeof(smp_cmd_table)/sizeof(smp_cmd_table[0])) &&
+	     smp_cmd_table[i].cmd_num <= cmd_num; i++) {
+		if (cmd_num == smp_cmd_table[i].cmd_num)
+			return (smp_cmd_table[i].desc);
+	}
+
+	/*
+	 * 0x40 to 0x7f and 0xc0 to 0xff are the vendor specific SMP
+	 * command ranges.
+	 */
+	if (((cmd_num >= 0x40) && (cmd_num <= 0x7f))
+	 || (cmd_num >= 0xc0)) {
+		return ("Vendor Specific SMP Command");
+	} else {
+		return ("Unknown SMP Command");
+	}
+}
+
+/*
+ * Decode a SMP request buffer into a string of hexadecimal numbers.
+ *
+ * smp_request:    SMP request
+ * request_len:    length of the SMP request buffer, may be reduced if the
+ *                 caller only wants part of the buffer printed
+ * sb:             sbuf(9) buffer
+ * line_prefix:    prefix for new lines, or an empty string ("")
+ * first_line_len: length left on first line
+ * line_len:       total length of subsequent lines, 0 for no additional lines
+ *                 if there are no additional lines, first line will get ...
+ *                 at the end if there is additional data
+ */
+void
+smp_command_decode(uint8_t *smp_request, int request_len, struct sbuf *sb,
+		   char *line_prefix, int first_line_len, int line_len)
+{
+	int i, cur_len;
+
+	for (i = 0, cur_len = first_line_len; i < request_len; i++) {
+		/*
+		 * Each byte takes 3 characters.  As soon as we go less
+		 * than 6 (meaning we have at least 3 and at most 5
+		 * characters left), check to see whether the subsequent
+		 * line length (line_len) is long enough to bother with.
+		 * If the user set it to 0, or some other length that isn't
+		 * enough to hold at least the prefix and one byte, put ...
+		 * on the first line to indicate that there is more data
+		 * and bail out.
+		 */
+		if ((cur_len < 6)
+		 && (line_len < (strlen(line_prefix) + 3))) {
+			sbuf_printf(sb, "...");
+			return;
+		}
+		if (cur_len < 3) {
+			sbuf_printf(sb, "\n%s", line_prefix);
+			cur_len = line_len - strlen(line_prefix);
+		}
+		sbuf_printf(sb, "%02x ", smp_request[i]);
+		cur_len = cur_len - 3;
+	}
+}
+
+void
+smp_command_sbuf(struct ccb_smpio *smpio, struct sbuf *sb,
+		 char *line_prefix, int first_line_len, int line_len)
+{
+	sbuf_printf(sb, "%s. ", smp_command_desc(smpio->smp_request[1]));
+
+	/*
+	 * Acccount for the command description and the period and space
+	 * after the command description.
+	 */
+	first_line_len -= strlen(smp_command_desc(smpio->smp_request[1])) + 2;
+
+	smp_command_decode(smpio->smp_request, smpio->smp_request_len, sb,
+			   line_prefix, first_line_len, line_len);
+}
+
+/*
+ * Print SMP error output.  For userland commands, we need the cam_device
+ * structure so we can get the path information from the CCB.
+ */
+#ifdef _KERNEL
+void
+smp_error_sbuf(struct ccb_smpio *smpio, struct sbuf *sb)
+#else /* !_KERNEL*/
+void
+smp_error_sbuf(struct cam_device *device, struct ccb_smpio *smpio,
+	       struct sbuf *sb)
+#endif /* _KERNEL/!_KERNEL */
+{
+	char path_str[64];
+
+#ifdef _KERNEL
+	xpt_path_string(smpio->ccb_h.path, path_str, sizeof(path_str));
+#else
+	cam_path_string(device, path_str, sizeof(path_str));
+#endif
+	smp_command_sbuf(smpio, sb, path_str, 80 - strlen(path_str), 80);
+	sbuf_printf(sb, "\n");
+
+	sbuf_cat(sb, path_str);
+	sbuf_printf(sb, "SMP Error: %s (0x%x)\n",
+		    smp_error_desc(smpio->smp_response[2]),
+		    smpio->smp_response[2]);
+}
+
+/*
+ * Decode the SMP REPORT GENERAL response.  The format is current as of SPL
+ * Revision 7, but the parsing should be backward compatible for older
+ * versions of the spec.
+ */
+void
+smp_report_general_sbuf(struct smp_report_general_response *response,
+			int response_len, struct sbuf *sb)
+{
+	sbuf_printf(sb, "Report General\n");
+	sbuf_printf(sb, "Response Length: %d words (%d bytes)\n",
+		    response->response_len,
+		    response->response_len * SMP_WORD_LEN);
+	sbuf_printf(sb, "Expander Change Count: %d\n",
+		    scsi_2btoul(response->expander_change_count));
+	sbuf_printf(sb, "Expander Route Indexes: %d\n", 
+		    scsi_2btoul(response->expander_route_indexes));
+	sbuf_printf(sb, "Long Response: %s\n",
+		    smp_yesno(response->long_response &
+			      SMP_RG_LONG_RESPONSE));
+	sbuf_printf(sb, "Number of Phys: %d\n", response->num_phys);
+	sbuf_printf(sb, "Table to Table Supported: %s\n",
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_TABLE_TO_TABLE_SUP));
+	sbuf_printf(sb, "Zone Configuring: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_ZONE_CONFIGURING));
+	sbuf_printf(sb, "Self Configuring: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_SELF_CONFIGURING));
+	sbuf_printf(sb, "STP Continue AWT: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_STP_CONTINUE_AWT));
+	sbuf_printf(sb, "Open Reject Retry Supported: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_OPEN_REJECT_RETRY_SUP));
+	sbuf_printf(sb, "Configures Others: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_CONFIGURES_OTHERS));
+	sbuf_printf(sb, "Configuring: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_CONFIGURING));
+	sbuf_printf(sb, "Externally Configurable Route Table: %s\n", 
+		    smp_yesno(response->config_bits0 &
+		    SMP_RG_CONFIGURING));
+	sbuf_printf(sb, "Enclosure Logical Identifier: 0x%016jx\n",
+		    (uintmax_t)scsi_8btou64(response->encl_logical_id));
+
+	/*
+	 * If the response->response_len is 0, then we don't have the
+	 * extended information.  Also, if the user didn't allocate enough
+	 * space for the full request, don't try to parse it.
+	 */
+	if ((response->response_len == 0)
+	 || (response_len < (sizeof(struct smp_report_general_response) -
+	     sizeof(response->crc))))
+		return;
+
+	sbuf_printf(sb, "STP Bus Inactivity Time Limit: %d\n",
+		    scsi_2btoul(response->stp_bus_inact_time_limit));
+	sbuf_printf(sb, "STP Maximum Connect Time Limit: %d\n",
+		    scsi_2btoul(response->stp_max_conn_time_limit));
+	sbuf_printf(sb, "STP SMP I_T Nexus Loss Time: %d\n",
+		    scsi_2btoul(response->stp_smp_it_nexus_loss_time));
+
+	sbuf_printf(sb, "Number of Zone Groups: %d\n",
+		    (response->config_bits1 & SMP_RG_NUM_ZONE_GROUPS_MASK) >>
+		    SMP_RG_NUM_ZONE_GROUPS_SHIFT);
+	sbuf_printf(sb, "Zone Locked: %s\n",
+		    smp_yesno(response->config_bits1 & SMP_RG_ZONE_LOCKED));
+	sbuf_printf(sb, "Physical Presence Supported: %s\n",
+		    smp_yesno(response->config_bits1 & SMP_RG_PP_SUPPORTED));
+	sbuf_printf(sb, "Physical Presence Asserted: %s\n",
+		    smp_yesno(response->config_bits1 & SMP_RG_PP_ASSERTED));
+	sbuf_printf(sb, "Zoning Supported: %s\n",
+		    smp_yesno(response->config_bits1 &
+			      SMP_RG_ZONING_SUPPORTED));
+	sbuf_printf(sb, "Zoning Enabled: %s\n",
+		    smp_yesno(response->config_bits1 & SMP_RG_ZONING_ENABLED));
+
+	sbuf_printf(sb, "Saving: %s\n",
+		    smp_yesno(response->config_bits2 & SMP_RG_SAVING));
+	sbuf_printf(sb, "Saving Zone Manager Password Supported: %s\n",
+		    smp_yesno(response->config_bits2 &
+			      SMP_RG_SAVING_ZM_PWD_SUP));
+	sbuf_printf(sb, "Saving Zone Phy Information Supported: %s\n",
+		    smp_yesno(response->config_bits2 &
+			      SMP_RG_SAVING_PHY_INFO_SUP));
+	sbuf_printf(sb, "Saving Zone Permission Table Supported: %s\n",
+		    smp_yesno(response->config_bits2 &
+			      SMP_RG_SAVING_ZPERM_TAB_SUP));
+	sbuf_printf(sb, "Saving Zoning Enabled Supported: %s\n",
+		    smp_yesno(response->config_bits2 &
+			      SMP_RG_SAVING_ZENABLED_SUP));
+
+	sbuf_printf(sb, "Maximum Number of Routed SAS Addresses: %d\n",
+		    scsi_2btoul(response->max_num_routed_addrs));
+
+	sbuf_printf(sb, "Active Zone Manager SAS Address: 0x%016jx\n",
+		    scsi_8btou64(response->active_zm_address));
+
+	sbuf_printf(sb, "Zone Inactivity Time Limit: %d\n",
+		    scsi_2btoul(response->zone_lock_inact_time_limit));
+
+	sbuf_printf(sb, "First Enclosure Connector Element Index: %d\n",
+		    response->first_encl_conn_el_index);
+
+	sbuf_printf(sb, "Number of Enclosure Connector Element Indexes: %d\n",
+		    response->num_encl_conn_el_indexes);
+
+	sbuf_printf(sb, "Reduced Functionality: %s\n",
+		    smp_yesno(response->reduced_functionality &
+			      SMP_RG_REDUCED_FUNCTIONALITY));
+
+	sbuf_printf(sb, "Time to Reduced Functionality: %d\n",
+		    response->time_to_reduced_func);
+	sbuf_printf(sb, "Initial Time to Reduced Functionality: %d\n",
+		    response->initial_time_to_reduced_func);
+	sbuf_printf(sb, "Maximum Reduced Functionality Time: %d\n",
+		    response->max_reduced_func_time);
+
+	sbuf_printf(sb, "Last Self-Configuration Status Descriptor Index: %d\n",
+		    scsi_2btoul(response->last_sc_stat_desc_index));
+
+	sbuf_printf(sb, "Maximum Number of Storated Self-Configuration "
+		    "Status Descriptors: %d\n",
+		    scsi_2btoul(response->max_sc_stat_descs));
+
+	sbuf_printf(sb, "Last Phy Event List Descriptor Index: %d\n",
+		    scsi_2btoul(response->last_phy_evl_desc_index));
+
+	sbuf_printf(sb, "Maximum Number of Stored Phy Event List "
+		    "Descriptors: %d\n",
+		    scsi_2btoul(response->max_stored_pel_descs));
+
+	sbuf_printf(sb, "STP Reject to Open Limit: %d\n",
+		    scsi_2btoul(response->stp_reject_to_open_limit));
+}
+
+/*
+ * Decode the SMP REPORT MANUFACTURER INFORMATION response.  The format is
+ * current as of SPL Revision 7, but the parsing should be backward
+ * compatible for older versions of the spec.
+ */
+void
+smp_report_manuf_info_sbuf(struct smp_report_manuf_info_response *response,
+			   int response_len, struct sbuf *sb)
+{
+	char vendor[16], product[48], revision[16];
+	char comp_vendor[16];
+
+	sbuf_printf(sb, "Report Manufacturer Information\n");
+	sbuf_printf(sb, "Expander Change count: %d\n",
+		    scsi_2btoul(response->expander_change_count));
+	sbuf_printf(sb, "SAS 1.1 Format: %s\n",
+		    smp_yesno(response->sas_11_format & SMP_RMI_SAS11_FORMAT));
+	cam_strvis(vendor, response->vendor, sizeof(response->vendor),
+		   sizeof(vendor));
+	cam_strvis(product, response->product, sizeof(response->product),
+		   sizeof(product));
+	cam_strvis(revision, response->revision, sizeof(response->revision),
+		   sizeof(revision));
+	sbuf_printf(sb, "<%s %s %s>\n", vendor, product, revision);
+
+	if ((response->sas_11_format & SMP_RMI_SAS11_FORMAT) == 0) {
+		uint8_t *curbyte;
+		int line_start, line_cursor;
+
+		sbuf_printf(sb, "Vendor Specific Data:\n");
+
+		/*
+		 * Print out the bytes roughly in the style of hd(1), but
+		 * without the extra ASCII decoding.  Hexadecimal line
+		 * numbers on the left, and 16 bytes per line, with an
+		 * extra space after the first 8 bytes.
+		 *
+		 * It would be nice if this sort of thing were available
+		 * in a library routine.
+		 */
+		for (curbyte = (uint8_t *)&response->comp_vendor, line_start= 1,
+		     line_cursor = 0; curbyte < (uint8_t *)&response->crc;
+		     curbyte++, line_cursor++) {
+			if (line_start != 0) {
+				sbuf_printf(sb, "%08lx  ",
+					    (unsigned long)(curbyte -
+					    (uint8_t *)response));
+				line_start = 0;
+				line_cursor = 0;
+			}
+			sbuf_printf(sb, "%02x", *curbyte);
+
+			if (line_cursor == 15) {
+				sbuf_printf(sb, "\n");
+				line_start = 1;
+			} else
+				sbuf_printf(sb, " %s", (line_cursor == 7) ?
+					    " " : "");
+		}
+		if (line_cursor != 16)
+			sbuf_printf(sb, "\n");
+		return;
+	}
+
+	cam_strvis(comp_vendor, response->comp_vendor,
+		   sizeof(response->comp_vendor), sizeof(comp_vendor));
+	sbuf_printf(sb, "Component Vendor: %s\n", comp_vendor);
+	sbuf_printf(sb, "Component ID: %#x\n", scsi_2btoul(response->comp_id));
+	sbuf_printf(sb, "Component Revision: %#x\n", response->comp_revision);
+	sbuf_printf(sb, "Vendor Specific: 0x%016jx\n",
+		    (uintmax_t)scsi_8btou64(response->vendor_specific));
+}
+
+/*
+ * Compose a SMP REPORT GENERAL request and put it into a CCB.  This is
+ * current as of SPL Revision 7.
+ */
+void
+smp_report_general(struct ccb_smpio *smpio, uint32_t retries,
+		   void (*cbfcnp)(struct cam_periph *, union ccb *),
+		   struct smp_report_general_request *request, int request_len,
+		   uint8_t *response, int response_len, int long_response,
+		   uint32_t timeout)
+{
+	cam_fill_smpio(smpio,
+		       retries,
+		       cbfcnp,
+		       /*flags*/CAM_DIR_BOTH,
+		       (uint8_t *)request,
+		       request_len - SMP_CRC_LEN,
+		       response,
+		       response_len,
+		       timeout);
+
+	bzero(request, sizeof(*request));
+
+	request->frame_type = SMP_FRAME_TYPE_REQUEST;
+	request->function = SMP_FUNC_REPORT_GENERAL;
+	request->response_len = long_response ? SMP_RG_RESPONSE_LEN : 0;
+	request->request_len = 0;
+}
+
+/*
+ * Compose a SMP DISCOVER request and put it into a CCB.  This is current
+ * as of SPL Revision 7.
+ */
+void
+smp_discover(struct ccb_smpio *smpio, uint32_t retries,
+	     void (*cbfcnp)(struct cam_periph *, union ccb *),
+	     struct smp_discover_request *request, int request_len,
+	     uint8_t *response, int response_len, int long_response,
+	     int ignore_zone_group, int phy, uint32_t timeout)
+{
+	cam_fill_smpio(smpio,
+		       retries,
+		       cbfcnp,
+		       /*flags*/CAM_DIR_BOTH,
+		       (uint8_t *)request,
+		       request_len - SMP_CRC_LEN,
+		       response,
+		       response_len,
+		       timeout);
+
+	bzero(request, sizeof(*request));
+	request->frame_type = SMP_FRAME_TYPE_REQUEST;
+	request->function = SMP_FUNC_DISCOVER;
+	request->response_len = long_response ? SMP_DIS_RESPONSE_LEN : 0;
+	request->request_len = long_response ? SMP_DIS_REQUEST_LEN : 0;
+	if (ignore_zone_group != 0)
+		request->ignore_zone_group |= SMP_DIS_IGNORE_ZONE_GROUP;
+	request->phy = phy;
+}
+
+/*
+ * Compose a SMP REPORT MANUFACTURER INFORMATION request and put it into a
+ * CCB.  This is current as of SPL Revision 7.
+ */
+void
+smp_report_manuf_info(struct ccb_smpio *smpio, uint32_t retries,
+		      void (*cbfcnp)(struct cam_periph *, union ccb *),
+		      struct smp_report_manuf_info_request *request,
+		      int request_len, uint8_t *response, int response_len,
+		      int long_response, uint32_t timeout)
+{
+	cam_fill_smpio(smpio,
+		       retries,
+		       cbfcnp,
+		       /*flags*/CAM_DIR_BOTH,
+		       (uint8_t *)request,
+		       request_len - SMP_CRC_LEN,
+		       response,
+		       response_len,
+		       timeout);
+
+	bzero(request, sizeof(*request));
+
+	request->frame_type = SMP_FRAME_TYPE_REQUEST;
+	request->function = SMP_FUNC_REPORT_MANUF_INFO;
+	request->response_len = long_response ? SMP_RMI_RESPONSE_LEN : 0;
+	request->request_len = long_response ? SMP_RMI_REQUEST_LEN : 0;
+}
+
+/*
+ * Compose a SMP PHY CONTROL request and put it into a CCB.  This is
+ * current as of SPL Revision 7.
+ */
+void
+smp_phy_control(struct ccb_smpio *smpio, uint32_t retries,
+		void (*cbfcnp)(struct cam_periph *, union ccb *),
+		struct smp_phy_control_request *request, int request_len,
+		uint8_t *response, int response_len, int long_response,
+		uint32_t expected_exp_change_count, int phy, int phy_op,
+		int update_pp_timeout_val, uint64_t attached_device_name,
+		int prog_min_prl, int prog_max_prl, int slumber_partial,
+		int pp_timeout_value, uint32_t timeout)
+{
+	cam_fill_smpio(smpio,
+		       retries,
+		       cbfcnp,
+		       /*flags*/CAM_DIR_BOTH,
+		       (uint8_t *)request,
+		       request_len - SMP_CRC_LEN,
+		       response,
+		       response_len,
+		       timeout);
+
+	bzero(request, sizeof(*request));
+
+	request->frame_type = SMP_FRAME_TYPE_REQUEST;
+	request->function = SMP_FUNC_PHY_CONTROL;
+	request->response_len = long_response ? SMP_PC_RESPONSE_LEN : 0;
+	request->request_len = long_response ? SMP_PC_REQUEST_LEN : 0;
+	scsi_ulto2b(expected_exp_change_count, request->expected_exp_chg_cnt);
+	request->phy = phy;
+	request->phy_operation = phy_op;
+
+	if (update_pp_timeout_val != 0)
+		request->update_pp_timeout |= SMP_PC_UPDATE_PP_TIMEOUT;
+
+	scsi_u64to8b(attached_device_name, request->attached_device_name);
+	request->prog_min_phys_link_rate = (prog_min_prl <<
+		SMP_PC_PROG_MIN_PL_RATE_SHIFT) & SMP_PC_PROG_MIN_PL_RATE_MASK;
+	request->prog_max_phys_link_rate = (prog_max_prl <<
+		SMP_PC_PROG_MAX_PL_RATE_SHIFT) & SMP_PC_PROG_MAX_PL_RATE_MASK;
+	request->config_bits0 = slumber_partial;
+	request->pp_timeout_value = pp_timeout_value;
+}
+

Added: projects/graid/7/sys/cam/scsi/smp_all.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/graid/7/sys/cam/scsi/smp_all.h	Thu Feb  3 07:20:10 2011	(r218209)
@@ -0,0 +1,520 @@
+/*-
+ * Copyright (c) 2010 Spectra Logic Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $Id: //depot/users/kenm/FreeBSD-test/sys/cam/scsi/smp_all.h#4 $
+ * $FreeBSD$
+ */
+
+/*
+ * Serial Management Protocol definitions.
+ */
+
+#ifndef	_SCSI_SMP_ALL_H
+#define	_SCSI_SMP_ALL_H	1
+
+#define	SMP_FRAME_TYPE_REQUEST	0x40
+#define	SMP_FRAME_TYPE_RESPONSE	0x41
+#define	SMP_WORD_LEN		4
+#define	SMP_CRC_LEN		4
+
+/*
+ * SMP Functions (current as of SPL Revision 7)
+ */
+/* 0x00 to 0x7f: SMP input functions */
+/* 0x00 to 0x0f: General SMP input functions */
+#define	SMP_FUNC_REPORT_GENERAL		0x00
+#define	SMP_FUNC_REPORT_MANUF_INFO	0x01
+#define	SMP_FUNC_REPORT_SC_STATUS	0x03
+#define	SMP_FUNC_REPORT_ZONE_PERM_TBL	0x04
+#define	SMP_FUNC_REPORT_ZONE_MAN_PWD	0x05
+#define	SMP_FUNC_REPORT_BROADCAST	0x06
+
+/* 0x10 to 0x1f: Phy-based SMP input functions */
+#define	SMP_FUNC_DISCOVER		0x10
+#define	SMP_FUNC_REPORT_PHY_ERR_LOG	0x11
+#define	SMP_FUNC_REPORT_PHY_SATA	0x12
+#define	SMP_FUNC_REPORT_ROUTE_INFO	0x13
+#define	SMP_FUNC_REPORT_PHY_EVENT	0x14
+
+/* 0x20 to 0x2f: Descriptor list-based SMP input functions */
+#define	SMP_FUNC_DISCOVER_LIST		0x20
+#define	SMP_FUNC_REPORT_PHY_EVENT_LIST	0x21
+#define	SMP_FUNC_REPORT_EXP_RTL		0x22
+
+/* 0x30 to 0x3f: Reserved for SMP input functions */
+/* 0x40 to 0x7f: Vendor specific */
+
+/* 0x80 to 0xff: SMP output functions */
+/* 0x80 to 0x8f: General SMP output functions */
+#define	SMP_FUNC_CONFIG_GENERAL		0x80
+#define	SMP_FUNC_ENABLE_DISABLE_ZONING	0x81
+#define	SMP_FUNC_ZONED_BROADCAST	0x85
+#define	SMP_FUNC_ZONE_LOCK		0x86
+#define	SMP_FUNC_ZONE_ACTIVATE		0x87
+#define	SMP_FUNC_ZONE_UNLOCK		0x88
+#define	SMP_FUNC_CONFIG_ZM_PWD		0x89
+#define	SMP_FUNC_CONFIG_ZONE_PHY_INFO	0x8a
+#define	SMP_FUNC_CONFIG_ZONE_PERM_TBL	0x8b
+
+/* 0x90 to 0x9f: Phy-based SMP output functions */
+#define	SMP_FUNC_CONFIG_ROUTE_INFO	0x90
+#define	SMP_FUNC_PHY_CONTROL		0x91
+#define	SMP_FUNC_PHY_TEST_FUNC		0x92
+#define	SMP_FUNC_CONFIG_PHY_EVENT	0x93
+
+/* 0xa0 to 0xbf: Reserved for SMP output functions */
+/* 0xc0 to 0xff: Vendor specific */
+
+/*
+ * Function Results (current as of SPL Revision 7)
+ */
+#define	SMP_FR_ACCEPTED			0x00
+#define	SMP_FR_UNKNOWN_FUNC		0x01
+#define	SMP_FR_FUNCTION_FAILED		0x02
+#define	SMP_FR_INVALID_REQ_FRAME_LEN	0x03
+#define	SMP_FR_INVALID_EXP_CHG_CNT	0x04
+#define	SMP_FR_BUSY			0x05
+#define	SMP_FR_INCOMPLETE_DESC_LIST	0x06
+#define	SMP_FR_PHY_DOES_NOT_EXIST	0x10
+#define	SMP_FR_INDEX_DOES_NOT_EXIST	0x11
+#define	SMP_FR_PHY_DOES_NOT_SUP_SATA	0x12
+#define	SMP_FR_UNKNOWN_PHY_OP		0x13
+#define	SMP_FR_UNKNOWN_PHY_TEST_FUNC	0x14
+#define	SMP_FR_PHY_TEST_FUNC_INPROG	0x15
+#define	SMP_FR_PHY_VACANT		0x16
+#define	SMP_FR_UNKNOWN_PHY_EVENT_SRC	0x17
+#define	SMP_FR_UNKNOWN_DESC_TYPE	0x18
+#define	SMP_FR_UNKNOWN_PHY_FILTER	0x19
+#define	SMP_FR_AFFILIATION_VIOLATION	0x1a
+#define	SMP_FR_SMP_ZONE_VIOLATION	0x20
+#define	SMP_FR_NO_MGMT_ACCESS_RIGHTS	0x21
+#define	SMP_FR_UNKNOWN_ED_ZONING_VAL	0x22
+#define	SMP_FR_ZONE_LOCK_VIOLATION	0x23
+#define	SMP_FR_NOT_ACTIVATED		0x24
+#define	SMP_FR_ZG_OUT_OF_RANGE		0x25
+#define	SMP_FR_NO_PHYS_PRESENCE		0x26
+#define	SMP_FR_SAVING_NOT_SUP		0x27
+#define	SMP_FR_SRC_ZONE_DNE		0x28
+#define	SMP_FR_DISABLED_PWD_NOT_SUP	0x29
+
+/*
+ * REPORT GENERAL request and response, current as of SPL Revision 7.
+ */
+struct smp_report_general_request
+{
+	uint8_t	frame_type;
+	uint8_t	function;
+	uint8_t	response_len;
+	uint8_t	request_len;
+	uint8_t	crc[4];
+};
+
+struct smp_report_general_response
+{
+	uint8_t	frame_type;
+	uint8_t	function;
+	uint8_t	function_result;
+	uint8_t	response_len;
+#define	SMP_RG_RESPONSE_LEN		0x11
+	uint8_t	expander_change_count[2];
+	uint8_t	expander_route_indexes[2];
+	uint8_t	long_response;
+#define	SMP_RG_LONG_RESPONSE		0x80
+	uint8_t	num_phys;
+	uint8_t	config_bits0;
+#define	SMP_RG_TABLE_TO_TABLE_SUP	0x80
+#define	SMP_RG_ZONE_CONFIGURING		0x40
+#define	SMP_RG_SELF_CONFIGURING		0x20
+#define	SMP_RG_STP_CONTINUE_AWT		0x10
+#define	SMP_RG_OPEN_REJECT_RETRY_SUP	0x08
+#define	SMP_RG_CONFIGURES_OTHERS	0x04
+#define	SMP_RG_CONFIGURING		0x02
+#define	SMP_RG_EXT_CONFIG_ROUTE_TABLE	0x01
+	uint8_t	reserved0;
+	uint8_t	encl_logical_id[8];
+	uint8_t	reserved1[8];
+	uint8_t	reserved2[2];
+	uint8_t	stp_bus_inact_time_limit[2];
+	uint8_t	stp_max_conn_time_limit[2];
+	uint8_t	stp_smp_it_nexus_loss_time[2];
+	uint8_t	config_bits1;
+#define	SMP_RG_NUM_ZONE_GROUPS_MASK	0xc0
+#define	SMP_RG_NUM_ZONE_GROUPS_SHIFT	6
+#define	SMP_RG_ZONE_LOCKED		0x10
+#define	SMP_RG_PP_SUPPORTED		0x08
+#define	SMP_RG_PP_ASSERTED		0x04
+#define	SMP_RG_ZONING_SUPPORTED		0x02
+#define	SMP_RG_ZONING_ENABLED		0x01
+	uint8_t	config_bits2;
+#define	SMP_RG_SAVING			0x10
+#define	SMP_RG_SAVING_ZM_PWD_SUP	0x08
+#define	SMP_RG_SAVING_PHY_INFO_SUP	0x04
+#define	SMP_RG_SAVING_ZPERM_TAB_SUP	0x02
+#define	SMP_RG_SAVING_ZENABLED_SUP	0x01
+	uint8_t	max_num_routed_addrs[2];
+	uint8_t	active_zm_address[8];
+	uint8_t	zone_lock_inact_time_limit[2];
+	uint8_t	reserved3[2];
+	uint8_t	reserved4;
+	uint8_t	first_encl_conn_el_index;
+	uint8_t	num_encl_conn_el_indexes;
+	uint8_t	reserved5;
+	uint8_t	reduced_functionality;
+#define	SMP_RG_REDUCED_FUNCTIONALITY	0x80
+	uint8_t	time_to_reduced_func;
+	uint8_t	initial_time_to_reduced_func;
+	uint8_t	max_reduced_func_time;
+	uint8_t	last_sc_stat_desc_index[2];
+	uint8_t	max_sc_stat_descs[2];
+	uint8_t	last_phy_evl_desc_index[2];
+	uint8_t	max_stored_pel_descs[2];
+	uint8_t	stp_reject_to_open_limit[2];
+	uint8_t	reserved6[2];
+	uint8_t	crc[4];
+};
+
+/*
+ * REPORT MANUFACTURER INFORMATION request and response, current as of SPL
+ * Revision 7.
+ */
+struct smp_report_manuf_info_request
+{
+	uint8_t	frame_type;
+	uint8_t	function;
+	uint8_t	response_len;
+	uint8_t	request_len;
+#define	SMP_RMI_REQUEST_LEN		0x00
+	uint8_t	crc[4];
+};
+
+struct smp_report_manuf_info_response
+{
+	uint8_t	frame_type;
+	uint8_t	function;
+	uint8_t	function_result;
+	uint8_t	response_len;
+#define	SMP_RMI_RESPONSE_LEN		0x0e
+	uint8_t	expander_change_count[2];
+	uint8_t	reserved0[2];
+	uint8_t	sas_11_format;
+#define	SMP_RMI_SAS11_FORMAT		0x01
+	uint8_t	reserved1[3];
+	uint8_t	vendor[8];
+	uint8_t	product[16];
+	uint8_t	revision[4];
+	uint8_t	comp_vendor[8];
+	uint8_t	comp_id[2];
+	uint8_t	comp_revision;
+	uint8_t	reserved2;
+	uint8_t	vendor_specific[8];
+	uint8_t	crc[4];
+};
+
+/*
+ * DISCOVER request and response, current as of SPL Revision 7.
+ */
+struct smp_discover_request
+{
+	uint8_t	frame_type;
+	uint8_t	function;
+	uint8_t response_len;
+	uint8_t request_len;
+#define	SMP_DIS_REQUEST_LEN		0x02
+	uint8_t reserved0[4];
+	uint8_t	ignore_zone_group;
+#define	SMP_DIS_IGNORE_ZONE_GROUP	0x01
+	uint8_t	phy;
+	uint8_t	reserved1[2];
+	uint8_t	crc[4];
+};
+
+struct smp_discover_response
+{
+	uint8_t	frame_type;
+	uint8_t	function;
+	uint8_t	function_result;
+	uint8_t	response_len;
+#define	SMP_DIS_RESPONSE_LEN		0x20
+	uint8_t	expander_change_count[2];
+	uint8_t	reserved0[3];
+	uint8_t	phy;
+	uint8_t	reserved1[2];
+	uint8_t	attached_device;
+#define	SMP_DIS_AD_TYPE_MASK		0x70
+#define	SMP_DIS_AD_TYPE_NONE		0x00
+#define	SMP_DIS_AD_TYPE_SAS_SATA	0x10
+#define	SMP_DIS_AD_TYPE_EXP		0x20
+#define	SMP_DIS_AD_TYPE_EXP_OLD		0x30
+#define	SMP_DIS_ATTACH_REASON_MASK	0x0f
+	uint8_t	neg_logical_link_rate;
+#define	SMP_DIS_LR_MASK			0x0f
+#define	SMP_DIS_LR_DISABLED		0x01
+#define	SMP_DIS_LR_PHY_RES_PROB		0x02
+#define	SMP_DIS_LR_SPINUP_HOLD		0x03
+#define	SMP_DIS_LR_PORT_SEL		0x04
+#define	SMP_DIS_LR_RESET_IN_PROG	0x05
+#define	SMP_DIS_LR_UNSUP_PHY_ATTACHED	0x06
+#define	SMP_DIS_LR_G1_15GBPS		0x08
+#define	SMP_DIS_LR_G2_30GBPS		0x09
+#define	SMP_DIS_LR_G3_60GBPS		0x0a
+	uint8_t	config_bits0;
+#define	SMP_DIS_ATTACHED_SSP_INIT	0x08
+#define	SMP_DIS_ATTACHED_STP_INIT	0x04
+#define	SMP_DIS_ATTACHED_SMP_INIT	0x02
+#define	SMP_DIS_ATTACHED_SATA_HOST	0x01
+	uint8_t	config_bits1;
+#define	SMP_DIS_ATTACHED_SATA_PORTSEL	0x80
+#define	SMP_DIS_STP_BUFFER_TOO_SMALL	0x10
+#define	SMP_DIS_ATTACHED_SSP_TARG	0x08
+#define	SMP_DIS_ATTACHED_STP_TARG	0x04
+#define	SMP_DIS_ATTACHED_SMP_TARG	0x02
+#define	SMP_DIS_ATTACHED_SATA_DEV	0x01
+	uint8_t	sas_address[8];
+	uint8_t	attached_sas_address[8];
+	uint8_t	attached_phy_id;
+	uint8_t	config_bits2;
+#define	SMP_DIS_ATT_SLUMB_CAP		0x10
+#define	SMP_DIS_ATT_PAR_CAP		0x08
+#define	SMP_DIS_ATT_IN_ZPSDS_PER	0x04
+#define	SMP_DIS_ATT_REQ_IN_ZPSDS	0x02
+#define	SMP_DIS_ATT_BREAK_RPL_CAP	0x01
+	uint8_t	reserved2[6];
+	uint8_t	link_rate0;
+#define	SMP_DIS_PROG_MIN_LR_MASK	0xf0
+#define	SMP_DIS_PROG_MIN_LR_SHIFT	4
+#define	SMP_DIS_HARD_MIN_LR_MASK	0x0f
+	uint8_t	link_rate1;
+#define	SMP_DIS_PROG_MAX_LR_MAX		0xf0
+#define	SMP_DIS_PROG_MAX_LR_SHIFT	4
+#define	SMP_DIS_HARD_MAX_LR_MASK	0x0f
+	uint8_t	phy_change_count;
+	uint8_t	pp_timeout;
+#define	SMP_DIS_VIRTUAL_PHY		0x80
+#define	SMP_DIS_PP_TIMEOUT_MASK		0x0f
+	uint8_t	routing_attr;
+	uint8_t	conn_type;
+	uint8_t	conn_el_index;
+	uint8_t	conn_phys_link;
+	uint8_t	config_bits3;
+#define	SMP_DIS_PHY_POW_COND_MASK	0xc0
+#define	SMP_DIS_PHY_POW_COND_SHIFT	6
+#define	SMP_DIS_SAS_SLUMB_CAP		0x08
+#define	SMP_DIS_SAS_PART_CAP		0x04
+#define	SMP_DIS_SATA_SLUMB_CAP		0x02
+#define	SMP_DIS_SATA_PART_CAP		0x01
+	uint8_t	config_bits4;
+#define	SMP_DIS_SAS_SLUMB_ENB		0x08
+#define	SMP_DIS_SAS_PART_ENB		0x04
+#define	SMP_DIS_SATA_SLUMB_ENB		0x02
+#define	SMP_DIS_SATA_PART_ENB		0x01
+	uint8_t	vendor_spec[2];
+	uint8_t	attached_dev_name[8];
+	uint8_t	config_bits5;
+#define	SMP_DIS_REQ_IN_ZPSDS_CHG	0x40
+#define	SMP_DIS_IN_ZPSDS_PER		0x20
+#define	SMP_DIS_REQ_IN_ZPSDS		0x10
+#define	SMP_DIS_ZG_PER			0x04
+#define	SMP_DIS_IN_ZPSDS		0x02
+#define	SMP_DIS_ZONING_ENB		0x01
+	uint8_t	reserved3[2];
+	uint8_t	zone_group;
+	uint8_t	self_config_status;
+	uint8_t	self_config_levels_comp;
+	uint8_t	reserved4[2];
+	uint8_t	self_config_sas_addr[8];
+	uint8_t	prog_phy_cap[4];
+	uint8_t	current_phy_cap[4];
+	uint8_t	attached_phy_cap[4];
+	uint8_t	reserved5[6];
+	uint8_t	neg_phys_link_rate;
+#define	SMP_DIS_REASON_MASK		0xf0
+#define	SMP_DIS_REASON_SHIFT		4
+#define	SMP_DIS_PHYS_LR_MASK		0x0f
+	uint8_t	config_bits6;
+#define	SMP_DIS_OPTICAL_MODE_ENB	0x04
+#define	SMP_DIS_NEG_SSC			0x02
+#define	SMP_DIS_HW_MUX_SUP		0x01
+	uint8_t	config_bits7;
+#define	SMP_DIS_DEF_IN_ZPSDS_PER	0x20
+#define	SMP_DIS_DEF_REQ_IN_ZPSDS	0x10
+#define	SMP_DIS_DEF_ZG_PER		0x04
+#define	SMP_DIS_DEF_ZONING_ENB		0x01
+	uint8_t	reserved6;
+	uint8_t	reserved7;
+	uint8_t	default_zone_group;
+	uint8_t	config_bits8;
+#define	SMP_DIS_SAVED_IN_ZPSDS_PER	0x20
+#define	SMP_DIS_SAVED_REQ_IN_SPSDS	0x10
+#define	SMP_DIS_SAVED_ZG_PER		0x04

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 10:17:51 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 C904E106564A;
	Thu,  3 Feb 2011 10:17:51 +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 B86C78FC15;
	Thu,  3 Feb 2011 10:17:51 +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 p13AHpFL042098;
	Thu, 3 Feb 2011 10:17:51 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13AHpU2042095;
	Thu, 3 Feb 2011 10:17:51 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031017.p13AHpU2042095@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 10:17:51 +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: r218212 - projects/graid/head/sys/geom
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: Thu, 03 Feb 2011 10:17:51 -0000

Author: mav
Date: Thu Feb  3 10:17:51 2011
New Revision: 218212
URL: http://svn.freebsd.org/changeset/base/218212

Log:
  Introduce new type of BIO_GETATTR -- GEOM::setstate, used to inform lower
  GEOM about state of it's providers from the point of upper layers.
  Make geom_disk use led(4) subsystem to illuminate states in such fashion:
  FAILED - "1" (on), REBUILD - "f5" (slow blink), RESYNC - "f1" (fast blink),
  ACTIVE - "0" (off).
  LED name should be set for each disk via kern.geom.disk.%s.led sysctl.
  Later disk API could be extended to allow disk driver to report this info
  in custom way via it's own facilities.

Modified:
  projects/graid/head/sys/geom/geom.h
  projects/graid/head/sys/geom/geom_disk.c

Modified: projects/graid/head/sys/geom/geom.h
==============================================================================
--- projects/graid/head/sys/geom/geom.h	Thu Feb  3 10:05:30 2011	(r218211)
+++ projects/graid/head/sys/geom/geom.h	Thu Feb  3 10:17:51 2011	(r218212)
@@ -208,6 +208,12 @@ struct g_classifier_hook {
 	void			*arg;
 };
 
+/* BIO_GETATTR("GEOM::setstate") argument values. */
+#define G_STATE_FAILED		0
+#define G_STATE_REBUILD		1
+#define G_STATE_RESYNC		2
+#define G_STATE_ACTIVE		3
+
 /* geom_dev.c */
 struct cdev;
 void g_dev_print(void);

Modified: projects/graid/head/sys/geom/geom_disk.c
==============================================================================
--- projects/graid/head/sys/geom/geom_disk.c	Thu Feb  3 10:05:30 2011	(r218211)
+++ projects/graid/head/sys/geom/geom_disk.c	Thu Feb  3 10:17:51 2011	(r218212)
@@ -56,6 +56,16 @@ __FBSDID("$FreeBSD$");
 #include 
 #include 
 
+#include 
+
+struct g_disk_softc {
+	struct disk		*dp;
+	struct sysctl_ctx_list	sysctl_ctx;
+	struct sysctl_oid	*sysctl_tree;
+	char			led[64];
+	uint32_t		state;
+};
+
 static struct mtx g_disk_done_mtx;
 
 static g_access_t g_disk_access;
@@ -76,6 +86,9 @@ static struct g_class g_disk_class = {
 	.dumpconf = g_disk_dumpconf,
 };
 
+SYSCTL_DECL(_kern_geom);
+SYSCTL_NODE(_kern_geom, OID_AUTO, disk, CTLFLAG_RW, 0, "GEOM_DISK stuff");
+
 static void
 g_disk_init(struct g_class *mp __unused)
 {
@@ -110,13 +123,15 @@ static int
 g_disk_access(struct g_provider *pp, int r, int w, int e)
 {
 	struct disk *dp;
+	struct g_disk_softc *sc;
 	int error;
 
 	g_trace(G_T_ACCESS, "g_disk_access(%s, %d, %d, %d)",
 	    pp->name, r, w, e);
 	g_topology_assert();
 	dp = pp->geom->softc;
-	if (dp == NULL || dp->d_destroyed) {
+	sc = pp->private;
+	if (dp == NULL || dp->d_destroyed || sc == NULL) {
 		/*
 		 * Allow decreasing access count even if disk is not
 		 * avaliable anymore.
@@ -155,6 +170,9 @@ g_disk_access(struct g_provider *pp, int
 				    pp->name, error);
 			g_disk_unlock_giant(dp);
 		}
+		sc->state = G_STATE_ACTIVE;
+		if (sc->led[0] != 0)
+			led_set(sc->led, "0");
 		dp->d_flags &= ~DISKFLAG_OPEN;
 	}
 	return (error);
@@ -162,7 +180,7 @@ g_disk_access(struct g_provider *pp, int
 
 static void
 g_disk_kerneldump(struct bio *bp, struct disk *dp)
-{ 
+{
 	struct g_kerneldump *gkd;
 	struct g_geom *gp;
 
@@ -186,6 +204,36 @@ g_disk_kerneldump(struct bio *bp, struct
 }
 
 static void
+g_disk_setstate(struct bio *bp, struct disk *dp)
+{
+	struct g_disk_softc *sc;
+	const char *cmd;
+
+	sc = bp->bio_to->private;
+	if (sc != NULL) {
+		memcpy(&sc->state, bp->bio_data, sizeof(sc->state));
+		if (sc->led[0] != 0) {
+			switch (sc->state) {
+			case G_STATE_FAILED:
+				cmd = "1";
+				break;
+			case G_STATE_REBUILD:
+				cmd = "f5";
+				break;
+			case G_STATE_RESYNC:
+				cmd = "f1";
+				break;
+			default:
+				cmd = "0";
+				break;
+			}
+			led_set(sc->led, cmd);
+		}
+	}
+	g_io_deliver(bp, 0);
+}
+
+static void
 g_disk_done(struct bio *bp)
 {
 	struct bio *bp2;
@@ -319,6 +367,8 @@ g_disk_start(struct bio *bp)
 			break;
 		else if (!strcmp(bp->bio_attribute, "GEOM::kerneldump"))
 			g_disk_kerneldump(bp, dp);
+		else if (!strcmp(bp->bio_attribute, "GEOM::setstate"))
+			g_disk_setstate(bp, dp);
 		else 
 			error = ENOIOCTL;
 		break;
@@ -376,6 +426,8 @@ g_disk_create(void *arg, int flag)
 	struct g_geom *gp;
 	struct g_provider *pp;
 	struct disk *dp;
+	struct g_disk_softc *sc;
+	char tmpstr[80];
 
 	if (flag == EV_CANCEL)
 		return;
@@ -392,6 +444,23 @@ g_disk_create(void *arg, int flag)
 	pp->stripesize = dp->d_stripesize;
 	if (bootverbose)
 		printf("GEOM: new disk %s\n", gp->name);
+	sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
+	sc->dp = dp;
+	sysctl_ctx_init(&sc->sysctl_ctx);
+	snprintf(tmpstr, sizeof(tmpstr), "GEOM disk %s", gp->name);
+	sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx,
+		SYSCTL_STATIC_CHILDREN(_kern_geom_disk), OID_AUTO, gp->name,
+		CTLFLAG_RD, 0, tmpstr);
+	if (sc->sysctl_tree != NULL) {
+		snprintf(tmpstr, sizeof(tmpstr),
+		    "kern.geom.disk.%s.led", gp->name);
+		TUNABLE_STR_FETCH(tmpstr, sc->led, sizeof(sc->led));
+		SYSCTL_ADD_STRING(&sc->sysctl_ctx,
+		    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "led",
+		    CTLFLAG_RW | CTLFLAG_TUN, sc->led, sizeof(sc->led),
+		    "LED name");
+	}
+	pp->private = sc;
 	dp->d_geom = gp;
 	g_error_provider(pp, 0);
 }
@@ -401,11 +470,21 @@ g_disk_destroy(void *ptr, int flag)
 {
 	struct disk *dp;
 	struct g_geom *gp;
+	struct g_disk_softc *sc;
 
 	g_topology_assert();
 	dp = ptr;
 	gp = dp->d_geom;
 	if (gp != NULL) {
+		sc = LIST_FIRST(&gp->provider)->private;
+		if (sc->sysctl_tree != NULL) {
+			sysctl_ctx_free(&sc->sysctl_ctx);
+			sc->sysctl_tree = NULL;
+		}
+		if (sc->led[0] != 0)
+			led_set(sc->led, "0");
+		g_free(sc);
+		LIST_FIRST(&gp->provider)->private = NULL;
 		gp->softc = NULL;
 		g_wither_geom(gp, ENXIO);
 	}

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 10:29:04 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 621241065672;
	Thu,  3 Feb 2011 10:29:04 +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 515ED8FC08;
	Thu,  3 Feb 2011 10:29:04 +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 p13AT4MH042372;
	Thu, 3 Feb 2011 10:29:04 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13AT4aa042368;
	Thu, 3 Feb 2011 10:29:04 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031029.p13AT4aa042368@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 10:29:04 +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: r218213 - 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: Thu, 03 Feb 2011 10:29:04 -0000

Author: mav
Date: Thu Feb  3 10:29:04 2011
New Revision: 218213
URL: http://svn.freebsd.org/changeset/base/218213

Log:
  Add support for reporting ACTIVE, REBUILD, RESYNC and FAILED states to
  underlying disks using BIO_GETATTR(GEOM::setstate) API.
  
  While doing it, change the way in which array start timeout is handled:
  do not call it directly from callout handler, but wrap it into a new event
  and queue in regular fashion. This is required to allow handler sleep while
  reporting states or writing metadata.

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

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 10:17:51 2011	(r218212)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 10:29:04 2011	(r218213)
@@ -112,9 +112,10 @@ struct g_class g_raid_class = {
 };
 
 static void g_raid_destroy_provider(struct g_raid_volume *vol);
-static int g_raid_update_disk(struct g_raid_disk *disk, u_int state);
-static int g_raid_update_subdisk(struct g_raid_subdisk *subdisk, u_int state);
-static int g_raid_update_volume(struct g_raid_volume *vol, u_int state);
+static int g_raid_update_disk(struct g_raid_disk *disk, u_int event);
+static int g_raid_update_subdisk(struct g_raid_subdisk *subdisk, u_int event);
+static int g_raid_update_volume(struct g_raid_volume *vol, u_int event);
+static int g_raid_update_node(struct g_raid_softc *sc, u_int event);
 static void g_raid_dumpconf(struct sbuf *sb, const char *indent,
     struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp);
 static void g_raid_start(struct bio *bp);
@@ -123,6 +124,18 @@ static void g_raid_disk_done(struct bio 
 static void g_raid_poll(struct g_raid_softc *sc);
 
 static const char *
+g_raid_node_event2str(int event)
+{
+
+	switch (event) {
+	case G_RAID_NODE_E_START:
+		return ("START");
+	default:
+		return ("INVALID");
+	}
+}
+
+static const char *
 g_raid_disk_state2str(int state)
 {
 
@@ -324,6 +337,41 @@ g_raid_get_subdiskname(struct g_raid_sub
 }
 
 void
+g_raid_report_disk_state(struct g_raid_disk *disk)
+{
+	struct g_raid_subdisk *sd;
+	int len, state;
+	uint32_t s;
+
+	if (disk->d_consumer == NULL)
+		return;
+	if (disk->d_state == G_RAID_DISK_S_FAILED ||
+	    disk->d_state == G_RAID_DISK_S_STALE_FAILED) {
+		s = G_STATE_FAILED;
+	} else {
+		state = G_RAID_SUBDISK_S_ACTIVE;
+		TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
+			if (sd->sd_state < state)
+				state = sd->sd_state;
+		}
+		if (state == G_RAID_SUBDISK_S_FAILED)
+			s = G_STATE_FAILED;
+		else if (state == G_RAID_SUBDISK_S_NEW ||
+		    state == G_RAID_SUBDISK_S_REBUILD)
+			s = G_STATE_REBUILD;
+		else if (state == G_RAID_SUBDISK_S_STALE ||
+		    state == G_RAID_SUBDISK_S_RESYNC)
+			s = G_STATE_RESYNC;
+		else
+			s = G_STATE_ACTIVE;
+	}
+	len = sizeof(s);
+	g_io_getattr("GEOM::setstate", disk->d_consumer, &len, &s);
+	G_RAID_DEBUG(1, "Disk %s state reported as %d.",
+	    g_raid_get_diskname(disk), s);
+}
+
+void
 g_raid_change_disk_state(struct g_raid_disk *disk, int state)
 {
 
@@ -332,6 +380,7 @@ g_raid_change_disk_state(struct g_raid_d
 	    g_raid_disk_state2str(disk->d_state),
 	    g_raid_disk_state2str(state));
 	disk->d_state = state;
+	g_raid_report_disk_state(disk);
 }
 
 void
@@ -343,6 +392,8 @@ g_raid_change_subdisk_state(struct g_rai
 	    g_raid_subdisk_state2str(sd->sd_state),
 	    g_raid_subdisk_state2str(state));
 	sd->sd_state = state;
+	if (sd->sd_disk)
+		g_raid_report_disk_state(sd->sd_disk);
 }
 
 void
@@ -1058,16 +1109,14 @@ static void
 g_raid_handle_event(struct g_raid_softc *sc, struct g_raid_event *ep)
 {
 
-	if ((ep->e_flags & G_RAID_EVENT_VOLUME) != 0) {
-		ep->e_error = g_raid_update_volume(ep->e_tgt,
-		    ep->e_event);
-	} else if ((ep->e_flags & G_RAID_EVENT_DISK) != 0) {
-		ep->e_error = g_raid_update_disk(ep->e_tgt,
-		    ep->e_event);
-	} else if ((ep->e_flags & G_RAID_EVENT_SUBDISK) != 0) {
-		ep->e_error = g_raid_update_subdisk(ep->e_tgt,
-		    ep->e_event);
-	}
+	if ((ep->e_flags & G_RAID_EVENT_VOLUME) != 0)
+		ep->e_error = g_raid_update_volume(ep->e_tgt, ep->e_event);
+	else if ((ep->e_flags & G_RAID_EVENT_DISK) != 0)
+		ep->e_error = g_raid_update_disk(ep->e_tgt, ep->e_event);
+	else if ((ep->e_flags & G_RAID_EVENT_SUBDISK) != 0)
+		ep->e_error = g_raid_update_subdisk(ep->e_tgt, ep->e_event);
+	else
+		ep->e_error = g_raid_update_node(ep->e_tgt, ep->e_event);
 	if ((ep->e_flags & G_RAID_EVENT_WAIT) == 0) {
 		KASSERT(ep->e_error == 0,
 		    ("Error cannot be handled."));
@@ -1367,6 +1416,22 @@ g_raid_update_disk(struct g_raid_disk *d
 	return (0);
 }
 
+/*
+ * Node event.
+ */
+static int
+g_raid_update_node(struct g_raid_softc *sc, u_int event)
+{
+	sx_assert(&sc->sc_lock, SX_XLOCKED);
+
+	G_RAID_DEBUG(2, "Event %s for node %s.",
+	    g_raid_node_event2str(event), sc->sc_name);
+
+	if (sc->sc_md)
+		G_RAID_MD_EVENT(sc->sc_md, NULL, event);
+	return (0);
+}
+
 static int
 g_raid_access(struct g_provider *pp, int acr, int acw, int ace)
 {

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Thu Feb  3 10:17:51 2011	(r218212)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Thu Feb  3 10:29:04 2011	(r218213)
@@ -244,6 +244,8 @@ struct g_raid_volume {
 	LIST_ENTRY(g_raid_volume)	 v_global_next; /* Global list entry. */
 };
 
+#define G_RAID_NODE_E_START	0x01
+
 struct g_raid_softc {
 	struct g_raid_md_object	*sc_md;		/* Metadata object. */
 	struct g_geom		*sc_geom;	/* GEOM class instance. */
@@ -340,6 +342,7 @@ int g_raid_subdisk_kerneldump(struct g_r
 
 void g_raid_kill_consumer(struct g_raid_softc *sc, struct g_consumer *cp);
 
+void g_raid_report_disk_state(struct g_raid_disk *disk);
 void g_raid_change_disk_state(struct g_raid_disk *disk, int state);
 void g_raid_change_subdisk_state(struct g_raid_subdisk *sd, int state);
 void g_raid_change_volume_state(struct g_raid_volume *vol, int state);

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Thu Feb  3 10:17:51 2011	(r218212)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Thu Feb  3 10:29:04 2011	(r218213)
@@ -905,7 +905,7 @@ g_raid_intel_go(void *arg)
 	sx_xlock(&sc->sc_lock);
 	if (!mdi->mdio_started) {
 		G_RAID_DEBUG(0, "Force node %s start due to timeout.", sc->sc_name);
-		g_raid_md_intel_start(sc);
+		g_raid_event_send(sc, G_RAID_NODE_E_START, 0);
 	}
 	sx_xunlock(&sc->sc_lock);
 }
@@ -1132,9 +1132,20 @@ g_raid_md_event_intel(struct g_raid_md_o
 {
 	struct g_raid_softc *sc;
 	struct g_raid_subdisk *sd;
+	struct g_raid_md_intel_object *mdi;
 	struct g_raid_md_intel_perdisk *pd;
 
 	sc = md->mdo_softc;
+	mdi = (struct g_raid_md_intel_object *)md;
+	if (disk == NULL) {
+		switch (event) {
+		case G_RAID_NODE_E_START:
+			if (!mdi->mdio_started)
+				g_raid_md_intel_start(sc);
+			return (0);
+		}
+		return (-1);
+	}
 	pd = (struct g_raid_md_intel_perdisk *)disk->d_md_data;
 	switch (event) {
 	case G_RAID_DISK_E_DISCONNECTED:
@@ -1169,9 +1180,9 @@ g_raid_md_event_intel(struct g_raid_md_o
 		if (g_raid_ndisks(sc, -1) ==
 		    g_raid_ndisks(sc, G_RAID_DISK_S_OFFLINE))
 			g_raid_destroy_node(sc, 0);
-		break;
+		return (0);
 	}
-	return (0);
+	return (-2);
 }
 
 static int

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 12:19:07 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 9AC5E106564A;
	Thu,  3 Feb 2011 12:19:07 +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 893DE8FC12;
	Thu,  3 Feb 2011 12:19:07 +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 p13CJ7Lq045127;
	Thu, 3 Feb 2011 12:19:07 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13CJ7gq045125;
	Thu, 3 Feb 2011 12:19:07 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031219.p13CJ7gq045125@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 12:19:07 +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: r218220 - projects/graid/head/sbin/geom/class/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: Thu, 03 Feb 2011 12:19:07 -0000

Author: mav
Date: Thu Feb  3 12:19:07 2011
New Revision: 218220
URL: http://svn.freebsd.org/changeset/base/218220

Log:
  Initial manual page.

Modified:
  projects/graid/head/sbin/geom/class/raid/graid.8

Modified: projects/graid/head/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/head/sbin/geom/class/raid/graid.8	Thu Feb  3 11:52:22 2011	(r218219)
+++ projects/graid/head/sbin/geom/class/raid/graid.8	Thu Feb  3 12:19:07 2011	(r218220)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd December 18, 2010
+.Dd February 3, 2010
 .Dt GRAID 8
 .Os
 .Sh NAME
@@ -33,65 +33,40 @@
 .Sh SYNOPSIS
 .Nm
 .Cm label
-.Op Fl Fhnv
-.Op Fl b Ar balance
-.Op Fl s Ar slice
-.Ar name
-.Ar prov ...
-.Nm
-.Cm clear
-.Op Fl v
+.Op Fl S Ar size
+.Op Fl s Ar strip
+.Ar format
+.Ar label
+.Ar level
 .Ar prov ...
 .Nm
-.Cm configure
-.Op Fl adfFhnv
-.Op Fl b Ar balance
-.Op Fl s Ar slice
+.Cm add
+.Op Fl S Ar size
+.Op Fl s Ar strip
 .Ar name
+.Ar label
+.Ar level
 .Nm
-.Cm configure
-.Op Fl v
-.Fl p Ar priority
+.Cm delete
 .Ar name
-.Ar prov
-.Nm
-.Cm rebuild
-.Op Fl v
-.Ar name
-.Ar prov ...
+.Op Ar label | Ar num
 .Nm
 .Cm insert
-.Op Fl hiv
-.Op Fl p Ar priority
 .Ar name
 .Ar prov ...
 .Nm
 .Cm remove
-.Op Fl v
 .Ar name
 .Ar prov ...
 .Nm
-.Cm activate
-.Op Fl v
+.Cm fail
 .Ar name
 .Ar prov ...
 .Nm
-.Cm deactivate
-.Op Fl v
-.Ar name
-.Ar prov ...
-.Nm
-.Cm forget
-.Op Fl v
-.Ar name ...
-.Nm
 .Cm stop
 .Op Fl fv
 .Ar name ...
 .Nm
-.Cm dump
-.Ar prov ...
-.Nm
 .Cm list
 .Nm
 .Cm status
@@ -102,128 +77,85 @@
 .Sh DESCRIPTION
 The
 .Nm
-utility is used for software RAID configurations.
-After a RAID's creation, all components are detected and configured
-automatically.
-All operations like failure detection, stale component detection, rebuild
-of stale components, etc.\& are also done automatically.
-The
-.Nm
-utility uses on-disk metadata to store all needed information.
+utility is used to manage software RAID configurations, supported by GEOM RAID
+class.
+GEOM RAID class uses on-disk metadata to provide access to software-RAID
+volumes defined by different RAID BIOSes.
+Depending on RAID BIOS type and it's metadata format, different subsets of
+configurations and features supported.
+To allow booting from RAID volume metadata format should match RAID BIOS type
+and it's capabilities.
+To guarantee this match it is recommended to create volumes via RAID BIOS
+interface, while experienced users are free to do it using this utility.
 .Pp
 The first argument to
 .Nm
 indicates an action to be performed:
-.Bl -tag -width ".Cm deactivate"
+.Bl -tag -width ".Cm destroy"
 .It Cm label
-Create a mirror.
-The order of components is important, because a component's priority is based on its position
-(starting from 0 to 255).
-The component with the biggest priority is used by the
-.Cm prefer
-balance algorithm
-and is also used as a master component when resynchronization is needed,
-e.g.\& after a power failure when the device was open for writing.
-.Pp
-Additional options include:
-.Bl -tag -width ".Fl b Ar balance"
-.It Fl b Ar balance
-Specifies balance algorithm to use, one of:
-.Bl -tag -width ".Cm round-robin"
-.It Cm load
-Read from the component with the lowest load.
-This is the default balance algorithm.
-.It Cm prefer
-Read from the component with the biggest priority.
-.It Cm round-robin
-Use round-robin algorithm when choosing component to read.
-.It Cm split
-Split read requests, which are bigger than or equal to slice size on N pieces,
-where N is the number of active components.
-.El
-.It Fl F
-Do not synchronize after a power failure or system crash.
-Assumes device is in consistent state.
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl n
-Turn off autosynchronization of stale components.
-.It Fl s Ar slice
-When using the
-.Cm split
-balance algorithm and an I/O READ request is bigger than or equal to this value,
-the I/O request will be split into N pieces, where N is the number of active
-components.
-Defaults to 4096 bytes.
-.El
-.It Cm clear
-Clear metadata on the given providers.
-.It Cm configure
-Configure the given device.
+Create an array with single volume.
+.Ar format
+argument specifies on-disk metadata format to use for this array,
+such as "Intel".
+.Ar label
+argument specifies label of the created volume.
+.Ar level
+argument specifies RAID level of the created volume, such as:
+"RAID0", "RAID1", etc.
+Subsequent list enumerates providers to use as array components.
+Special name "NONE" can be used to reserve space for absent disk.
+The order of components can be important, depending on specific RAID level
+and metadata format.
 .Pp
 Additional options include:
-.Bl -tag -width ".Fl p Ar priority"
-.It Fl a
-Turn on autosynchronization of stale components.
-.It Fl b Ar balance
-Specifies balance algorithm to use.
-.It Fl d
-Do not hardcode providers' names in metadata.
-.It Fl f
-Synchronize device after a power failure or system crash.
-.It Fl F
-Do not synchronize after a power failure or system crash.
-Assumes device is in consistent state.
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl n
-Turn off autosynchronization of stale components.
-.It Fl p Ar priority
-Specifies priority for the given component
-.Ar prov .
-.It Fl s Ar slice
-Specifies slice size for
-.Cm split
-balance algorithm.
-.El
-.It Cm rebuild
-Rebuild the given mirror components forcibly.
-If autosynchronization was not turned off for the given device, this command
-should be unnecessary.
+.Bl -tag -width ".Fl s Ar strip"
+.It Fl S Ar size
+Use
+.Ar size
+bytes on each component for this volume.
+Should be used if several volumes per array are planned, or if smaller
+components going to be inserted later.
+Defaults to size of the smallest component.
+.It Fl s Ar strip
+Specifies strip size in bytes.
+Defaults to 131072.
+.El
+.It Cm add
+Create another volume on the existing array.
+.Ar name
+argument is the name of existing array, reported by label command.
+The rest of arguments are the same as for label command.
+.It Cm delete
+Delete volume(s) from the existing array. When last volume deleted, array is
+also getting deleted and metadata erased.
+.Ar name
+argument is the name of existing array.
+Optional
+.Ar label
+or
+.Ar num
+arguments allow to specify volume for deletion.
 .It Cm insert
-Add the given component(s) to the existing mirror.
-.Pp
-Additional options include:
-.Bl -tag -width ".Fl p Ar priority"
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl i
-Mark component(s) as inactive immediately after insertion.
-.It Fl p Ar priority
-Specifies priority of the given component(s).
-.El
+Insert specified provider(s) into specified array instead of the first missing
+or failed components.
+If there is no such components - mark disk(s) as spare.
 .It Cm remove
-Remove the given component(s) from the mirror and clear metadata on it.
-.It Cm activate
-Activate the given component(s), which were marked as inactive before.
-.It Cm deactivate
-Mark the given component(s) as inactive, so it will not be automatically
-connected to the mirror.
-.It Cm forget
-Forget about components which are not connected.
-This command is useful when a disk has failed and cannot be reconnected, preventing the
-.Cm remove
-command from being used to remove it.
+Remove specified provider(s) from specified array and erase metadata.
+If there are spare disks present - removed disk will be replaced with one
+of them.
+.It Cm fail
+Mark the given disks(s) as failed, removing from active use unless absolutely
+necessary due to exhausted redundancy.
+If there are spare disks present - failed disk(s) will be replaced with one
+of them.
 .It Cm stop
-Stop the given mirror.
+Stop the given array. Metadata not erased.
 .Pp
 Additional options include:
 .Bl -tag -width ".Fl f"
 .It Fl f
-Stop the given mirror even if it is opened.
+Stop the given array even if some of it's volumes are opened.
 .El
-.It Cm dump
-Dump metadata stored on the given providers.
 .It Cm list
 See
 .Xr geom 8 .
@@ -243,16 +175,23 @@ Additional options include:
 .It Fl v
 Be more verbose.
 .El
+.Sh SUPPORTED METADATA FORMATS
+GEOM RAID class implements modular design, allowing different metadata formats
+to be used. Support for such formats is implemented now:
+.Bl -tag -width "Intel"
+.It Intel
+Format supported by Intel RAID BIOS. Supports up to two volumes per array.
+Supports such configurations: RAID0 (2+ disks), RAID1 (2 disks),
+RAID5 (3+ disks), RAID10 (2 or 4 disks).
+.El
+.Sh SUPPORTED RAID LEVELS
+GEOM RAID class implements modular design, allowing different RAID levels
+to be used. Support for such formats is implemented now: RAID0, RAID1.
 .Sh EXIT STATUS
-Exit status is 0 on success, and 1 if the command fails.
+Exit status is 0 on success, and others if the command fails.
 .Sh SEE ALSO
 .Xr geom 4 ,
-.Xr dumpon 8 ,
 .Xr geom 8 ,
-.Xr mount 8 ,
-.Xr newfs 8 ,
-.Xr savecore 8 ,
-.Xr umount 8 ,
 .Xr vinum 8
 .Sh HISTORY
 The
@@ -261,3 +200,4 @@ utility appeared in
 .Fx 9.0 .
 .Sh AUTHORS
 .An Alexander Motin Aq mav@FreeBSD.org
+.An M. Warner Losh Aq imp@FreeBSD.org

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 13:10:13 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 8DF941065673;
	Thu,  3 Feb 2011 13:10:13 +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 63A518FC17;
	Thu,  3 Feb 2011 13:10:13 +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 p13DADdk046408;
	Thu, 3 Feb 2011 13:10:13 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13DADF9046406;
	Thu, 3 Feb 2011 13:10:13 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031310.p13DADF9046406@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 13:10:13 +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: r218222 - projects/graid/head/sbin/geom/class/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: Thu, 03 Feb 2011 13:10:13 -0000

Author: mav
Date: Thu Feb  3 13:10:13 2011
New Revision: 218222
URL: http://svn.freebsd.org/changeset/base/218222

Log:
  It is indeed 2011 already. :)

Modified:
  projects/graid/head/sbin/geom/class/raid/graid.8

Modified: projects/graid/head/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/head/sbin/geom/class/raid/graid.8	Thu Feb  3 13:09:22 2011	(r218221)
+++ projects/graid/head/sbin/geom/class/raid/graid.8	Thu Feb  3 13:10:13 2011	(r218222)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 3, 2010
+.Dd February 3, 2011
 .Dt GRAID 8
 .Os
 .Sh NAME

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 15:13:15 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 7DED0106564A;
	Thu,  3 Feb 2011 15:13:15 +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 513378FC12;
	Thu,  3 Feb 2011 15:13:15 +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 p13FDFDT049521;
	Thu, 3 Feb 2011 15:13:15 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13FDF9d049519;
	Thu, 3 Feb 2011 15:13:15 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031513.p13FDF9d049519@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 15:13:15 +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: r218224 - 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: Thu, 03 Feb 2011 15:13:15 -0000

Author: mav
Date: Thu Feb  3 15:13:15 2011
New Revision: 218224
URL: http://svn.freebsd.org/changeset/base/218224

Log:
  Handle UNINITIALIZED volume state - report all disks as NEW and let
  transformation layer choose some for ACTIVE and rebuild the rest.
  
  Add some comments.

Modified:
  projects/graid/head/sys/geom/raid/md_intel.c

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Thu Feb  3 14:42:46 2011	(r218223)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Thu Feb  3 15:13:15 2011	(r218224)
@@ -626,31 +626,43 @@ nofit:
 			mmap1 = mmap0;
 
 		if (resurrection) {
+			/* Stale disk, almost same as new. */
 			g_raid_change_subdisk_state(sd,
 			    G_RAID_SUBDISK_S_NEW);
 		} else if (meta->disk[disk_pos].flags & INTEL_F_FAILED) {
+			/* Failed disk, almost useless. */
 			g_raid_change_subdisk_state(sd,
 			    G_RAID_SUBDISK_S_FAILED);
 		} else if (mvol->migr_state == 0) {
-			if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+			if (mmap0->status == INTEL_S_UNINITIALIZED) {
+				/* Freshly created uninitialized volume. */
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_NEW);
+			} else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+				/* Freshly inserted disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_NEW);
 			} else if (mvol->dirty) {
+				/* Dirty volume (unclean shutdown). */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_STALE);
 			} else {
+				/* Up to date disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_ACTIVE);
 			}
 		} else if (mvol->migr_type == INTEL_MT_INIT ||
 			   mvol->migr_type == INTEL_MT_REBUILD) {
 			if (!(mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD)) {
+				/* Up to date disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_ACTIVE);
 			} else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+				/* Freshly inserted disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_NEW);
 			} else {
+				/* Rebuilding disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_REBUILD);
 				sd->sd_rebuild_pos =
@@ -661,12 +673,15 @@ nofit:
 		} else if (mvol->migr_type == INTEL_MT_VERIFY ||
 			   mvol->migr_type == INTEL_MT_REPAIR) {
 			if (!(mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD)) {
+				/* Up to date disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_ACTIVE);
 			} else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+				/* Freshly inserted disk. */
 				g_raid_change_subdisk_state(sd,
-				    G_RAID_SUBDISK_S_STALE);
+				    G_RAID_SUBDISK_S_NEW);
 			} else {
+				/* Resyncing disk. */
 				g_raid_change_subdisk_state(sd,
 				    G_RAID_SUBDISK_S_RESYNC);
 				sd->sd_rebuild_pos =

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 15:46:54 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 A2DCC1065670;
	Thu,  3 Feb 2011 15:46:54 +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 754998FC08;
	Thu,  3 Feb 2011 15:46:54 +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 p13FksTs050363;
	Thu, 3 Feb 2011 15:46:54 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13Fks78050361;
	Thu, 3 Feb 2011 15:46:54 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031546.p13Fks78050361@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 15:46:54 +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: r218226 - 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: Thu, 03 Feb 2011 15:46:54 -0000

Author: mav
Date: Thu Feb  3 15:46:54 2011
New Revision: 218226
URL: http://svn.freebsd.org/changeset/base/218226

Log:
  When we got new disk, prefer to replace OFFLINE disk and only then FAILED.
  FAILED disk theoretically may still contain some usable information, while
  OFFLINE is definitely not. Also it may happen that new disk is really the
  one OFFLINE we are missing, and so information still could be restored.
  That's all about luck and magic, but why not if we are not loosing anything?

Modified:
  projects/graid/head/sys/geom/raid/md_intel.c

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Thu Feb  3 15:19:18 2011	(r218225)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Thu Feb  3 15:46:54 2011	(r218226)
@@ -506,7 +506,7 @@ g_raid_md_intel_start_disk(struct g_raid
 {
 	struct g_raid_softc *sc;
 	struct g_raid_subdisk *sd, *tmpsd;
-	struct g_raid_disk *olddisk;
+	struct g_raid_disk *olddisk, *tmpdisk;
 	struct g_raid_md_object *md;
 	struct g_raid_md_intel_object *mdi;
 	struct g_raid_md_intel_perdisk *pd, *oldpd;
@@ -534,13 +534,16 @@ g_raid_md_intel_start_disk(struct g_raid
 		/* If we are in the start process, that's all for now. */
 		if (!mdi->mdio_started)
 			goto nofit;
-		/* If we have already started - try to get use of the disk. */
-		TAILQ_FOREACH(olddisk, &sc->sc_disks, d_next) {
-			if (olddisk->d_state != G_RAID_DISK_S_OFFLINE &&
-			    olddisk->d_state != G_RAID_DISK_S_FAILED)
+		/*
+		 * If we have already started - try to get use of the disk.
+		 * Try to replace OFFLINE disks first, then FAILED.
+		 */
+		TAILQ_FOREACH(tmpdisk, &sc->sc_disks, d_next) {
+			if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE &&
+			    tmpdisk->d_state != G_RAID_DISK_S_FAILED)
 				continue;
 			/* Make sure this disk is big enough. */
-			TAILQ_FOREACH(sd, &olddisk->d_subdisks, sd_next) {
+			TAILQ_FOREACH(sd, &tmpdisk->d_subdisks, sd_next) {
 				if (sd->sd_offset + sd->sd_size + 4096 >
 				    (off_t)pd->pd_disk_meta.sectors * 512) {
 					G_RAID_DEBUG(1,
@@ -554,7 +557,11 @@ g_raid_md_intel_start_disk(struct g_raid
 			}
 			if (sd != NULL)
 				continue;
-			break;
+			if (tmpdisk->d_state == G_RAID_DISK_S_OFFLINE) {
+				olddisk = tmpdisk;
+				break;
+			} else if (olddisk == NULL)
+				olddisk = tmpdisk;
 		}
 		if (olddisk == NULL) {
 nofit:

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 18:47:13 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 C608F1065695;
	Thu,  3 Feb 2011 18:47:13 +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 B54B88FC19;
	Thu,  3 Feb 2011 18:47:13 +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 p13IlDQE054758;
	Thu, 3 Feb 2011 18:47:13 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13IlDVC054756;
	Thu, 3 Feb 2011 18:47:13 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031847.p13IlDVC054756@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 18:47:13 +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: r218230 - 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: Thu, 03 Feb 2011 18:47:13 -0000

Author: mav
Date: Thu Feb  3 18:47:13 2011
New Revision: 218230
URL: http://svn.freebsd.org/changeset/base/218230

Log:
  Fix writing/dumping to non-OPTIMAL RAID1 volumes.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Feb  3 18:25:55 2011	(r218229)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Feb  3 18:47:13 2011	(r218230)
@@ -481,6 +481,7 @@ g_raid_tr_iostart_raid1_write(struct g_r
 			if (bp->bio_offset >= sd->sd_rebuild_pos)
 				continue;
 			break;
+		case G_RAID_SUBDISK_S_STALE:
 		case G_RAID_SUBDISK_S_RESYNC:
 			/*
 			 * Resyncing still writes on the theory that the
@@ -488,6 +489,7 @@ g_raid_tr_iostart_raid1_write(struct g_r
 			 * keep it that way better if we keep up while
 			 * resyncing.
 			 */
+			break;
 		default:
 			continue;
 		}
@@ -818,10 +820,23 @@ g_raid_tr_kerneldump_raid1(struct g_raid
 		switch (sd->sd_state) {
 		case G_RAID_SUBDISK_S_ACTIVE:
 			break;
-//		case G_RAID_DISK_STATE_SYNCHRONIZING:
-//			if (bp->bio_offset >= sync->ds_offset)
-//				continue;
-//			break;
+		case G_RAID_SUBDISK_S_REBUILD:
+			/*
+			 * When rebuilding, only part of this subdisk is
+			 * writable, the rest will be written as part of the
+			 * that process.
+			 */
+			if (offset >= sd->sd_rebuild_pos)
+				continue;
+			break;
+		case G_RAID_SUBDISK_S_STALE:
+		case G_RAID_SUBDISK_S_RESYNC:
+			/*
+			 * Resyncing still writes on the theory that the
+			 * resync'd disk is very close and writing it will
+			 * keep it that way better if we keep up while
+			 * resyncing.
+			 */
 		default:
 			continue;
 		}

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 18:50:10 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 97EF0106566B;
	Thu,  3 Feb 2011 18:50:10 +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 873618FC0C;
	Thu,  3 Feb 2011 18:50:10 +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 p13IoAmd054854;
	Thu, 3 Feb 2011 18:50:10 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13IoAxM054852;
	Thu, 3 Feb 2011 18:50:10 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031850.p13IoAxM054852@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 18:50:10 +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: r218231 - 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: Thu, 03 Feb 2011 18:50:10 -0000

Author: mav
Date: Thu Feb  3 18:50:10 2011
New Revision: 218231
URL: http://svn.freebsd.org/changeset/base/218231

Log:
  Heh, missed one more "break".

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Feb  3 18:47:13 2011	(r218230)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Feb  3 18:50:10 2011	(r218231)
@@ -837,6 +837,7 @@ g_raid_tr_kerneldump_raid1(struct g_raid
 			 * keep it that way better if we keep up while
 			 * resyncing.
 			 */
+			break;
 		default:
 			continue;
 		}

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 19:27:09 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 07B571065694;
	Thu,  3 Feb 2011 19:27:09 +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 EA9588FC20;
	Thu,  3 Feb 2011 19:27:08 +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 p13JR85V055833;
	Thu, 3 Feb 2011 19:27:08 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13JR8A0055831;
	Thu, 3 Feb 2011 19:27:08 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102031927.p13JR8A0055831@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 19:27:08 +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: r218233 - projects/graid/head/sbin/geom/class/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: Thu, 03 Feb 2011 19:27:09 -0000

Author: mav
Date: Thu Feb  3 19:27:08 2011
New Revision: 218233
URL: http://svn.freebsd.org/changeset/base/218233

Log:
  Grammar lesson.
  
  Submitted by:	Ben Kaduk

Modified:
  projects/graid/head/sbin/geom/class/raid/graid.8

Modified: projects/graid/head/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/head/sbin/geom/class/raid/graid.8	Thu Feb  3 19:22:21 2011	(r218232)
+++ projects/graid/head/sbin/geom/class/raid/graid.8	Thu Feb  3 19:27:08 2011	(r218233)
@@ -77,16 +77,17 @@
 .Sh DESCRIPTION
 The
 .Nm
-utility is used to manage software RAID configurations, supported by GEOM RAID
-class.
+utility is used to manage software RAID configurations, supported by the
+GEOM RAID class.
 GEOM RAID class uses on-disk metadata to provide access to software-RAID
 volumes defined by different RAID BIOSes.
 Depending on RAID BIOS type and it's metadata format, different subsets of
-configurations and features supported.
-To allow booting from RAID volume metadata format should match RAID BIOS type
-and it's capabilities.
-To guarantee this match it is recommended to create volumes via RAID BIOS
-interface, while experienced users are free to do it using this utility.
+configurations and features are supported.
+To allow booting from RAID volume, the metadata format should match the
+RAID BIOS type and its capabilities.
+To guarantee that these match, it is recommended to create volumes via the
+RAID BIOS interface, while experienced users are free to do it using this
+utility.
 .Pp
 The first argument to
 .Nm
@@ -94,16 +95,19 @@ indicates an action to be performed:
 .Bl -tag -width ".Cm destroy"
 .It Cm label
 Create an array with single volume.
+The
 .Ar format
-argument specifies on-disk metadata format to use for this array,
+argument specifies the on-disk metadata format to use for this array,
 such as "Intel".
+The
 .Ar label
-argument specifies label of the created volume.
+argument specifies teh label of the created volume.
+The
 .Ar level
-argument specifies RAID level of the created volume, such as:
+argument specifies the RAID level of the created volume, such as:
 "RAID0", "RAID1", etc.
-Subsequent list enumerates providers to use as array components.
-Special name "NONE" can be used to reserve space for absent disk.
+The subsequent list enumerates providers to use as array components.
+The special name "NONE" can be used to reserve space for absent disks.
 The order of components can be important, depending on specific RAID level
 and metadata format.
 .Pp
@@ -122,39 +126,43 @@ Defaults to 131072.
 .El
 .It Cm add
 Create another volume on the existing array.
+The
 .Ar name
-argument is the name of existing array, reported by label command.
-The rest of arguments are the same as for label command.
+argument is the name of the existing array, reported by label command.
+The rest of arguments are the same as for the label command.
 .It Cm delete
-Delete volume(s) from the existing array. When last volume deleted, array is
-also getting deleted and metadata erased.
+Delete volume(s) from the existing array.
+When the last volume is deleted, the array is also deleted and its metadata
+erased.
+The
 .Ar name
 argument is the name of existing array.
 Optional
 .Ar label
 or
 .Ar num
-arguments allow to specify volume for deletion.
+arguments allow specifying volume for deletion.
 .It Cm insert
 Insert specified provider(s) into specified array instead of the first missing
 or failed components.
-If there is no such components - mark disk(s) as spare.
+If there are no such components, mark disk(s) as spare.
 .It Cm remove
-Remove specified provider(s) from specified array and erase metadata.
-If there are spare disks present - removed disk will be replaced with one
-of them.
+Remove the specified provider(s) from the specified array and erase metadata.
+If there are spare disks present, the removed disk(s) will be replaced by
+spares.
 .It Cm fail
 Mark the given disks(s) as failed, removing from active use unless absolutely
 necessary due to exhausted redundancy.
 If there are spare disks present - failed disk(s) will be replaced with one
 of them.
 .It Cm stop
-Stop the given array. Metadata not erased.
+Stop the given array.
+The metadata will not be erased.
 .Pp
 Additional options include:
 .Bl -tag -width ".Fl f"
 .It Fl f
-Stop the given array even if some of it's volumes are opened.
+Stop the given array even if some of its volumes are opened.
 .El
 .It Cm list
 See
@@ -176,19 +184,22 @@ Additional options include:
 Be more verbose.
 .El
 .Sh SUPPORTED METADATA FORMATS
-GEOM RAID class implements modular design, allowing different metadata formats
-to be used. Support for such formats is implemented now:
+The GEOM RAID class follows a modular design, allowing different metadata
+formats to be used.
+Support is currently implemented for the following formats:
 .Bl -tag -width "Intel"
 .It Intel
-Format supported by Intel RAID BIOS. Supports up to two volumes per array.
-Supports such configurations: RAID0 (2+ disks), RAID1 (2 disks),
-RAID5 (3+ disks), RAID10 (2 or 4 disks).
+The format used by Intel RAID BIOS.
+Supports up to two volumes per array.
+Supports configurations: RAID0 (2+ disks), RAID1 (2 disks),
+RAID5 (3+ disks), RAID10 (4 disks).
 .El
 .Sh SUPPORTED RAID LEVELS
-GEOM RAID class implements modular design, allowing different RAID levels
-to be used. Support for such formats is implemented now: RAID0, RAID1.
+The GEOM RAID class follows a modular design, allowing different RAID levels
+to be used.
+Support for the following RAID levels is currently implemented: RAID0, RAID1.
 .Sh EXIT STATUS
-Exit status is 0 on success, and others if the command fails.
+Exit status is 0 on success, and non-zero if the command fails.
 .Sh SEE ALSO
 .Xr geom 4 ,
 .Xr geom 8 ,

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 19:50:42 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 CBF0D106566C;
	Thu,  3 Feb 2011 19:50:42 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id B15A58FC08;
	Thu,  3 Feb 2011 19:50:42 +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 p13Jog9Y056406;
	Thu, 3 Feb 2011 19:50:42 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13JogVH056403;
	Thu, 3 Feb 2011 19:50:42 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102031950.p13JogVH056403@svn.freebsd.org>
From: Warner Losh 
Date: Thu, 3 Feb 2011 19:50:42 +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: r218234 - 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: Thu, 03 Feb 2011 19:50:42 -0000

Author: imp
Date: Thu Feb  3 19:50:42 2011
New Revision: 218234
URL: http://svn.freebsd.org/changeset/base/218234

Log:
  Fix range locking in a number of ways.  Avoid deadlocks with multiple
  I/Os that were documented previously.  Also fix asymetry between
  different parts of the code that caused rebuild hangs when a read
  request was pending.
  
  # this fixes the rebuild hangs for me, and should for doug also.

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c
  projects/graid/head/sys/geom/raid/g_raid.h

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 19:27:08 2011	(r218233)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 19:50:42 2011	(r218234)
@@ -76,6 +76,11 @@ static u_int g_raid_name_format = 0;
 TUNABLE_INT("kern.geom.raid.name_format", &g_raid_name_format);
 SYSCTL_UINT(_kern_geom_raid, OID_AUTO, name_format, CTLFLAG_RW,
     &g_raid_name_format, 0, "Providers name format.");
+static u_int g_raid_idle_threshold = 1000000;
+TUNABLE_INT("kern.geom.raid.idle_threshold", &g_raid_idle_threshold);
+SYSCTL_UINT(_kern_geom_raid, OID_AUTO, idle_threshold, CTLFLAG_RW,
+    &g_raid_idle_threshold, 1000000,
+    "Time in microseconds to consider a volume idle.");
 
 #define	MSLEEP(rv, ident, mtx, priority, wmesg, timeout)	do {	\
 	G_RAID_DEBUG(4, "%s: Sleeping %p.", __func__, (ident));		\
@@ -882,6 +887,7 @@ g_raid_start_request(struct bio *bp)
 	 */
 	if (!(bp->bio_cflags & G_RAID_BIO_FLAG_SPECIAL) &&
 	    g_raid_is_in_locked_range(vol, bp)) {
+		G_RAID_LOGREQ(3, bp, "Defer request.");
 		bioq_insert_tail(&vol->v_locked, bp);
 		return;
 	}
@@ -902,19 +908,52 @@ g_raid_start_request(struct bio *bp)
 	 * the transformation layer to start the I/O.
 	 */
 	bioq_insert_tail(&vol->v_inflight, bp);
+	G_RAID_LOGREQ(2, bp, "Request started");
 	G_RAID_TR_IOSTART(vol->v_tr, bp);
 }
 
+
+sttic void
+g_raid_finish_with_locked_ranges(struct g_raid_volume *vol, struct bio *bp)
+{
+	struct bio *nbp;
+	struct g_raid_lock *lp;
+
+	vol->v_pending_lock = 0;
+	LIST_FOREACH(lp, &vol->v_locks, l_next) {
+		if (lp->l_pending) {
+			off = lp->l_offset;
+			len = lp->l_length;
+			lp->l_pending = 0;
+			TAILQ_FOREACH(nbp, &vol->v_inflight.queue, bio_queue) {
+				if (g_raid_bio_overlaps(nbp, off, len))
+					lp->l_pending++;
+			}
+			if (lp->l_pending) {
+				vol->v_pending_lock = 1;
+				G_RAID_DEBUG(4,
+				    "Deferred lock(%jd, %jd) has %d pending",
+				    (intmax_t)off, (intmax_t)(off + len),
+				    lp->l_pending);
+				continue;
+			}
+			G_RAID_DEBUG(4,
+			    "Deferred lock of %jd to %jd completed",
+			    (intmax_t)off, (intmax_t)(off + len));
+			G_RAID_TR_LOCKED(vol->v_tr, lp->l_callback_arg);
+		}
+	}
+}
+
 void
 g_raid_iodone(struct bio *bp, int error)
 {
+	off_t off, len;
 	struct g_raid_softc *sc;
 	struct g_raid_volume *vol;
-	struct g_raid_lock *lp;
 
 	sc = bp->bio_to->geom->softc;
 	sx_assert(&sc->sc_lock, SX_LOCKED);
-
 	vol = bp->bio_to->private;
 	G_RAID_LOGREQ(3, bp, "Request done: %d.", error);
 
@@ -925,37 +964,8 @@ g_raid_iodone(struct bio *bp, int error)
 	}
 
 	bioq_remove(&vol->v_inflight, bp);
-	if (bp->bio_cmd == BIO_WRITE && vol->v_pending_lock &&
-	    g_raid_is_in_locked_range(vol, bp)) {
-		/*
-		 * XXX this structure forces serialization of all
-		 * XXX pending requests before any are allowed through.
-		 *
-		 * XXX Also, if there is a pending request that overlaps one
-		 * XXX locked area and another locked area comes along that also
-		 * XXX overlaps that area, we wind up double counting it, but
-		 * XXX not double uncounting it, so we hit deadlock.  Ouch.
-		 * Most likely, we should add pending counts to struct
-		 * g_raid_lock and recompute v_pending_lock in lock_range()
-		 * and here, which would eliminate the doubel counting.  Heck,
-		 * if we wanted to burn the cylces here, we could look at the
-		 * inflight queue and the v_locks and just recompute here.
-		 */
-		G_RAID_LOGREQ(3, bp,
-		    "Write to locking zone complete: %d writes outstanding",
-		    vol->v_pending_lock);
-		if (--vol->v_pending_lock == 0) {
-			G_RAID_LOGREQ(3, bp,
-			    "Last write done, calling pending callbacks.");
-			LIST_FOREACH(lp, &vol->v_locks,l_next) {
-				if (lp->l_flags & G_RAID_LOCK_PENDING) {
-					G_RAID_TR_LOCKED(vol->v_tr,
-					    lp->l_callback_arg);
-					lp->l_flags &= ~G_RAID_LOCK_PENDING;
-				}
-			}
-		}
-	}
+	if (vol->v_pending_lock && g_raid_is_in_locked_range(vol, bp))
+		g_raid_finish_with_locked_ranges(vol, bp);
 	g_io_deliver(bp, error);
 }
 
@@ -965,31 +975,32 @@ g_raid_lock_range(struct g_raid_volume *
 	struct g_raid_softc *sc;
 	struct g_raid_lock *lp;
 	struct bio *bp;
-	int pending;
 
 	sc = vol->v_softc;
 	lp = malloc(sizeof(*lp), M_RAID, M_WAITOK | M_ZERO);
 	LIST_INSERT_HEAD(&vol->v_locks, lp, l_next);
-	lp->l_flags |= G_RAID_LOCK_PENDING;
 	lp->l_offset = off;
 	lp->l_length = len;
 	lp->l_callback_arg = argp;
 
-	pending = 0;
+	lp->l_pending = 0;
 	TAILQ_FOREACH(bp, &vol->v_inflight.queue, bio_queue) {
 		if (g_raid_bio_overlaps(bp, off, len))
-			pending++;
+			lp->l_pending++;
 	}	
 
 	/*
 	 * If there are any writes that are pending, we return EBUSY.  All
 	 * callers will have to wait until all pending writes clear.
 	 */
-	if (pending > 0) {
-		vol->v_pending_lock += pending;
+	if (lp->l_pending > 0) {
+		vol->v_pending_lock = 1;
+		G_RAID_DEBUG(4, "Locking range %jd to %jd deferred %d pend",
+		    (intmax_t)off, (intmax_t)(off+len), lp->l_pending);
 		return (EBUSY);
 	}
-	lp->l_flags &= ~G_RAID_LOCK_PENDING;
+	G_RAID_DEBUG(4, "Locking range %jd to %jd",
+	    (intmax_t)off, (intmax_t)(off+len));
 	G_RAID_TR_LOCKED(vol->v_tr, lp->l_callback_arg);
 	return (0);
 }
@@ -997,12 +1008,12 @@ g_raid_lock_range(struct g_raid_volume *
 int
 g_raid_unlock_range(struct g_raid_volume *vol, off_t off, off_t len)
 {
-	struct g_raid_lock *lp, *tmp;
+	struct g_raid_lock *lp;
 	struct g_raid_softc *sc;
 	struct bio *bp;
 
 	sc = vol->v_softc;
-	LIST_FOREACH_SAFE(lp, &vol->v_locks, l_next, tmp) {
+	LIST_FOREACH(lp, &vol->v_locks, l_next) {
 		if (lp->l_offset == off && lp->l_length == len) {
 			LIST_REMOVE(lp, l_next);
 			/* XXX
@@ -1011,9 +1022,10 @@ g_raid_unlock_range(struct g_raid_volume
 			 * locked ranges will go right back on this list
 			 * when the worker thread runs.
 			 * XXX
-			 * Also, see note above about deadlock and how it
-			 * doth sucketh...
 			 */
+			G_RAID_DEBUG(4, "Unlocked %jd to %jd",
+			    (intmax_t)lp->l_offset,
+			    (intmax_t)(lp->l_offset+lp->l_length));
 			mtx_lock(&sc->sc_queue_mtx);
 			while ((bp = bioq_takefirst(&vol->v_locked)) != NULL)
 				bioq_disksort(&sc->sc_queue, bp);
@@ -1164,10 +1176,17 @@ g_raid_worker(void *arg)
 		else if ((bp = bioq_takefirst(&sc->sc_queue)) != NULL)
 			;
 		else {
-			timeout = 1;
+			/*
+			 * Two steps to avoid overflows at HZ=1000
+			 * and idle timeouts > 2.1s.  Some rounding errors
+			 * can occur, but they are < 1tick, which is deemed to
+			 * be close enough for this purpose.
+			 */
+			int micpertic = 1000000 / hz;
+			timeout = g_raid_idle_threshold / micpertic;
 			sx_xunlock(&sc->sc_lock);
 			MSLEEP(rv, sc, &sc->sc_queue_mtx, PRIBIO | PDROP, "-",
-			    timeout * hz);
+			    timeout);
 			sx_xlock(&sc->sc_lock);
 			goto process;
 		}

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Thu Feb  3 19:27:08 2011	(r218233)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Thu Feb  3 19:50:42 2011	(r218234)
@@ -99,12 +99,11 @@ extern struct g_class g_raid_class;
 #define G_RAID_BIO_FLAG_SPECIAL \
 		(G_RAID_BIO_FLAG_SYNC|G_RAID_BIO_FLAG_REMAP)
 
-#define G_RAID_LOCK_PENDING	0x1
 struct g_raid_lock {
 	off_t			 l_offset;
 	off_t			 l_length;
 	void			*l_callback_arg;
-	int			 l_flags;
+	int			 l_pending;
 	LIST_ENTRY(g_raid_lock)	 l_next;
 };
 

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 20:04:38 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 1EB2F106566C;
	Thu,  3 Feb 2011 20:04:38 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 0F4298FC17;
	Thu,  3 Feb 2011 20:04:38 +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 p13K4bcd056811;
	Thu, 3 Feb 2011 20:04:37 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13K4beM056809;
	Thu, 3 Feb 2011 20:04:37 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102032004.p13K4beM056809@svn.freebsd.org>
From: Warner Losh 
Date: Thu, 3 Feb 2011 20:04:37 +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: r218236 - 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: Thu, 03 Feb 2011 20:04:38 -0000

Author: imp
Date: Thu Feb  3 20:04:37 2011
New Revision: 218236
URL: http://svn.freebsd.org/changeset/base/218236

Log:
  Last second compile nits

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 19:59:00 2011	(r218235)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 20:04:37 2011	(r218236)
@@ -912,10 +912,10 @@ g_raid_start_request(struct bio *bp)
 	G_RAID_TR_IOSTART(vol->v_tr, bp);
 }
 
-
-sttic void
+static void
 g_raid_finish_with_locked_ranges(struct g_raid_volume *vol, struct bio *bp)
 {
+	off_t off, len;
 	struct bio *nbp;
 	struct g_raid_lock *lp;
 
@@ -948,7 +948,6 @@ g_raid_finish_with_locked_ranges(struct 
 void
 g_raid_iodone(struct bio *bp, int error)
 {
-	off_t off, len;
 	struct g_raid_softc *sc;
 	struct g_raid_volume *vol;
 

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 20:10:17 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 484BC106566B;
	Thu,  3 Feb 2011 20:10:17 +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 38D8A8FC1B;
	Thu,  3 Feb 2011 20:10:17 +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 p13KAHf1056986;
	Thu, 3 Feb 2011 20:10:17 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13KAHIG056984;
	Thu, 3 Feb 2011 20:10:17 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102032010.p13KAHIG056984@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 20:10:17 +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: r218237 - 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: Thu, 03 Feb 2011 20:10:17 -0000

Author: mav
Date: Thu Feb  3 20:10:16 2011
New Revision: 218237
URL: http://svn.freebsd.org/changeset/base/218237

Log:
  Reduce verbosity of disk status reports logging.

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 20:04:37 2011	(r218236)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb  3 20:10:16 2011	(r218237)
@@ -372,7 +372,7 @@ g_raid_report_disk_state(struct g_raid_d
 	}
 	len = sizeof(s);
 	g_io_getattr("GEOM::setstate", disk->d_consumer, &len, &s);
-	G_RAID_DEBUG(1, "Disk %s state reported as %d.",
+	G_RAID_DEBUG(2, "Disk %s state reported as %d.",
 	    g_raid_get_diskname(disk), s);
 }
 

From owner-svn-src-projects@FreeBSD.ORG  Thu Feb  3 20:27:21 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 3DCCE1065674;
	Thu,  3 Feb 2011 20:27:21 +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 2EA628FC1F;
	Thu,  3 Feb 2011 20:27:21 +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 p13KRLbh057487;
	Thu, 3 Feb 2011 20:27:21 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p13KRLAW057485;
	Thu, 3 Feb 2011 20:27:21 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102032027.p13KRLAW057485@svn.freebsd.org>
From: Alexander Motin 
Date: Thu, 3 Feb 2011 20:27:21 +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: r218239 - 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: Thu, 03 Feb 2011 20:27:21 -0000

Author: mav
Date: Thu Feb  3 20:27:20 2011
New Revision: 218239
URL: http://svn.freebsd.org/changeset/base/218239

Log:
  Do not update subdisk state from NONE and ACTIVE to ACTIVE. First is wrong.
  last is pointless.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid0.c

Modified: projects/graid/head/sys/geom/raid/tr_raid0.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid0.c	Thu Feb  3 20:26:26 2011	(r218238)
+++ projects/graid/head/sys/geom/raid/tr_raid0.c	Thu Feb  3 20:27:20 2011	(r218239)
@@ -140,7 +140,9 @@ g_raid_tr_event_raid0(struct g_raid_tr_o
 	sc = vol->v_softc;
 	if (event == G_RAID_SUBDISK_E_NEW) {
 		state = sd->sd_state;
-		if (state != G_RAID_SUBDISK_S_FAILED)
+		if (state != G_RAID_SUBDISK_S_NONE &&
+		    state != G_RAID_SUBDISK_S_FAILED &&
+		    state != G_RAID_SUBDISK_S_ACTIVE)
 			g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
 		if (state != sd->sd_state &&
 		    !trs->trso_starting && !trs->trso_stopped)

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 00:48:42 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 1B0DA106564A;
	Fri,  4 Feb 2011 00:48:42 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 096D48FC13;
	Fri,  4 Feb 2011 00:48:42 +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 p140mfBE063955;
	Fri, 4 Feb 2011 00:48:41 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p140mf4p063952;
	Fri, 4 Feb 2011 00:48:41 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040048.p140mf4p063952@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 00:48:41 +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: r218244 - 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: Fri, 04 Feb 2011 00:48:42 -0000

Author: imp
Date: Fri Feb  4 00:48:41 2011
New Revision: 218244
URL: http://svn.freebsd.org/changeset/base/218244

Log:
  minor tweaks to overly verbose messags

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 00:25:18 2011	(r218243)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 00:48:41 2011	(r218244)
@@ -908,7 +908,7 @@ g_raid_start_request(struct bio *bp)
 	 * the transformation layer to start the I/O.
 	 */
 	bioq_insert_tail(&vol->v_inflight, bp);
-	G_RAID_LOGREQ(2, bp, "Request started");
+	G_RAID_LOGREQ(4, bp, "Request started");
 	G_RAID_TR_IOSTART(vol->v_tr, bp);
 }
 

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 00:25:18 2011	(r218243)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 00:48:41 2011	(r218244)
@@ -360,7 +360,6 @@ g_raid_tr_event_raid1(struct g_raid_tr_o
 	vol = tr->tro_volume;
 	switch (event) {
 	case G_RAID_SUBDISK_E_NEW:
-		printf("Current disk state is %d\n", sd->sd_state);
 		if (sd->sd_state == G_RAID_SUBDISK_S_NEW)
 			g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_REBUILD);
 		break;

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 01:20:24 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 1DDD31065673;
	Fri,  4 Feb 2011 01:20:24 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 0BBC48FC0A;
	Fri,  4 Feb 2011 01:20:24 +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 p141KNoh064742;
	Fri, 4 Feb 2011 01:20:23 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p141KNXl064740;
	Fri, 4 Feb 2011 01:20:23 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040120.p141KNXl064740@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 01:20:23 +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: r218247 - 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: Fri, 04 Feb 2011 01:20:24 -0000

Author: imp
Date: Fri Feb  4 01:20:23 2011
New Revision: 218247
URL: http://svn.freebsd.org/changeset/base/218247

Log:
  Minor formatting nits

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 01:09:02 2011	(r218246)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 01:20:23 2011	(r218247)
@@ -609,10 +609,11 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				cbp = g_clone_bio(pbp);
 				if (cbp == NULL) {
 					/*
-					 * By flagging that we're not doing anything,
-					 * we'll pick up the rebuild at a later point
-					 * either by timeout or when we steal a small
-					 * part of the active I/O.
+					 * By flagging that we're not doing
+					 * anything, we'll pick up the rebuild
+					 * at a later point either by timeout
+					 * or when we steal a small part of
+					 * the active I/O.
 					 */
 					g_destroy_bio(bp); /* reuse? */
 					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
@@ -671,10 +672,11 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				cbp = g_clone_bio(pbp);
 				if (cbp == NULL) {
 					/*
-					 * By flagging that we're not doing anything,
-					 * we'll pick up the rebuild at a later point
-					 * either by timeout or when we steal a small
-					 * part of the active I/O.
+					 * By flagging that we're not doing
+					 * anything, we'll pick up the rebuild
+					 * at a later point either by timeout
+					 * or when we steal a small part of
+					 * the active I/O.
 					 */
 					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
 					return;
@@ -692,10 +694,9 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 			}
 		} else if (trs->trso_type == TR_RAID1_RESYNC) {
 			/*
-			 * read good sd, read bad sd in parallel.
-			 * when both done, compare the buffers.  write
-			 * good to the failed if different.  do the
-			 * next bit of work.
+			 * read good sd, read bad sd in parallel.  when both
+			 * done, compare the buffers.  write good to the bad
+			 * if different.  do the next bit of work.
 			 */
 			panic("Somehow, we think we're doing a resync");
 		}
@@ -720,9 +721,8 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 		 * everything to get it back in sync), or just degrade the
 		 * drive, which kicks off a resync?
 		 */
-		if (sd->sd_read_errs > SD_READ_THRESHOLD) {
+		if (sd->sd_read_errs > SD_READ_THRESHOLD)
 			g_raid_fail_disk(sd->sd_softc, sd, sd->sd_disk);
-		}
 
 		/*
 		 * Find the other disk, and try to do the I/O to it.
@@ -780,11 +780,11 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 		/*
 		 * We're done with a remap write, mark the range as unlocked.
 		 * For any write errors, we agressively fail the disk since
-		 * there was both a READ and a WRITE error at this location.  Both
-		 * types of errors generally indicates the drive is on the verge of
-		 * total failure anyway.  Better to stop trusting it now.  However,
-		 * we need to reset error to 0 in that case because we're not failing
-		 * the original I/O which succeeded.
+		 * there was both a READ and a WRITE error at this location.
+		 * Both types of errors generally indicates the drive is on
+		 * the verge of total failure anyway.  Better to stop trusting
+		 * it now.  However, we need to reset error to 0 in that case
+		 * because we're not failing the original I/O which succeeded.
 		 */
 		G_RAID_LOGREQ(2, bp, "REMAP done %d.", bp->bio_error);
 		g_raid_unlock_range(sd->sd_volume, bp->bio_offset,

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 03:10:57 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 94C25106564A;
	Fri,  4 Feb 2011 03:10:57 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 826D88FC08;
	Fri,  4 Feb 2011 03:10:57 +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 p143AvbW067463;
	Fri, 4 Feb 2011 03:10:57 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p143Avio067458;
	Fri, 4 Feb 2011 03:10:57 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040310.p143Avio067458@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 03:10:57 +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: r218248 - 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: Fri, 04 Feb 2011 03:10:57 -0000

Author: imp
Date: Fri Feb  4 03:10:57 2011
New Revision: 218248
URL: http://svn.freebsd.org/changeset/base/218248

Log:
  There's no real need to rebuild some via a bizarre indirection of
  sending the event to kick off a little more rebuilding.  We can make
  the calls directly without worrying about anything.

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/g_raid_tr_if.m
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 01:20:23 2011	(r218247)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 03:10:57 2011	(r218248)
@@ -1204,8 +1204,8 @@ process:
 			TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
 				if (vol->v_writes == 0 && !vol->v_idle)
 					g_raid_idle(vol, -1);
-				if (vol->v_timeout)
-					vol->v_timeout(vol, vol->v_to_arg);
+				if (vol->v_tr)
+					G_RAID_TR_IDLE(vol->v_tr);
 			}
 		}
 		if (sc->sc_stopping == G_RAID_DESTROY_HARD)

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 01:20:23 2011	(r218247)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 03:10:57 2011	(r218248)
@@ -206,7 +206,6 @@ struct g_raid_subdisk {
 #define G_RAID_VOLUME_RLQ_UNKNOWN	0xff
 
 struct g_raid_volume;
-typedef void (*g_raid_volume_timeout_t)(struct g_raid_volume *, void *);
 
 struct g_raid_volume {
 	struct g_raid_softc	*v_softc;	/* Back-pointer to softc. */
@@ -237,8 +236,6 @@ struct g_raid_volume {
 	int			 v_stopping;	/* Volume is stopping */
 	int			 v_provider_open; /* Number of opens. */
 	int			 v_global_id;	/* Global volume ID (rX). */
-	g_raid_volume_timeout_t  v_timeout;	/* Timeout function, if any */ 
-	void			*v_to_arg;	/* Arg to timeout function */
 	TAILQ_ENTRY(g_raid_volume)	 v_next; /* List of volumes entry. */
 	LIST_ENTRY(g_raid_volume)	 v_global_next; /* Global list entry. */
 };

Modified: projects/graid/head/sys/geom/raid/g_raid_tr_if.m
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid_tr_if.m	Fri Feb  4 01:20:23 2011	(r218247)
+++ projects/graid/head/sys/geom/raid/g_raid_tr_if.m	Fri Feb  4 03:10:57 2011	(r218248)
@@ -110,3 +110,9 @@ METHOD int locked {
 METHOD int free {
 	struct g_raid_tr_object *tr;
 };
+
+# idle() - callback when the volume is idle for a while and the TR wants
+# to schedule some work for that idle period.
+METHOD int idle {
+	struct g_raid_tr_object *tr;
+};

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 01:20:23 2011	(r218247)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 03:10:57 2011	(r218248)
@@ -47,16 +47,6 @@ __FBSDID("$FreeBSD$");
 #define SD_REBUILD_CLUSTER_IDLE 10
 #define SD_REBUILD_META_UPDATE 500 /* update meta data every 5 GB or so */
 
-/*
- * We don't want to hammer the disk with I/O requests when doing a rebuild or
- * a resync.  So, we send these events to ourselves when we go idle (or every
- * Nth normal I/O to 'clock' the process along.  The number and speed that we
- * send these will determine the bandwidth we consume of the disk drive and
- * how long these operations will take.
- */
-#define G_RAID_SUBDISK_E_TR_REBUILD_SOME (G_RAID_SUBDISK_E_FIRST_TR_PRIVATE + 0)
-#define G_RAID_SUBDISK_E_TR_RESYNC_SOME (G_RAID_SUBDISK_E_FIRST_TR_PRIVATE + 1)
-
 static MALLOC_DEFINE(M_TR_raid1, "tr_raid1_data", "GEOM_RAID raid1 data");
 
 #define TR_RAID1_NONE 0
@@ -87,6 +77,7 @@ static g_raid_tr_iostart_t g_raid_tr_ios
 static g_raid_tr_iodone_t g_raid_tr_iodone_raid1;
 static g_raid_tr_kerneldump_t g_raid_tr_kerneldump_raid1;
 static g_raid_tr_locked_t g_raid_tr_locked_raid1;
+static g_raid_tr_idle_t g_raid_tr_idle_raid1;
 static g_raid_tr_free_t g_raid_tr_free_raid1;
 
 static kobj_method_t g_raid_tr_raid1_methods[] = {
@@ -96,8 +87,9 @@ static kobj_method_t g_raid_tr_raid1_met
 	KOBJMETHOD(g_raid_tr_stop,	g_raid_tr_stop_raid1),
 	KOBJMETHOD(g_raid_tr_iostart,	g_raid_tr_iostart_raid1),
 	KOBJMETHOD(g_raid_tr_iodone,	g_raid_tr_iodone_raid1),
-	KOBJMETHOD(g_raid_tr_kerneldump,	g_raid_tr_kerneldump_raid1),
+	KOBJMETHOD(g_raid_tr_kerneldump, g_raid_tr_kerneldump_raid1),
 	KOBJMETHOD(g_raid_tr_locked,	g_raid_tr_locked_raid1),
+	KOBJMETHOD(g_raid_tr_idle,	g_raid_tr_idle_raid1),
 	KOBJMETHOD(g_raid_tr_free,	g_raid_tr_free_raid1),
 	{ 0, 0 }
 };
@@ -199,27 +191,6 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 }
 
 static void
-g_raid_tr_raid1_resync_some(struct g_raid_tr_object *tr,
-    struct g_raid_subdisk *sd)
-{
-	panic("We don't implement resync yet");
-}
-
-static void
-g_raid_tr_raid1_idle_rebuild(struct g_raid_volume *vol, void *argp)
-{
-	struct g_raid_tr_raid1_object *trs;
-
-	trs = (struct g_raid_tr_raid1_object *)argp;
-	if (trs->trso_failed_sd == NULL) {
-		printf("I hit the case that's obsolete, right?\n");
-		return;
-	}
-	g_raid_event_send(trs->trso_failed_sd, G_RAID_SUBDISK_E_TR_REBUILD_SOME,
-	    G_RAID_EVENT_SUBDISK);
-}
-
-static void
 g_raid_tr_raid1_rebuild_finish(struct g_raid_tr_object *tr, struct g_raid_volume *vol)
 {
 	struct g_raid_tr_raid1_object *trs;
@@ -237,7 +208,6 @@ g_raid_tr_raid1_rebuild_finish(struct g_
 	trs->trso_recover_slabs = 0;
 	trs->trso_failed_sd = NULL;
 	trs->trso_buffer = NULL;
-	vol->v_timeout = 0;
 }
 
 static void
@@ -258,7 +228,6 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
 	trs->trso_recover_slabs = 0;
 	trs->trso_failed_sd = NULL;
 	trs->trso_buffer = NULL;
-	vol->v_timeout = 0;
 }
 
 static struct g_raid_subdisk *
@@ -308,8 +277,6 @@ g_raid_tr_raid1_rebuild_start(struct g_r
 	trs->trso_type = TR_RAID1_REBUILD;
 	trs->trso_buffer = malloc(SD_REBUILD_SLAB, M_TR_raid1, M_WAITOK);
 	trs->trso_meta_update = SD_REBUILD_META_UPDATE;
-	vol->v_to_arg = trs;
-	vol->v_timeout = g_raid_tr_raid1_idle_rebuild;
 	g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
 }
 
@@ -373,12 +340,6 @@ g_raid_tr_event_raid1(struct g_raid_tr_o
 			g_raid_tr_raid1_rebuild_abort(tr, vol);
 		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE);
 		break;
-	case G_RAID_SUBDISK_E_TR_REBUILD_SOME:
-		g_raid_tr_raid1_rebuild_some(tr, sd);
-		break;
-	case G_RAID_SUBDISK_E_TR_RESYNC_SOME:
-		g_raid_tr_raid1_resync_some(tr, sd);
-		break;
 	}
 	g_raid_tr_update_state_raid1(vol);
 	return (0);
@@ -539,11 +500,8 @@ g_raid_tr_iostart_raid1(struct g_raid_tr
 	 */
 	if (trs->trso_failed_sd != NULL &&
 	    !(bp->bio_cflags & G_RAID_BIO_FLAG_SPECIAL)) {
-		if (--trs->trso_fair_io <= 0) {
-			g_raid_event_send(trs->trso_failed_sd,
-			    G_RAID_SUBDISK_E_TR_REBUILD_SOME,
-			    G_RAID_EVENT_SUBDISK);
-		}
+		if (--trs->trso_fair_io <= 0)
+			g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
 	}
 	switch (bp->bio_cmd) {
 	case BIO_READ:
@@ -862,6 +820,17 @@ g_raid_tr_locked_raid1(struct g_raid_tr_
 }
 
 static int
+g_raid_tr_idle_raid1(struct g_raid_tr_object *tr)
+{
+	struct g_raid_tr_raid1_object *trs;
+
+	trs = (struct g_raid_tr_raid1_object *)tr;
+	if (trs->trso_type == TR_RAID1_REBUILD)
+		g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
+	return (0);
+}
+
+static int
 g_raid_tr_free_raid1(struct g_raid_tr_object *tr)
 {
 	struct g_raid_tr_raid1_object *trs;

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 03:18:52 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 338DA106566B;
	Fri,  4 Feb 2011 03:18:52 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 20D858FC13;
	Fri,  4 Feb 2011 03:18:52 +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 p143IqUK067690;
	Fri, 4 Feb 2011 03:18:52 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p143Iq21067688;
	Fri, 4 Feb 2011 03:18:52 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040318.p143Iq21067688@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 03:18:52 +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: r218249 - 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: Fri, 04 Feb 2011 03:18:52 -0000

Author: imp
Date: Fri Feb  4 03:18:51 2011
New Revision: 218249
URL: http://svn.freebsd.org/changeset/base/218249

Log:
  More fussy formatting

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 03:10:57 2011	(r218248)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 03:18:51 2011	(r218249)
@@ -60,12 +60,12 @@ struct g_raid_tr_raid1_object {
 	int			 trso_starting;
 	int			 trso_stopped;
 	int			 trso_type;
-	int			 trso_recover_slabs; /* might need to be more */
+	int			 trso_recover_slabs; /* slabs before rest */
 	int			 trso_fair_io;
 	int			 trso_meta_update;
 	int			 trso_flags;
-	struct g_raid_subdisk	*trso_failed_sd;/* like per volume */
-	void			*trso_buffer;	/* Buffer space */
+	struct g_raid_subdisk	*trso_failed_sd; /* like per volume */
+	void			*trso_buffer;	 /* Buffer space */
 	struct bio		 trso_bio;
 };
 
@@ -109,7 +109,7 @@ static void g_raid_tr_raid1_maybe_rebuil
     struct g_raid_volume *vol);
 
 static int
-g_raid_tr_taste_raid1(struct g_raid_tr_object *tr, struct g_raid_volume *volume)
+g_raid_tr_taste_raid1(struct g_raid_tr_object *tr, struct g_raid_volume *vol)
 {
 	struct g_raid_tr_raid1_object *trs;
 
@@ -191,7 +191,8 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 }
 
 static void
-g_raid_tr_raid1_rebuild_finish(struct g_raid_tr_object *tr, struct g_raid_volume *vol)
+g_raid_tr_raid1_rebuild_finish(struct g_raid_tr_object *tr,
+    struct g_raid_volume *vol)
 {
 	struct g_raid_tr_raid1_object *trs;
 	struct g_raid_subdisk *sd;
@@ -216,11 +217,13 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
 {
 	struct g_raid_tr_raid1_object *trs;
 	struct g_raid_subdisk *sd;
+	off_t len;
 
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	sd = trs->trso_failed_sd;
 //	sd->sd_rebuild_pos = 0; /* We may need this here... */
-	g_raid_unlock_range(tr->tro_volume,sd->sd_rebuild_pos, SD_REBUILD_SLAB);
+	len = MIN(SD_REBUILD_SLAB, vol->v_mediasize - sd->sd_rebuild_pos);
+	g_raid_unlock_range(tr->tro_volume, sd->sd_rebuild_pos, len);
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
 	free(trs->trso_buffer, M_TR_raid1);
 	trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
@@ -254,9 +257,9 @@ g_raid_tr_raid1_find_failed_drive(struct
 }
 
 static void
-g_raid_tr_raid1_rebuild_start(struct g_raid_tr_object *tr, struct g_raid_volume *vol)
+g_raid_tr_raid1_rebuild_start(struct g_raid_tr_object *tr,
+    struct g_raid_volume *vol)
 {
-  /* XXX ---- XXX Should this be based on trs state or vol state? XXX --- XXX */
 	struct g_raid_tr_raid1_object *trs;
 	struct g_raid_subdisk *sd;
 
@@ -282,15 +285,16 @@ g_raid_tr_raid1_rebuild_start(struct g_r
 
 
 static void
-g_raid_tr_raid1_maybe_rebuild(struct g_raid_tr_object *tr, struct g_raid_volume *vol)
+g_raid_tr_raid1_maybe_rebuild(struct g_raid_tr_object *tr,
+    struct g_raid_volume *vol)
 {
 	struct g_raid_tr_raid1_object *trs;
 	int na, nr;
 	
 	/*
-	 * If we're stopped, don't do anything.  If we don't have at least
-	 * one good disk and one bad disk, we don't do anything.  And if there's
-	 * a 'good disk' stored in the trs, then we're in progress and we punt.
+	 * If we're stopped, don't do anything.  If we don't have at least one
+	 * good disk and one bad disk, we don't do anything.  And if there's a
+	 * 'good disk' stored in the trs, then we're in progress and we punt.
 	 * If we make it past all these checks, we need to rebuild.
 	 */
 	trs = (struct g_raid_tr_raid1_object *)tr;
@@ -398,7 +402,8 @@ g_raid_tr_iostart_raid1_read(struct g_ra
 	struct bio *cbp;
 
 	sd = g_raid_tr_raid1_select_read_disk(tr->tro_volume);
-	KASSERT(sd != NULL, ("No active disks in volume %s.", tr->tro_volume->v_name));
+	KASSERT(sd != NULL, ("No active disks in volume %s.",
+		tr->tro_volume->v_name));
 
 	cbp = g_clone_bio(bp);
 	if (cbp == NULL) {
@@ -535,20 +540,18 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 	pbp = bp->bio_parent;
 	if (bp->bio_cflags & G_RAID_BIO_FLAG_SYNC) {
 		/*
-		 * This operation is part of a rebuild or resync
-		 * operation.  See what work just got done, then
-		 * schedule the next bit of work, if any.
-		 * Rebuild/resync is done a little bit at a time.
-		 * Either when a timeout happens, or after we get a
-		 * bunch of I/Os to the disk (to make sure an active
-		 * system will complete in a sane amount of time).
+		 * This operation is part of a rebuild or resync operation.
+		 * See what work just got done, then schedule the next bit of
+		 * work, if any.  Rebuild/resync is done a little bit at a
+		 * time.  Either when a timeout happens, or after we get a
+		 * bunch of I/Os to the disk (to make sure an active system
+		 * will complete in a sane amount of time).
 		 *
-		 * We are setup to do differing amounts of work for
-		 * each of these cases.  so long as the slabs is
-		 * smallish (less than 50 or so, I'd guess, but that's
-		 * just a WAG), we shouldn't have any bio starvation
-		 * issues.  For active disks, we do 5MB of data, for
-		 * inactive ones, we do 50MB.
+		 * We are setup to do differing amounts of work for each of
+		 * these cases.  so long as the slabs is smallish (less than
+		 * 50 or so, I'd guess, but that's just a WAG), we shouldn't
+		 * have any bio starvation issues.  For active disks, we do
+		 * 5MB of data, for inactive ones, we do 50MB.
 		 */
 		if (trs->trso_type == TR_RAID1_REBUILD) {
 			vol = tr->tro_volume;
@@ -647,7 +650,8 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				cbp->bio_caller1 = good_sd;
 				G_RAID_LOGREQ(4, bp,
 				    "Rebuild read at %jd.", cbp->bio_offset);
-				g_raid_lock_range(sd->sd_volume,	/* Lock callback starts I/O */
+				/* Lock callback starts I/O */
+				g_raid_lock_range(sd->sd_volume,
 				    cbp->bio_offset, cbp->bio_length, cbp);
 			}
 		} else if (trs->trso_type == TR_RAID1_RESYNC) {
@@ -730,7 +734,8 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 			cbp->bio_caller1 = nsd;
 			G_RAID_LOGREQ(3, bp,
 			    "Attempting bad sector remap on failing drive.");
-			g_raid_lock_range(sd->sd_volume,	/* Lock callback starts I/O */
+			/* Lock callback starts I/O */
+			g_raid_lock_range(sd->sd_volume,
 			    cbp->bio_offset, cbp->bio_length, cbp);
 		}
 	}

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 03:30:29 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 388C41065673;
	Fri,  4 Feb 2011 03:30:29 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id E2E3E8FC08;
	Fri,  4 Feb 2011 03:30:28 +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 p143USj7067953;
	Fri, 4 Feb 2011 03:30:28 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p143US4T067951;
	Fri, 4 Feb 2011 03:30:28 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040330.p143US4T067951@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 03:30:28 +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: r218250 - 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: Fri, 04 Feb 2011 03:30:29 -0000

Author: imp
Date: Fri Feb  4 03:30:28 2011
New Revision: 218250
URL: http://svn.freebsd.org/changeset/base/218250

Log:
  move from #define to static variables for tunables

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 03:18:51 2011	(r218249)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 03:30:28 2011	(r218250)
@@ -41,11 +41,15 @@ __FBSDID("$FreeBSD$");
 #include "g_raid_tr_if.h"
 
 #define SD_READ_THRESHOLD 10 /* errors to cause a rebuild */
+static int sd_read_threshold = SD_READ_THRESHOLD;
 #define SD_REBUILD_SLAB	(1 << 20) /* One transation in a rebuild */
+static int sd_rebuild_slab = SD_REBUILD_SLAB;
 #define SD_REBUILD_FAIR_IO 20 /* use 1/x of the available I/O */
-#define SD_REBUILD_CLUSTER_BUSY 4
+static int sd_rebuild_fair_io = SD_REBUILD_FAIR_IO;
 #define SD_REBUILD_CLUSTER_IDLE 10
+static int sd_rebuild_cluster_idle = SD_REBUILD_CLUSTER_IDLE;
 #define SD_REBUILD_META_UPDATE 500 /* update meta data every 5 GB or so */
+static int sd_rebuild_meta_update = SD_REBUILD_META_UPDATE;
 
 static MALLOC_DEFINE(M_TR_raid1, "tr_raid1_data", "GEOM_RAID raid1 data");
 
@@ -174,7 +178,7 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 	bp = &trs->trso_bio;
 	memset(bp, 0, sizeof(*bp));
 	bp->bio_offset = sd->sd_rebuild_pos;
-	bp->bio_length = MIN(SD_REBUILD_SLAB,
+	bp->bio_length = MIN(sd_rebuild_slab,
 	    sd->sd_volume->v_mediasize - sd->sd_rebuild_pos);
 	bp->bio_data = trs->trso_buffer;
 	bp->bio_cmd = BIO_READ;
@@ -183,8 +187,8 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 		return;
 	bp2->bio_cflags = G_RAID_BIO_FLAG_SYNC;
 	bp2->bio_caller1 = good_sd;
-	trs->trso_recover_slabs = SD_REBUILD_CLUSTER_IDLE;
-	trs->trso_fair_io = SD_REBUILD_FAIR_IO;
+	trs->trso_recover_slabs = sd_rebuild_cluster_idle;
+	trs->trso_fair_io = sd_rebuild_fair_io;
 	trs->trso_flags |= TR_RAID1_F_DOING_SOME;
 	g_raid_lock_range(sd->sd_volume,	/* Lock callback starts I/O */
 	    bp2->bio_offset, bp2->bio_length, bp2);
@@ -222,7 +226,7 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	sd = trs->trso_failed_sd;
 //	sd->sd_rebuild_pos = 0; /* We may need this here... */
-	len = MIN(SD_REBUILD_SLAB, vol->v_mediasize - sd->sd_rebuild_pos);
+	len = MIN(sd_rebuild_slab, vol->v_mediasize - sd->sd_rebuild_pos);
 	g_raid_unlock_range(tr->tro_volume, sd->sd_rebuild_pos, len);
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
 	free(trs->trso_buffer, M_TR_raid1);
@@ -278,8 +282,8 @@ g_raid_tr_raid1_rebuild_start(struct g_r
 	G_RAID_DEBUG(2, "Kicking off a rebuild at %jd...",
 	    trs->trso_failed_sd->sd_rebuild_pos);
 	trs->trso_type = TR_RAID1_REBUILD;
-	trs->trso_buffer = malloc(SD_REBUILD_SLAB, M_TR_raid1, M_WAITOK);
-	trs->trso_meta_update = SD_REBUILD_META_UPDATE;
+	trs->trso_buffer = malloc(sd_rebuild_slab, M_TR_raid1, M_WAITOK);
+	trs->trso_meta_update = sd_rebuild_meta_update;
 	g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
 }
 
@@ -592,11 +596,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				 * The write operation just finished.  Do
 				 * another.  We keep cloning the master bio
 				 * since it has the right buffers allocated to
-				 * it.  We'll free it when slabs get to 0.
-				 * We'll also tie up SD_REBUILD_CLUSTER * 2 +
-				 * 1 bios from the pool.  Since
-				 * SD_REBUILD_CLUSTER should be small, that
-				 * shouldn't be a problem.
+				 * it.
 				 */
 				G_RAID_LOGREQ(4, bp,
 				    "rebuild write done. Error %d", bp->bio_error);
@@ -619,7 +619,8 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 					if (--trs->trso_meta_update <= 0) {
 						g_raid_write_metadata(vol->v_softc,
 						    vol, nsd, nsd->sd_disk);
-						trs->trso_meta_update = SD_REBUILD_META_UPDATE;
+						trs->trso_meta_update =
+						    sd_rebuild_meta_update;
 					}
 					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
 					return;
@@ -645,7 +646,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				cbp->bio_cmd = BIO_READ;
 				cbp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
 				cbp->bio_offset = nsd->sd_rebuild_pos;
-				cbp->bio_length = MIN(SD_REBUILD_SLAB,
+				cbp->bio_length = MIN(sd_rebuild_slab,
 				    vol->v_mediasize - nsd->sd_rebuild_pos);
 				cbp->bio_caller1 = good_sd;
 				G_RAID_LOGREQ(4, bp,
@@ -683,7 +684,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 		 * everything to get it back in sync), or just degrade the
 		 * drive, which kicks off a resync?
 		 */
-		if (sd->sd_read_errs > SD_READ_THRESHOLD)
+		if (sd->sd_read_errs > sd_read_threshold)
 			g_raid_fail_disk(sd->sd_softc, sd, sd->sd_disk);
 
 		/*

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 04:00:25 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 101F41065693;
	Fri,  4 Feb 2011 04:00:25 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id F21338FC13;
	Fri,  4 Feb 2011 04:00:24 +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 p1440OHJ068612;
	Fri, 4 Feb 2011 04:00:24 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p1440OSk068610;
	Fri, 4 Feb 2011 04:00:24 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040400.p1440OSk068610@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 04:00:24 +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: r218251 - 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: Fri, 04 Feb 2011 04:00:25 -0000

Author: imp
Date: Fri Feb  4 04:00:24 2011
New Revision: 218251
URL: http://svn.freebsd.org/changeset/base/218251

Log:
  Finish converting #defines to sysctl/tunables.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 03:30:28 2011	(r218250)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 04:00:24 2011	(r218251)
@@ -35,21 +35,54 @@ __FBSDID("$FreeBSD$");
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include "geom/raid/g_raid.h"
 #include "g_raid_tr_if.h"
 
-#define SD_READ_THRESHOLD 10 /* errors to cause a rebuild */
-static int sd_read_threshold = SD_READ_THRESHOLD;
-#define SD_REBUILD_SLAB	(1 << 20) /* One transation in a rebuild */
-static int sd_rebuild_slab = SD_REBUILD_SLAB;
-#define SD_REBUILD_FAIR_IO 20 /* use 1/x of the available I/O */
-static int sd_rebuild_fair_io = SD_REBUILD_FAIR_IO;
-#define SD_REBUILD_CLUSTER_IDLE 10
-static int sd_rebuild_cluster_idle = SD_REBUILD_CLUSTER_IDLE;
-#define SD_REBUILD_META_UPDATE 500 /* update meta data every 5 GB or so */
-static int sd_rebuild_meta_update = SD_REBUILD_META_UPDATE;
+SYSCTL_DECL(_kern_geom_raid);
+SYSCTL_NODE(_kern_geom_raid, OID_AUTO, raid1, CTLFLAG_RW, 0,
+    "RAID1 parameters");
+
+#define RAID1_READ_ERR_THRESH 10 /* errors to cause a rebuild */
+static int g_raid1_read_err_thresh = RAID1_READ_ERR_THRESH;
+TUNABLE_INT("kern.geom.raid.raid1.read_err_thresh", &g_raid1_read_err_thresh);
+SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, read_err_thresh, CTLFLAG_RW,
+    &g_raid1_read_err_thresh, RAID1_READ_ERR_THRESH,
+    "Number of read errors on a subdisk that trigger a rebuild");
+
+#define RAID1_REBUILD_SLAB	(1 << 20) /* One transation in a rebuild */
+static int g_raid1_rebuild_slab = RAID1_REBUILD_SLAB;
+TUNABLE_INT("kern.geom.raid.raid1.rebuild_slab_size",
+    &g_raid1_rebuild_slab);
+SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_slab_size, CTLFLAG_RW,
+    &g_raid1_rebuild_slab, RAID1_REBUILD_SLAB,
+    "Amount of the disk to rebuild each read/write cycle of the rebuild.");
+
+#define RAID1_REBUILD_FAIR_IO 20 /* use 1/x of the available I/O */
+static int g_raid1_rebuild_fair_io = RAID1_REBUILD_FAIR_IO;
+TUNABLE_INT("kern.geom.raid.raid1.rebuild_fair_io",
+    &g_raid1_rebuild_slab);
+SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_fair_io, CTLFLAG_RW,
+    &g_raid1_rebuild_fair_io, RAID1_REBUILD_FAIR_IO,
+    "Fraction of the I/O bandwidth to use when disk busy for rebuild.");
+
+#define RAID1_REBUILD_CLUSTER_IDLE 10
+static int g_raid1_rebuild_cluster_idle = RAID1_REBUILD_CLUSTER_IDLE;
+TUNABLE_INT("kern.geom.raid.raid1.rebuild_cluster_idle",
+    &g_raid1_rebuild_slab);
+SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_cluster_idle, CTLFLAG_RW,
+    &g_raid1_rebuild_cluster_idle, RAID1_REBUILD_CLUSTER_IDLE,
+    "Number of slabs to do each time we trigger a rebuild cycle");
+
+#define RAID1_REBUILD_META_UPDATE 500 /* update meta data every 5 GB or so */
+static int g_raid1_rebuild_meta_update = RAID1_REBUILD_META_UPDATE;
+TUNABLE_INT("kern.geom.raid.raid1.rebuild_meta_update",
+    &g_raid1_rebuild_slab);
+SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_meta_update, CTLFLAG_RW,
+    &g_raid1_rebuild_meta_update, RAID1_REBUILD_META_UPDATE,
+    "When to update the meta data.");
 
 static MALLOC_DEFINE(M_TR_raid1, "tr_raid1_data", "GEOM_RAID raid1 data");
 
@@ -178,7 +211,7 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 	bp = &trs->trso_bio;
 	memset(bp, 0, sizeof(*bp));
 	bp->bio_offset = sd->sd_rebuild_pos;
-	bp->bio_length = MIN(sd_rebuild_slab,
+	bp->bio_length = MIN(g_raid1_rebuild_slab,
 	    sd->sd_volume->v_mediasize - sd->sd_rebuild_pos);
 	bp->bio_data = trs->trso_buffer;
 	bp->bio_cmd = BIO_READ;
@@ -187,8 +220,8 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 		return;
 	bp2->bio_cflags = G_RAID_BIO_FLAG_SYNC;
 	bp2->bio_caller1 = good_sd;
-	trs->trso_recover_slabs = sd_rebuild_cluster_idle;
-	trs->trso_fair_io = sd_rebuild_fair_io;
+	trs->trso_recover_slabs = g_raid1_rebuild_cluster_idle;
+	trs->trso_fair_io = g_raid1_rebuild_fair_io;
 	trs->trso_flags |= TR_RAID1_F_DOING_SOME;
 	g_raid_lock_range(sd->sd_volume,	/* Lock callback starts I/O */
 	    bp2->bio_offset, bp2->bio_length, bp2);
@@ -226,7 +259,7 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	sd = trs->trso_failed_sd;
 //	sd->sd_rebuild_pos = 0; /* We may need this here... */
-	len = MIN(sd_rebuild_slab, vol->v_mediasize - sd->sd_rebuild_pos);
+	len = MIN(g_raid1_rebuild_slab, vol->v_mediasize - sd->sd_rebuild_pos);
 	g_raid_unlock_range(tr->tro_volume, sd->sd_rebuild_pos, len);
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
 	free(trs->trso_buffer, M_TR_raid1);
@@ -282,8 +315,8 @@ g_raid_tr_raid1_rebuild_start(struct g_r
 	G_RAID_DEBUG(2, "Kicking off a rebuild at %jd...",
 	    trs->trso_failed_sd->sd_rebuild_pos);
 	trs->trso_type = TR_RAID1_REBUILD;
-	trs->trso_buffer = malloc(sd_rebuild_slab, M_TR_raid1, M_WAITOK);
-	trs->trso_meta_update = sd_rebuild_meta_update;
+	trs->trso_buffer = malloc(g_raid1_rebuild_slab, M_TR_raid1, M_WAITOK);
+	trs->trso_meta_update = g_raid1_rebuild_meta_update;
 	g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
 }
 
@@ -620,7 +653,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 						g_raid_write_metadata(vol->v_softc,
 						    vol, nsd, nsd->sd_disk);
 						trs->trso_meta_update =
-						    sd_rebuild_meta_update;
+						    g_raid1_rebuild_meta_update;
 					}
 					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
 					return;
@@ -646,7 +679,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				cbp->bio_cmd = BIO_READ;
 				cbp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
 				cbp->bio_offset = nsd->sd_rebuild_pos;
-				cbp->bio_length = MIN(sd_rebuild_slab,
+				cbp->bio_length = MIN(g_raid1_rebuild_slab,
 				    vol->v_mediasize - nsd->sd_rebuild_pos);
 				cbp->bio_caller1 = good_sd;
 				G_RAID_LOGREQ(4, bp,
@@ -684,7 +717,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 		 * everything to get it back in sync), or just degrade the
 		 * drive, which kicks off a resync?
 		 */
-		if (sd->sd_read_errs > sd_read_threshold)
+		if (sd->sd_read_errs > g_raid1_read_err_thresh)
 			g_raid_fail_disk(sd->sd_softc, sd, sd->sd_disk);
 
 		/*

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 04:56:07 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 CDD27106564A;
	Fri,  4 Feb 2011 04:56:07 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id BC6308FC08;
	Fri,  4 Feb 2011 04:56:07 +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 p144u7SB069932;
	Fri, 4 Feb 2011 04:56:07 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p144u7bQ069930;
	Fri, 4 Feb 2011 04:56:07 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040456.p144u7bQ069930@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 04:56:07 +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: r218252 - 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: Fri, 04 Feb 2011 04:56:07 -0000

Author: imp
Date: Fri Feb  4 04:56:07 2011
New Revision: 218252
URL: http://svn.freebsd.org/changeset/base/218252

Log:
  Simplify the recovery case.  There's no real reason to clone the bios
  as we read/write the data: we're not doing anything in parallel and
  we're not servicing these bios on behalf of somene else whose original
  bios need to be preserved.  This simplifies the code a bit, and plugs
  at least one error condition that was overlooked when I de-leaked this
  code.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 04:00:24 2011	(r218251)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 04:56:07 2011	(r218252)
@@ -198,7 +198,7 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 {
 	struct g_raid_tr_raid1_object *trs;
 	struct g_raid_subdisk *good_sd;
-	struct bio *bp, *bp2;
+	struct bio *bp;
 
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	if (trs->trso_flags & TR_RAID1_F_DOING_SOME)
@@ -215,16 +215,13 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 	    sd->sd_volume->v_mediasize - sd->sd_rebuild_pos);
 	bp->bio_data = trs->trso_buffer;
 	bp->bio_cmd = BIO_READ;
-	bp2 = g_clone_bio(bp);
-	if (bp2 == NULL)	/* We'll try again later */
-		return;
-	bp2->bio_cflags = G_RAID_BIO_FLAG_SYNC;
-	bp2->bio_caller1 = good_sd;
+	bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
+	bp->bio_caller1 = good_sd;
 	trs->trso_recover_slabs = g_raid1_rebuild_cluster_idle;
 	trs->trso_fair_io = g_raid1_rebuild_fair_io;
 	trs->trso_flags |= TR_RAID1_F_DOING_SOME;
 	g_raid_lock_range(sd->sd_volume,	/* Lock callback starts I/O */
-	    bp2->bio_offset, bp2->bio_length, bp2);
+	   bp->bio_offset, bp->bio_length, bp);
 }
 
 static void
@@ -592,7 +589,6 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 		 */
 		if (trs->trso_type == TR_RAID1_REBUILD) {
 			vol = tr->tro_volume;
-			pbp->bio_inbed++;
 			if (bp->bio_cmd == BIO_READ) {
 				/*
 				 * The read operation finished, queue the
@@ -604,26 +600,12 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 					g_raid_tr_raid1_rebuild_abort(tr, vol);
 					return;
 				}
-				cbp = g_clone_bio(pbp);
-				if (cbp == NULL) {
-					/*
-					 * By flagging that we're not doing
-					 * anything, we'll pick up the rebuild
-					 * at a later point either by timeout
-					 * or when we steal a small part of
-					 * the active I/O.
-					 */
-					g_destroy_bio(bp); /* reuse? */
-					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
-					return;
-				}
-				cbp->bio_cmd = BIO_WRITE;
-				cbp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
-				cbp->bio_offset = bp->bio_offset;
-				cbp->bio_length = bp->bio_length;
+				bp->bio_cmd = BIO_WRITE;
+				bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
+				bp->bio_offset = bp->bio_offset;
+				bp->bio_length = bp->bio_length;
 				G_RAID_LOGREQ(4, bp, "Queueing reguild write.");
-				g_destroy_bio(bp); /* reuse? */
-				g_raid_subdisk_iostart(trs->trso_failed_sd, cbp);
+				g_raid_subdisk_iostart(trs->trso_failed_sd, bp);
 			} else {
 				/*
 				 * The write operation just finished.  Do
@@ -635,15 +617,13 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				    "rebuild write done. Error %d", bp->bio_error);
 				if (bp->bio_error != 0) {
 					g_raid_tr_raid1_rebuild_abort(tr, vol);
-					g_destroy_bio(bp); /* reuse? */
 					return;
 				}
-				g_destroy_bio(bp); /* reuse? */
 /* XXX A lot of the following is needed when we kick of the work -- refactor */
 				nsd = trs->trso_failed_sd;
 				g_raid_unlock_range(sd->sd_volume,
 				    bp->bio_offset, bp->bio_length);
-				nsd->sd_rebuild_pos += pbp->bio_length;
+				nsd->sd_rebuild_pos += bp->bio_length;
 				if (nsd->sd_rebuild_pos >= vol->v_mediasize) {
 					g_raid_tr_raid1_rebuild_finish(tr, vol);
 					return;
@@ -663,30 +643,17 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 					g_raid_tr_raid1_rebuild_abort(tr, vol);
 					return;
 				}
-				pbp->bio_offset = nsd->sd_rebuild_pos;
-				cbp = g_clone_bio(pbp);
-				if (cbp == NULL) {
-					/*
-					 * By flagging that we're not doing
-					 * anything, we'll pick up the rebuild
-					 * at a later point either by timeout
-					 * or when we steal a small part of
-					 * the active I/O.
-					 */
-					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
-					return;
-				}
-				cbp->bio_cmd = BIO_READ;
-				cbp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
-				cbp->bio_offset = nsd->sd_rebuild_pos;
-				cbp->bio_length = MIN(g_raid1_rebuild_slab,
+				bp->bio_cmd = BIO_READ;
+				bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
+				bp->bio_offset = nsd->sd_rebuild_pos;
+				bp->bio_length = MIN(g_raid1_rebuild_slab,
 				    vol->v_mediasize - nsd->sd_rebuild_pos);
-				cbp->bio_caller1 = good_sd;
+				bp->bio_caller1 = good_sd;
 				G_RAID_LOGREQ(4, bp,
-				    "Rebuild read at %jd.", cbp->bio_offset);
+				    "Rebuild read at %jd.", bp->bio_offset);
 				/* Lock callback starts I/O */
 				g_raid_lock_range(sd->sd_volume,
-				    cbp->bio_offset, cbp->bio_length, cbp);
+				    bp->bio_offset, bp->bio_length, bp);
 			}
 		} else if (trs->trso_type == TR_RAID1_RESYNC) {
 			/*

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 07:02:36 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 288ED106566C;
	Fri,  4 Feb 2011 07:02:35 +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 D52F58FC0A;
	Fri,  4 Feb 2011 07:02:35 +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 p1472ZiT072639;
	Fri, 4 Feb 2011 07:02:35 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p1472ZZ0072637;
	Fri, 4 Feb 2011 07:02:35 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102040702.p1472ZZ0072637@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 07:02:35 +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: r218253 - 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: Fri, 04 Feb 2011 07:02:36 -0000

Author: mav
Date: Fri Feb  4 07:02:35 2011
New Revision: 218253
URL: http://svn.freebsd.org/changeset/base/218253

Log:
  Idle worker thread does not guarantee idle volume. Check for inflight
  requests also.

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 04:56:07 2011	(r218252)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 07:02:35 2011	(r218253)
@@ -1204,7 +1204,8 @@ process:
 			TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
 				if (vol->v_writes == 0 && !vol->v_idle)
 					g_raid_idle(vol, -1);
-				if (vol->v_tr)
+				if (bioq_first(&vol->v_inflight) == NULL &&
+				    vol->v_tr)
 					G_RAID_TR_IDLE(vol->v_tr);
 			}
 		}
@@ -1634,6 +1635,8 @@ int g_raid_start_volume(struct g_raid_vo
 		    G_RAID_EVENT_VOLUME);
 		return (-1);
 	}
+	G_RAID_DEBUG(2, "Transformation module %s chosen for %s.",
+	    class->name, vol->v_name);
 	vol->v_tr = obj;
 	return (0);
 }

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 07:15:39 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 6ABDC106566C;
	Fri,  4 Feb 2011 07:15:39 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 5A8BA8FC0A;
	Fri,  4 Feb 2011 07:15:39 +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 p147Fd5L072966;
	Fri, 4 Feb 2011 07:15:39 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p147FdPt072964;
	Fri, 4 Feb 2011 07:15:39 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201102040715.p147FdPt072964@svn.freebsd.org>
From: Warner Losh 
Date: Fri, 4 Feb 2011 07:15:39 +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: r218254 - 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: Fri, 04 Feb 2011 07:15:39 -0000

Author: imp
Date: Fri Feb  4 07:15:39 2011
New Revision: 218254
URL: http://svn.freebsd.org/changeset/base/218254

Log:
  Minor refactoring

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 07:02:35 2011	(r218253)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 07:15:39 2011	(r218254)
@@ -225,17 +225,13 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
 }
 
 static void
-g_raid_tr_raid1_rebuild_finish(struct g_raid_tr_object *tr,
+g_raid_tr_raid1_rebuild_done(struct g_raid_tr_raid1_object *trs,
     struct g_raid_volume *vol)
 {
-	struct g_raid_tr_raid1_object *trs;
 	struct g_raid_subdisk *sd;
 
-	trs = (struct g_raid_tr_raid1_object *)tr;
 	sd = trs->trso_failed_sd;
 	sd->sd_rebuild_pos = 0;
-	g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
-	g_raid_tr_update_state_raid1(vol);
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
 	free(trs->trso_buffer, M_TR_raid1);
 	trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
@@ -246,6 +242,20 @@ g_raid_tr_raid1_rebuild_finish(struct g_
 }
 
 static void
+g_raid_tr_raid1_rebuild_finish(struct g_raid_tr_object *tr,
+    struct g_raid_volume *vol)
+{
+	struct g_raid_tr_raid1_object *trs;
+	struct g_raid_subdisk *sd;
+
+	trs = (struct g_raid_tr_raid1_object *)tr;
+	sd = trs->trso_failed_sd;
+	g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
+	g_raid_tr_update_state_raid1(vol);
+	g_raid_tr_raid1_rebuild_done(trs, vol);
+}
+
+static void
 g_raid_tr_raid1_rebuild_abort(struct g_raid_tr_object *tr,
     struct g_raid_volume *vol)
 {
@@ -255,16 +265,9 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
 
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	sd = trs->trso_failed_sd;
-//	sd->sd_rebuild_pos = 0; /* We may need this here... */
 	len = MIN(g_raid1_rebuild_slab, vol->v_mediasize - sd->sd_rebuild_pos);
 	g_raid_unlock_range(tr->tro_volume, sd->sd_rebuild_pos, len);
-	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
-	free(trs->trso_buffer, M_TR_raid1);
-	trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
-	trs->trso_type = TR_RAID1_NONE;
-	trs->trso_recover_slabs = 0;
-	trs->trso_failed_sd = NULL;
-	trs->trso_buffer = NULL;
+	g_raid_tr_raid1_rebuild_done(trs, vol);
 }
 
 static struct g_raid_subdisk *
@@ -614,13 +617,16 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 				 * it.
 				 */
 				G_RAID_LOGREQ(4, bp,
-				    "rebuild write done. Error %d", bp->bio_error);
+				    "rebuild write done. Error %d",
+				    bp->bio_error);
+				nsd = trs->trso_failed_sd;
 				if (bp->bio_error != 0) {
+					g_raid_fail_disk(sd->sd_softc, nsd,
+					    nsd->sd_disk);
 					g_raid_tr_raid1_rebuild_abort(tr, vol);
 					return;
 				}
 /* XXX A lot of the following is needed when we kick of the work -- refactor */
-				nsd = trs->trso_failed_sd;
 				g_raid_unlock_range(sd->sd_volume,
 				    bp->bio_offset, bp->bio_length);
 				nsd->sd_rebuild_pos += bp->bio_length;

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 08:11:44 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 5D9AE106566B;
	Fri,  4 Feb 2011 08:11:44 +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 4D4C38FC16;
	Fri,  4 Feb 2011 08:11:44 +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 p148Bihv074248;
	Fri, 4 Feb 2011 08:11:44 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p148BiL5074244;
	Fri, 4 Feb 2011 08:11:44 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102040811.p148BiL5074244@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 08:11:44 +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: r218255 - 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: Fri, 04 Feb 2011 08:11:44 -0000

Author: mav
Date: Fri Feb  4 08:11:44 2011
New Revision: 218255
URL: http://svn.freebsd.org/changeset/base/218255

Log:
  Rename v_idle to v_dirty, which is closer to it's meaning.
  Clean volume doesn't mean idle volume.

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

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 07:15:39 2011	(r218254)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 08:11:44 2011	(r218255)
@@ -63,10 +63,10 @@ u_int g_raid_start_timeout = 4;
 TUNABLE_INT("kern.geom.raid.start_timeout", &g_raid_start_timeout);
 SYSCTL_UINT(_kern_geom_raid, OID_AUTO, timeout, CTLFLAG_RW, &g_raid_start_timeout,
     0, "Time to wait on all mirror components");
-static u_int g_raid_idletime = 5;
-TUNABLE_INT("kern.geom.raid.idletime", &g_raid_idletime);
-SYSCTL_UINT(_kern_geom_raid, OID_AUTO, idletime, CTLFLAG_RW,
-    &g_raid_idletime, 0, "Mark components as clean when idling");
+static u_int g_raid_cleantime = 5;
+TUNABLE_INT("kern.geom.raid.cleantime", &g_raid_cleantime);
+SYSCTL_UINT(_kern_geom_raid, OID_AUTO, cleantime, CTLFLAG_RW,
+    &g_raid_cleantime, 0, "Mark volume as clean when idling");
 static u_int g_raid_disconnect_on_failure = 1;
 TUNABLE_INT("kern.geom.raid.disconnect_on_failure",
     &g_raid_disconnect_on_failure);
@@ -660,7 +660,7 @@ g_raid_orphan(struct g_consumer *cp)
 }
 
 static int
-g_raid_idle(struct g_raid_volume *vol, int acw)
+g_raid_clean(struct g_raid_volume *vol, int acw)
 {
 	struct g_raid_softc *sc;
 	int timeout;
@@ -671,17 +671,17 @@ g_raid_idle(struct g_raid_volume *vol, i
 
 //	if ((sc->sc_flags & G_RAID_DEVICE_FLAG_NOFAILSYNC) != 0)
 //		return (0);
-	if (vol->v_idle)
+	if (!vol->v_dirty)
 		return (0);
 	if (vol->v_writes > 0)
 		return (0);
 	if (acw > 0 || (acw == -1 &&
 	    vol->v_provider != NULL && vol->v_provider->acw > 0)) {
-		timeout = g_raid_idletime - (time_uptime - vol->v_last_write);
+		timeout = g_raid_cleantime - (time_uptime - vol->v_last_write);
 		if (timeout > 0)
 			return (timeout);
 	}
-	vol->v_idle = 1;
+	vol->v_dirty = 0;
 	G_RAID_DEBUG(1, "Volume %s (node %s) marked as clean.",
 	    vol->v_name, sc->sc_name);
 	g_raid_write_metadata(sc, vol, NULL, NULL);
@@ -689,7 +689,7 @@ g_raid_idle(struct g_raid_volume *vol, i
 }
 
 static void
-g_raid_unidle(struct g_raid_volume *vol)
+g_raid_dirty(struct g_raid_volume *vol)
 {
 	struct g_raid_softc *sc;
 
@@ -699,7 +699,7 @@ g_raid_unidle(struct g_raid_volume *vol)
 
 //	if ((sc->sc_flags & G_RAID_DEVICE_FLAG_NOFAILSYNC) != 0)
 //		return;
-	vol->v_idle = 0;
+	vol->v_dirty = 1;
 	G_RAID_DEBUG(1, "Volume %s (node %s) marked as dirty.",
 	    vol->v_name, sc->sc_name);
 	g_raid_write_metadata(sc, vol, NULL, NULL);
@@ -897,8 +897,8 @@ g_raid_start_request(struct bio *bp)
 	 * update the idle stats for the volume.
 	 */
 	if (bp->bio_cmd == BIO_WRITE || bp->bio_cmd == BIO_DELETE) {
-		if (vol->v_idle)
-			g_raid_unidle(vol);
+		if (!vol->v_dirty)
+			g_raid_dirty(vol);
 		vol->v_writes++;
 	}
 
@@ -1202,8 +1202,8 @@ process:
 		}
 		if (rv == EWOULDBLOCK) {
 			TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
-				if (vol->v_writes == 0 && !vol->v_idle)
-					g_raid_idle(vol, -1);
+				if (vol->v_writes == 0 && vol->v_dirty)
+					g_raid_clean(vol, -1);
 				if (bioq_first(&vol->v_inflight) == NULL &&
 				    vol->v_tr)
 					G_RAID_TR_IDLE(vol->v_tr);
@@ -1478,8 +1478,8 @@ g_raid_access(struct g_provider *pp, int
 		error = ENXIO;
 		goto out;
 	}
-	if (dcw == 0 && !vol->v_idle)
-		g_raid_idle(vol, dcw);
+	if (dcw == 0 && vol->v_dirty)
+		g_raid_clean(vol, dcw);
 	vol->v_provider_open += acr + acw + ace;
 	/* Handle delayed node destruction. */
 	if (sc->sc_stopping == G_RAID_DESTROY_DELAYED &&
@@ -1561,7 +1561,6 @@ g_raid_create_volume(struct g_raid_softc
 	bioq_init(&vol->v_inflight);
 	bioq_init(&vol->v_locked);
 	LIST_INIT(&vol->v_locks);
-	vol->v_idle = 1;
 	for (i = 0; i < G_RAID_MAX_SUBDISKS; i++) {
 		vol->v_subdisks[i].sd_softc = sc;
 		vol->v_subdisks[i].sd_volume = vol;

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 07:15:39 2011	(r218254)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 08:11:44 2011	(r218255)
@@ -227,7 +227,7 @@ struct g_raid_volume {
 	struct bio_queue_head	 v_locked;	/* Blocked I/O requests. */
 	LIST_HEAD(, g_raid_lock) v_locks;	 /* List of locked regions. */
 	int			 v_pending_lock; /* writes to locked region */
-	int			 v_idle;	/* DIRTY flags removed. */
+	int			 v_dirty;	/* Volume is DIRTY. */
 	time_t			 v_last_write;	/* Time of the last write. */
 	u_int			 v_writes;	/* Number of active writes. */
 	struct root_hold_token	*v_rootmount;	/* Root mount delay token. */

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb  4 07:15:39 2011	(r218254)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb  4 08:11:44 2011	(r218255)
@@ -1989,7 +1989,7 @@ g_raid_md_write_intel(struct g_raid_md_o
 			mvol->migr_type = INTEL_MT_REPAIR;
 		} else
 			mvol->migr_state = 0;
-		mvol->dirty = !vol->v_idle;
+		mvol->dirty = vol->v_dirty;
 
 		mmap0 = intel_get_map(mvol, 0);
 

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 09:15:12 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 C57971065674;
	Fri,  4 Feb 2011 09:15:12 +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 7DC258FC17;
	Fri,  4 Feb 2011 09:15:12 +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 p149FCrK075821;
	Fri, 4 Feb 2011 09:15:12 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p149FCDU075819;
	Fri, 4 Feb 2011 09:15:12 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102040915.p149FCDU075819@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 09:15:12 +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: r218257 - projects/graid/head/sys/geom
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: Fri, 04 Feb 2011 09:15:12 -0000

Author: mav
Date: Fri Feb  4 09:15:12 2011
New Revision: 218257
URL: http://svn.freebsd.org/changeset/base/218257

Log:
  Do not use provider private field for storing softc pointer. Provider can
  be destroyed by disk_gone(), which is called while holding lock and makes
  impossible to destroy sysctl context or reliably queue destruction.
  New implementation adds one more pointer dereference, but IMHO it is
  better then expose internal kitchen to the public API.

Modified:
  projects/graid/head/sys/geom/geom_disk.c

Modified: projects/graid/head/sys/geom/geom_disk.c
==============================================================================
--- projects/graid/head/sys/geom/geom_disk.c	Fri Feb  4 08:51:45 2011	(r218256)
+++ projects/graid/head/sys/geom/geom_disk.c	Fri Feb  4 09:15:12 2011	(r218257)
@@ -129,9 +129,8 @@ g_disk_access(struct g_provider *pp, int
 	g_trace(G_T_ACCESS, "g_disk_access(%s, %d, %d, %d)",
 	    pp->name, r, w, e);
 	g_topology_assert();
-	dp = pp->geom->softc;
-	sc = pp->private;
-	if (dp == NULL || dp->d_destroyed || sc == NULL) {
+	sc = pp->geom->softc;
+	if (sc == NULL || (dp = sc->dp) == NULL || dp->d_destroyed) {
 		/*
 		 * Allow decreasing access count even if disk is not
 		 * avaliable anymore.
@@ -204,31 +203,27 @@ g_disk_kerneldump(struct bio *bp, struct
 }
 
 static void
-g_disk_setstate(struct bio *bp, struct disk *dp)
+g_disk_setstate(struct bio *bp, struct g_disk_softc *sc)
 {
-	struct g_disk_softc *sc;
 	const char *cmd;
 
-	sc = bp->bio_to->private;
-	if (sc != NULL) {
-		memcpy(&sc->state, bp->bio_data, sizeof(sc->state));
-		if (sc->led[0] != 0) {
-			switch (sc->state) {
-			case G_STATE_FAILED:
-				cmd = "1";
-				break;
-			case G_STATE_REBUILD:
-				cmd = "f5";
-				break;
-			case G_STATE_RESYNC:
-				cmd = "f1";
-				break;
-			default:
-				cmd = "0";
-				break;
-			}
-			led_set(sc->led, cmd);
+	memcpy(&sc->state, bp->bio_data, sizeof(sc->state));
+	if (sc->led[0] != 0) {
+		switch (sc->state) {
+		case G_STATE_FAILED:
+			cmd = "1";
+			break;
+		case G_STATE_REBUILD:
+			cmd = "f5";
+			break;
+		case G_STATE_RESYNC:
+			cmd = "f1";
+			break;
+		default:
+			cmd = "0";
+			break;
 		}
+		led_set(sc->led, cmd);
 	}
 	g_io_deliver(bp, 0);
 }
@@ -238,6 +233,7 @@ g_disk_done(struct bio *bp)
 {
 	struct bio *bp2;
 	struct disk *dp;
+	struct g_disk_softc *sc;
 
 	/* See "notes" for why we need a mutex here */
 	/* XXX: will witness accept a mix of Giant/unGiant drivers here ? */
@@ -249,7 +245,8 @@ g_disk_done(struct bio *bp)
 		bp2->bio_error = bp->bio_error;
 	bp2->bio_completed += bp->bio_completed;
 	if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_DELETE)) &&
-	    (dp = bp2->bio_to->geom->softc)) {
+	    (sc = bp2->bio_to->geom->softc) &&
+	    (dp = sc->dp)) {
 		devstat_end_transaction_bio(dp->d_devstat, bp);
 	}
 	g_destroy_bio(bp);
@@ -266,10 +263,12 @@ g_disk_ioctl(struct g_provider *pp, u_lo
 {
 	struct g_geom *gp;
 	struct disk *dp;
+	struct g_disk_softc *sc;
 	int error;
 
 	gp = pp->geom;
-	dp = gp->softc;
+	sc = gp->softc;
+	dp = sc->dp;
 
 	if (dp->d_ioctl == NULL)
 		return (ENOIOCTL);
@@ -284,11 +283,12 @@ g_disk_start(struct bio *bp)
 {
 	struct bio *bp2, *bp3;
 	struct disk *dp;
+	struct g_disk_softc *sc;
 	int error;
 	off_t off;
 
-	dp = bp->bio_to->geom->softc;
-	if (dp == NULL || dp->d_destroyed) {
+	sc = bp->bio_to->geom->softc;
+	if (sc == NULL || (dp = sc->dp) == NULL || dp->d_destroyed) {
 		g_io_deliver(bp, ENXIO);
 		return;
 	}
@@ -368,7 +368,7 @@ g_disk_start(struct bio *bp)
 		else if (!strcmp(bp->bio_attribute, "GEOM::kerneldump"))
 			g_disk_kerneldump(bp, dp);
 		else if (!strcmp(bp->bio_attribute, "GEOM::setstate"))
-			g_disk_setstate(bp, dp);
+			g_disk_setstate(bp, sc);
 		else 
 			error = ENOIOCTL;
 		break;
@@ -403,9 +403,10 @@ static void
 g_disk_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp)
 {
 	struct disk *dp;
+	struct g_disk_softc *sc;
 
-	dp = gp->softc;
-	if (dp == NULL)
+	sc = gp->softc;
+	if (sc == NULL || (dp = sc->dp) == NULL)
 		return;
 	if (indent == NULL) {
 		sbuf_printf(sb, " hd %u", dp->d_fwheads);
@@ -433,8 +434,10 @@ g_disk_create(void *arg, int flag)
 		return;
 	g_topology_assert();
 	dp = arg;
+	sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
+	sc->dp = dp;
 	gp = g_new_geomf(&g_disk_class, "%s%d", dp->d_name, dp->d_unit);
-	gp->softc = dp;
+	gp->softc = sc;
 	pp = g_new_providerf(gp, "%s", gp->name);
 	pp->mediasize = dp->d_mediasize;
 	pp->sectorsize = dp->d_sectorsize;
@@ -444,8 +447,6 @@ g_disk_create(void *arg, int flag)
 	pp->stripesize = dp->d_stripesize;
 	if (bootverbose)
 		printf("GEOM: new disk %s\n", gp->name);
-	sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
-	sc->dp = dp;
 	sysctl_ctx_init(&sc->sysctl_ctx);
 	snprintf(tmpstr, sizeof(tmpstr), "GEOM disk %s", gp->name);
 	sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx,
@@ -476,15 +477,16 @@ g_disk_destroy(void *ptr, int flag)
 	dp = ptr;
 	gp = dp->d_geom;
 	if (gp != NULL) {
-		sc = LIST_FIRST(&gp->provider)->private;
+		sc = gp->softc;
 		if (sc->sysctl_tree != NULL) {
 			sysctl_ctx_free(&sc->sysctl_ctx);
 			sc->sysctl_tree = NULL;
 		}
-		if (sc->led[0] != 0)
+		if (sc->led[0] != 0) {
 			led_set(sc->led, "0");
+			sc->led[0] = 0;
+		}
 		g_free(sc);
-		LIST_FIRST(&gp->provider)->private = NULL;
 		gp->softc = NULL;
 		g_wither_geom(gp, ENXIO);
 	}

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 10:21:16 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 7F75310656A6;
	Fri,  4 Feb 2011 10:21:16 +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 6F01A8FC18;
	Fri,  4 Feb 2011 10:21:16 +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 p14ALGRp077488;
	Fri, 4 Feb 2011 10:21:16 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14ALGlo077486;
	Fri, 4 Feb 2011 10:21:16 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041021.p14ALGlo077486@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 10:21:16 +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: r218260 - 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: Fri, 04 Feb 2011 10:21:16 -0000

Author: mav
Date: Fri Feb  4 10:21:16 2011
New Revision: 218260
URL: http://svn.freebsd.org/changeset/base/218260

Log:
  Stop rebuild process on stop() method call. Delay G_RAID_VOLUME_S_STOPPED
  state transition until currently running rebuild request complete.
  Free the rebuild buffer on free() method call, if allocated.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 10:19:56 2011	(r218259)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 10:21:16 2011	(r218260)
@@ -84,7 +84,7 @@ SYSCTL_UINT(_kern_geom_raid_raid1, OID_A
     &g_raid1_rebuild_meta_update, RAID1_REBUILD_META_UPDATE,
     "When to update the meta data.");
 
-static MALLOC_DEFINE(M_TR_raid1, "tr_raid1_data", "GEOM_RAID raid1 data");
+static MALLOC_DEFINE(M_TR_RAID1, "tr_raid1_data", "GEOM_RAID RAID1 data");
 
 #define TR_RAID1_NONE 0
 #define TR_RAID1_REBUILD 1
@@ -95,7 +95,7 @@ static MALLOC_DEFINE(M_TR_raid1, "tr_rai
 struct g_raid_tr_raid1_object {
 	struct g_raid_tr_object	 trso_base;
 	int			 trso_starting;
-	int			 trso_stopped;
+	int			 trso_stopping;
 	int			 trso_type;
 	int			 trso_recover_slabs; /* slabs before rest */
 	int			 trso_fair_io;
@@ -166,7 +166,8 @@ g_raid_tr_update_state_raid1(struct g_ra
 	int n;
 
 	trs = (struct g_raid_tr_raid1_object *)vol->v_tr;
-	if (trs->trso_stopped)
+	if (trs->trso_stopping &&
+	    (trs->trso_flags & TR_RAID1_F_DOING_SOME) == 0)
 		s = G_RAID_VOLUME_S_STOPPED;
 	else {
 		n = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
@@ -233,12 +234,13 @@ g_raid_tr_raid1_rebuild_done(struct g_ra
 	sd = trs->trso_failed_sd;
 	sd->sd_rebuild_pos = 0;
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
-	free(trs->trso_buffer, M_TR_raid1);
+	free(trs->trso_buffer, M_TR_RAID1);
+	trs->trso_buffer = NULL;
 	trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
 	trs->trso_type = TR_RAID1_NONE;
 	trs->trso_recover_slabs = 0;
 	trs->trso_failed_sd = NULL;
-	trs->trso_buffer = NULL;
+	g_raid_tr_update_state_raid1(vol);
 }
 
 static void
@@ -251,7 +253,6 @@ g_raid_tr_raid1_rebuild_finish(struct g_
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	sd = trs->trso_failed_sd;
 	g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
-	g_raid_tr_update_state_raid1(vol);
 	g_raid_tr_raid1_rebuild_done(trs, vol);
 }
 
@@ -315,7 +316,7 @@ g_raid_tr_raid1_rebuild_start(struct g_r
 	G_RAID_DEBUG(2, "Kicking off a rebuild at %jd...",
 	    trs->trso_failed_sd->sd_rebuild_pos);
 	trs->trso_type = TR_RAID1_REBUILD;
-	trs->trso_buffer = malloc(g_raid1_rebuild_slab, M_TR_raid1, M_WAITOK);
+	trs->trso_buffer = malloc(g_raid1_rebuild_slab, M_TR_RAID1, M_WAITOK);
 	trs->trso_meta_update = g_raid1_rebuild_meta_update;
 	g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
 }
@@ -329,13 +330,13 @@ g_raid_tr_raid1_maybe_rebuild(struct g_r
 	int na, nr;
 	
 	/*
-	 * If we're stopped, don't do anything.  If we don't have at least one
+	 * If we're stopping, don't do anything.  If we don't have at least one
 	 * good disk and one bad disk, we don't do anything.  And if there's a
 	 * 'good disk' stored in the trs, then we're in progress and we punt.
 	 * If we make it past all these checks, we need to rebuild.
 	 */
 	trs = (struct g_raid_tr_raid1_object *)tr;
-	if (trs->trso_stopped)
+	if (trs->trso_stopping)
 		return;
 	na = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
 	nr = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_REBUILD);
@@ -408,7 +409,7 @@ g_raid_tr_stop_raid1(struct g_raid_tr_ob
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	vol = tr->tro_volume;
 	trs->trso_starting = 0;
-	trs->trso_stopped = 1;
+	trs->trso_stopping = 1;
 	g_raid_tr_update_state_raid1(vol);
 	return (0);
 }
@@ -634,6 +635,14 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
 					g_raid_tr_raid1_rebuild_finish(tr, vol);
 					return;
 				}
+
+				/* Abort rebuild if we are stopping */
+				if (trs->trso_stopping) {
+					trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
+					g_raid_tr_update_state_raid1(vol);
+					return;
+				}
+
 				if (--trs->trso_recover_slabs <= 0) {
 					if (--trs->trso_meta_update <= 0) {
 						g_raid_write_metadata(vol->v_softc,
@@ -849,6 +858,10 @@ g_raid_tr_free_raid1(struct g_raid_tr_ob
 
 	trs = (struct g_raid_tr_raid1_object *)tr;
 
+	if (trs->trso_buffer != NULL) {
+		free(trs->trso_buffer, M_TR_RAID1);
+		trs->trso_buffer = NULL;
+	}
 	return (0);
 }
 

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 10:50:55 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 4B1A1106564A;
	Fri,  4 Feb 2011 10:50:55 +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 3B1A28FC0C;
	Fri,  4 Feb 2011 10:50:55 +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 p14Aotvg078281;
	Fri, 4 Feb 2011 10:50:55 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14AotK2078279;
	Fri, 4 Feb 2011 10:50:55 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041050.p14AotK2078279@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 10:50:55 +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: r218262 - 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: Fri, 04 Feb 2011 10:50:55 -0000

Author: mav
Date: Fri Feb  4 10:50:54 2011
New Revision: 218262
URL: http://svn.freebsd.org/changeset/base/218262

Log:
  We can run I/O on SUBOPTIMAL RAID0 volumes (with FAILED disks).
  Without other choices we can just try and hope for better.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid0.c

Modified: projects/graid/head/sys/geom/raid/tr_raid0.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid0.c	Fri Feb  4 10:22:19 2011	(r218261)
+++ projects/graid/head/sys/geom/raid/tr_raid0.c	Fri Feb  4 10:50:54 2011	(r218262)
@@ -195,7 +195,8 @@ g_raid_tr_iostart_raid0(struct g_raid_tr
 	u_int no, strip_size;
 
 	vol = tr->tro_volume;
-	if (vol->v_state != G_RAID_VOLUME_S_OPTIMAL) {
+	if (vol->v_state != G_RAID_VOLUME_S_OPTIMAL &&
+	    vol->v_state != G_RAID_VOLUME_S_SUBOPTIMAL) {
 		g_raid_iodone(bp, EIO);
 		return;
 	}

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 11:02:59 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 42E07106566B;
	Fri,  4 Feb 2011 11:02:59 +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 32F308FC1F;
	Fri,  4 Feb 2011 11:02:59 +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 p14B2xck079632;
	Fri, 4 Feb 2011 11:02:59 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14B2xb2079630;
	Fri, 4 Feb 2011 11:02:59 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041102.p14B2xb2079630@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 11:02:59 +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: r218263 - 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: Fri, 04 Feb 2011 11:02:59 -0000

Author: mav
Date: Fri Feb  4 11:02:58 2011
New Revision: 218263
URL: http://svn.freebsd.org/changeset/base/218263

Log:
  For now, RAID1 configuration with only two disks are supported.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 10:50:54 2011	(r218262)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 11:02:58 2011	(r218263)
@@ -152,7 +152,8 @@ g_raid_tr_taste_raid1(struct g_raid_tr_o
 
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	if (tr->tro_volume->v_raid_level != G_RAID_VOLUME_RL_RAID1 ||
-	    tr->tro_volume->v_raid_level_qualifier != G_RAID_VOLUME_RLQ_NONE)
+	    tr->tro_volume->v_raid_level_qualifier != G_RAID_VOLUME_RLQ_NONE ||
+	    tr->tro_volume->v_disks_count != 2)
 		return (G_RAID_TR_TASTE_FAIL);
 	trs->trso_starting = 1;
 	return (G_RAID_TR_TASTE_SUCCEED);

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 12:41:49 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 7B992106564A;
	Fri,  4 Feb 2011 12:41:49 +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 6A04D8FC13;
	Fri,  4 Feb 2011 12:41:49 +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 p14Cfn4I081921;
	Fri, 4 Feb 2011 12:41:49 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14Cfnju081915;
	Fri, 4 Feb 2011 12:41:49 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041241.p14Cfnju081915@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 12:41:49 +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: r218265 - 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: Fri, 04 Feb 2011 12:41:49 -0000

Author: mav
Date: Fri Feb  4 12:41:49 2011
New Revision: 218265
URL: http://svn.freebsd.org/changeset/base/218265

Log:
  Complete move control over volume startup process to the metadata modules.
  They must know number of disks in array or volume and they can easily
  thack number of present disks. No need to duplicate that functionality
  in places that have even less information to take decision.

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/tr_raid0.c
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 12:03:48 2011	(r218264)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 12:41:49 2011	(r218265)
@@ -59,10 +59,10 @@ u_int g_raid_debug = 2;
 TUNABLE_INT("kern.geom.raid.debug", &g_raid_debug);
 SYSCTL_UINT(_kern_geom_raid, OID_AUTO, debug, CTLFLAG_RW, &g_raid_debug, 0,
     "Debug level");
-u_int g_raid_start_timeout = 4;
+u_int g_raid_start_timeout = 15;
 TUNABLE_INT("kern.geom.raid.start_timeout", &g_raid_start_timeout);
 SYSCTL_UINT(_kern_geom_raid, OID_AUTO, timeout, CTLFLAG_RW, &g_raid_start_timeout,
-    0, "Time to wait on all mirror components");
+    0, "Time to wait for all array components");
 static u_int g_raid_cleantime = 5;
 TUNABLE_INT("kern.geom.raid.cleantime", &g_raid_cleantime);
 SYSCTL_UINT(_kern_geom_raid, OID_AUTO, cleantime, CTLFLAG_RW,
@@ -553,7 +553,9 @@ g_raid_nsubdisks(struct g_raid_volume *v
 	n = 0;
 	for (i = 0; i < vol->v_disks_count; i++) {
 		subdisk = &vol->v_subdisks[i];
-		if (subdisk->sd_state == state || state == -1)
+		if ((state == -1 &&
+		     subdisk->sd_state != G_RAID_SUBDISK_S_NONE) ||
+		    subdisk->sd_state == state)
 			n++;
 	}
 	return (n);
@@ -1338,19 +1340,6 @@ g_raid_destroy_provider(struct g_raid_vo
 	vol->v_provider = NULL;
 }
 
-static void
-g_raid_go(void *arg)
-{
-	struct g_raid_volume *vol;
-
-	vol = arg;
-	if (vol->v_starting) {
-		G_RAID_DEBUG(0, "Force volume %s start due to timeout.", vol->v_name);
-		g_raid_event_send(vol, G_RAID_VOLUME_E_START,
-		    G_RAID_EVENT_VOLUME);
-	}
-}
-
 /*
  * Update device state.
  */
@@ -1383,7 +1372,6 @@ g_raid_update_volume(struct g_raid_volum
 	/* Manage root mount release. */
 	if (vol->v_starting) {
 		vol->v_starting = 0;
-		callout_drain(&vol->v_start_co);
 		G_RAID_DEBUG(1, "root_mount_rel %p", vol->v_rootmount);
 		root_mount_rel(vol->v_rootmount);
 		vol->v_rootmount = NULL;
@@ -1585,9 +1573,6 @@ g_raid_create_volume(struct g_raid_softc
 	/* Delay root mounting. */
 	vol->v_rootmount = root_mount_hold("GRAID");
 	G_RAID_DEBUG(1, "root_mount_hold %p", vol->v_rootmount);
-	callout_init(&vol->v_start_co, 1);
-	callout_reset(&vol->v_start_co, g_raid_start_timeout * hz,
-	    g_raid_go, vol);
 	vol->v_starting = 1;
 	TAILQ_INSERT_TAIL(&sc->sc_volumes, vol, v_next);
 	return (vol);
@@ -1720,7 +1705,6 @@ g_raid_destroy_volume(struct g_raid_volu
 		return (EBUSY);
 	if (vol->v_rootmount)
 		root_mount_rel(vol->v_rootmount);
-	callout_drain(&vol->v_start_co);
 	g_topology_lock();
 	LIST_REMOVE(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	Fri Feb  4 12:03:48 2011	(r218264)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 12:41:49 2011	(r218265)
@@ -231,8 +231,7 @@ struct g_raid_volume {
 	time_t			 v_last_write;	/* Time of the last write. */
 	u_int			 v_writes;	/* Number of active writes. */
 	struct root_hold_token	*v_rootmount;	/* Root mount delay token. */
-	struct callout		 v_start_co;	/* STARTING state timer. */
-	int			 v_starting;	/* STARTING state timer armed */
+	int			 v_starting;	/* Volume is starting */
 	int			 v_stopping;	/* Volume is stopping */
 	int			 v_provider_open; /* Number of opens. */
 	int			 v_global_id;	/* Global volume ID (rX). */

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb  4 12:03:48 2011	(r218264)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb  4 12:41:49 2011	(r218265)
@@ -867,6 +867,11 @@ g_raid_md_intel_start(struct g_raid_soft
 	/* Pickup any STALE/SPARE disks to refill array if needed. */
 	g_raid_md_intel_refill(sc);
 
+	TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
+		g_raid_event_send(vol, G_RAID_VOLUME_E_START,
+		    G_RAID_EVENT_VOLUME);
+	}
+
 	callout_stop(&mdi->mdio_start_co);
 	G_RAID_DEBUG(1, "root_mount_rel %p", mdi->mdio_rootmount);
 	root_mount_rel(mdi->mdio_rootmount);
@@ -1446,6 +1451,9 @@ makedisk:
 
 		/* Pickup any STALE/SPARE disks to refill array if needed. */
 		g_raid_md_intel_refill(sc);
+
+		g_raid_event_send(vol, G_RAID_VOLUME_E_START,
+		    G_RAID_EVENT_VOLUME);
 		return (0);
 	}
 	if (strcmp(verb, "add") == 0) {
@@ -1611,6 +1619,9 @@ makedisk:
 
 		/* Write metadata based on created entities. */
 		g_raid_md_write_intel(md, NULL, NULL, NULL);
+
+		g_raid_event_send(vol, G_RAID_VOLUME_E_START,
+		    G_RAID_EVENT_VOLUME);
 		return (0);
 	}
 	if (strcmp(verb, "delete") == 0) {

Modified: projects/graid/head/sys/geom/raid/tr_raid0.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid0.c	Fri Feb  4 12:03:48 2011	(r218264)
+++ projects/graid/head/sys/geom/raid/tr_raid0.c	Fri Feb  4 12:41:49 2011	(r218265)
@@ -101,6 +101,8 @@ g_raid_tr_update_state_raid0(struct g_ra
 	trs = (struct g_raid_tr_raid0_object *)vol->v_tr;
 	if (trs->trso_stopped)
 		s = G_RAID_VOLUME_S_STOPPED;
+	else if (trs->trso_starting)
+		s = G_RAID_VOLUME_S_STARTING;
 	else {
 		n = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
 		f = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_FAILED);
@@ -109,10 +111,7 @@ g_raid_tr_update_state_raid0(struct g_ra
 				s = G_RAID_VOLUME_S_OPTIMAL;
 			else
 				s = G_RAID_VOLUME_S_SUBOPTIMAL;
-			trs->trso_starting = 0;
-		} else if (trs->trso_starting)
-			s = G_RAID_VOLUME_S_STARTING;
-		else
+		} else
 			s = G_RAID_VOLUME_S_BROKEN;
 	}
 	if (s != vol->v_state) {

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 12:03:48 2011	(r218264)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 12:41:49 2011	(r218265)
@@ -170,19 +170,16 @@ g_raid_tr_update_state_raid1(struct g_ra
 	if (trs->trso_stopping &&
 	    (trs->trso_flags & TR_RAID1_F_DOING_SOME) == 0)
 		s = G_RAID_VOLUME_S_STOPPED;
+	else if (trs->trso_starting)
+		s = G_RAID_VOLUME_S_STARTING;
 	else {
 		n = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
-		if (n == vol->v_disks_count) {
+		if (n == vol->v_disks_count)
 			s = G_RAID_VOLUME_S_OPTIMAL;
-			trs->trso_starting = 0;
-		} else {
-			if (trs->trso_starting)
-				s = G_RAID_VOLUME_S_STARTING;
-			else if (n > 0)
-				s = G_RAID_VOLUME_S_DEGRADED;
-			else
-				s = G_RAID_VOLUME_S_BROKEN;
-		}
+		else if (n > 0)
+			s = G_RAID_VOLUME_S_DEGRADED;
+		else
+			s = G_RAID_VOLUME_S_BROKEN;
 	}
 	g_raid_tr_raid1_maybe_rebuild(vol->v_tr, vol);
 	if (s != vol->v_state) {

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 15:28:27 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 4D39C106564A;
	Fri,  4 Feb 2011 15:28:27 +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 307AC8FC08;
	Fri,  4 Feb 2011 15:28:27 +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 p14FSRZJ088807;
	Fri, 4 Feb 2011 15:28:27 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14FSRu1088802;
	Fri, 4 Feb 2011 15:28:27 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041528.p14FSRu1088802@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 15:28:27 +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: r218279 - 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: Fri, 04 Feb 2011 15:28:27 -0000

Author: mav
Date: Fri Feb  4 15:28:26 2011
New Revision: 218279
URL: http://svn.freebsd.org/changeset/base/218279

Log:
  Teach RAID1 handle situations when no disk in ACTIVE state left: choose
  best disk of remaining (up to reasonable level) and make it ACTIVE.
  
  Introduce UNINITIALIZED subdisk state. It is same as NEW, except in can
  be safely promoted to ACTIVE.
  
  Store STALE subdisk state to metadata using dirty volume flag. Not exactly
  match, but closest of what we have.

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/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 15:22:56 2011	(r218278)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Fri Feb  4 15:28:26 2011	(r218279)
@@ -140,7 +140,7 @@ g_raid_node_event2str(int event)
 	}
 }
 
-static const char *
+const char *
 g_raid_disk_state2str(int state)
 {
 
@@ -176,7 +176,7 @@ g_raid_disk_event2str(int event)
 	}
 }
 
-static const char *
+const char *
 g_raid_subdisk_state2str(int state)
 {
 
@@ -214,7 +214,7 @@ g_raid_subdisk_event2str(int event)
 	}
 }
 
-static const char *
+const char *
 g_raid_volume_state2str(int state)
 {
 

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 15:22:56 2011	(r218278)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Fri Feb  4 15:28:26 2011	(r218279)
@@ -145,10 +145,11 @@ struct g_raid_disk {
 #define G_RAID_SUBDISK_S_NONE		0x00	/* Absent. */
 #define G_RAID_SUBDISK_S_FAILED		0x01	/* Failed. */
 #define G_RAID_SUBDISK_S_NEW		0x02	/* Blank. */
-#define G_RAID_SUBDISK_S_STALE		0x03	/* Dirty. */
-#define G_RAID_SUBDISK_S_REBUILD	0x04	/* Blank + rebuild. */
-#define G_RAID_SUBDISK_S_RESYNC		0x05	/* Dirty + check/repair. */
-#define G_RAID_SUBDISK_S_ACTIVE		0x06	/* Usable. */
+#define G_RAID_SUBDISK_S_REBUILD	0x03	/* Blank + rebuild. */
+#define G_RAID_SUBDISK_S_UNINITIALIZED	0x04	/* Disk of the new volume. */
+#define G_RAID_SUBDISK_S_STALE		0x05	/* Dirty. */
+#define G_RAID_SUBDISK_S_RESYNC		0x06	/* Dirty + check/repair. */
+#define G_RAID_SUBDISK_S_ACTIVE		0x07	/* Usable. */
 
 #define G_RAID_SUBDISK_E_NEW		0x01	/* A new subdisk has arrived */
 #define G_RAID_SUBDISK_E_FAILED		0x02	/* A subdisk failed, but remains in volume */
@@ -316,6 +317,9 @@ int g_raid_tr_modevent(module_t, int, vo
 
 const char * g_raid_volume_level2str(int level, int qual);
 int g_raid_volume_str2level(const char *str, int *level, int *qual);
+const char * g_raid_volume_state2str(int state);
+const char * g_raid_subdisk_state2str(int state);
+const char * g_raid_disk_state2str(int state);
 
 struct g_raid_softc * g_raid_create_node(struct g_class *mp,
     const char *name, struct g_raid_md_object *md);

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb  4 15:22:56 2011	(r218278)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Fri Feb  4 15:28:26 2011	(r218279)
@@ -644,7 +644,7 @@ nofit:
 			if (mmap0->status == INTEL_S_UNINITIALIZED) {
 				/* Freshly created uninitialized volume. */
 				g_raid_change_subdisk_state(sd,
-				    G_RAID_SUBDISK_S_NEW);
+				    G_RAID_SUBDISK_S_UNINITIALIZED);
 			} else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
 				/* Freshly inserted disk. */
 				g_raid_change_subdisk_state(sd,
@@ -1879,7 +1879,7 @@ g_raid_md_write_intel(struct g_raid_md_o
 	struct intel_raid_map *mmap0, *mmap1;
 	off_t sectorsize = 512, pos;
 	const char *version, *cv;
-	int vi, sdi, numdisks, len, state;
+	int vi, sdi, numdisks, len, state, stale;
 
 	sc = md->mdo_softc;
 	mdi = (struct g_raid_md_intel_object *)md;
@@ -1980,6 +1980,7 @@ g_raid_md_write_intel(struct g_raid_md_o
 		/* Check for any recovery in progress. */
 		state = G_RAID_SUBDISK_S_ACTIVE;
 		pos = 0x7fffffffffffffffllu;
+		stale = 0;
 		for (sdi = 0; sdi < vol->v_disks_count; sdi++) {
 			sd = &vol->v_subdisks[sdi];
 			if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD)
@@ -1987,6 +1988,8 @@ g_raid_md_write_intel(struct g_raid_md_o
 			else if (sd->sd_state == G_RAID_SUBDISK_S_RESYNC &&
 			    state != G_RAID_SUBDISK_S_REBUILD)
 				state = G_RAID_SUBDISK_S_RESYNC;
+			else if (sd->sd_state == G_RAID_SUBDISK_S_STALE)
+				stale = 1;
 			if ((sd->sd_state == G_RAID_SUBDISK_S_REBUILD ||
 			    sd->sd_state == G_RAID_SUBDISK_S_RESYNC) &&
 			     sd->sd_rebuild_pos < pos)
@@ -2000,7 +2003,7 @@ g_raid_md_write_intel(struct g_raid_md_o
 			mvol->migr_type = INTEL_MT_REPAIR;
 		} else
 			mvol->migr_state = 0;
-		mvol->dirty = vol->v_dirty;
+		mvol->dirty = (vol->v_dirty || stale);
 
 		mmap0 = intel_get_map(mvol, 0);
 
@@ -2054,7 +2057,8 @@ g_raid_md_write_intel(struct g_raid_md_o
 			if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD ||
 			    sd->sd_state == G_RAID_SUBDISK_S_RESYNC) {
 				mmap1->disk_idx[sdi] |= INTEL_DI_RBLD;
-			} else if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE) {
+			} else if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE &&
+			    sd->sd_state != G_RAID_SUBDISK_S_STALE) {
 				mmap0->disk_idx[sdi] |= INTEL_DI_RBLD;
 				if (mvol->migr_state)
 					mmap1->disk_idx[sdi] |= INTEL_DI_RBLD;

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 15:22:56 2011	(r218278)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 15:28:26 2011	(r218279)
@@ -163,8 +163,9 @@ static int
 g_raid_tr_update_state_raid1(struct g_raid_volume *vol)
 {
 	struct g_raid_tr_raid1_object *trs;
+	struct g_raid_subdisk *sd, *bestsd;
 	u_int s;
-	int n;
+	int i, na, ns;
 
 	trs = (struct g_raid_tr_raid1_object *)vol->v_tr;
 	if (trs->trso_stopping &&
@@ -173,10 +174,44 @@ g_raid_tr_update_state_raid1(struct g_ra
 	else if (trs->trso_starting)
 		s = G_RAID_VOLUME_S_STARTING;
 	else {
-		n = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
-		if (n == vol->v_disks_count)
+		/* Make sure we have at least one ACTIVE disk. */
+		na = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
+		if (na == 0) {
+			/*
+			 * Critical situation! We have no any active disk!
+			 * Choose the best disk we have to make it active.
+			 */
+			bestsd = &vol->v_subdisks[0];
+			for (i = 1; i < vol->v_disks_count; i++) {
+				sd = &vol->v_subdisks[i];
+				if (sd->sd_state > bestsd->sd_state)
+					bestsd = sd;
+				else if (sd->sd_state == bestsd->sd_state &&
+				    (sd->sd_state == G_RAID_SUBDISK_S_REBUILD ||
+				     sd->sd_state == G_RAID_SUBDISK_S_RESYNC) &&
+				    sd->sd_rebuild_pos > bestsd->sd_rebuild_pos)
+					bestsd = sd;
+			}
+			if (bestsd->sd_state >= G_RAID_SUBDISK_S_UNINITIALIZED) {
+				/* We found reasonable candidate. */
+				G_RAID_DEBUG(1,
+				    "Promote subdisk %d from %s to ACTIVE.",
+				    bestsd->sd_pos,
+				    g_raid_subdisk_state2str(bestsd->sd_state));
+				g_raid_change_subdisk_state(bestsd,
+				    G_RAID_SUBDISK_S_ACTIVE);
+				g_raid_write_metadata(vol->v_softc,
+				    vol, bestsd, bestsd->sd_disk);
+			}
+		}
+		na = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
+		ns = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_STALE) +
+		     g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_RESYNC);
+		if (na == vol->v_disks_count)
 			s = G_RAID_VOLUME_S_OPTIMAL;
-		else if (n > 0)
+		else if (na + ns == vol->v_disks_count)
+			s = G_RAID_VOLUME_S_SUBOPTIMAL;
+		else if (na > 0)
 			s = G_RAID_VOLUME_S_DEGRADED;
 		else
 			s = G_RAID_VOLUME_S_BROKEN;

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 15:47:14 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 DEE40106564A;
	Fri,  4 Feb 2011 15:47:14 +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 CE3BE8FC08;
	Fri,  4 Feb 2011 15:47:14 +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 p14FlEgs089373;
	Fri, 4 Feb 2011 15:47:14 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14FlE3x089371;
	Fri, 4 Feb 2011 15:47:14 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041547.p14FlE3x089371@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 15:47:14 +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: r218281 - 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: Fri, 04 Feb 2011 15:47:15 -0000

Author: mav
Date: Fri Feb  4 15:47:14 2011
New Revision: 218281
URL: http://svn.freebsd.org/changeset/base/218281

Log:
  When volume is not idle, use shorter rebuild requests and truncate size of
  requests that already running. This should be a compromise between faster
  rebuild and lower payload performance degradation. Not exactly solution I
  would like to see, but still better.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 15:45:48 2011	(r218280)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 15:47:14 2011	(r218281)
@@ -68,7 +68,7 @@ SYSCTL_UINT(_kern_geom_raid_raid1, OID_A
     &g_raid1_rebuild_fair_io, RAID1_REBUILD_FAIR_IO,
     "Fraction of the I/O bandwidth to use when disk busy for rebuild.");
 
-#define RAID1_REBUILD_CLUSTER_IDLE 10
+#define RAID1_REBUILD_CLUSTER_IDLE 100
 static int g_raid1_rebuild_cluster_idle = RAID1_REBUILD_CLUSTER_IDLE;
 TUNABLE_INT("kern.geom.raid.raid1.rebuild_cluster_idle",
     &g_raid1_rebuild_slab);
@@ -578,6 +578,8 @@ g_raid_tr_iostart_raid1(struct g_raid_tr
 	    !(bp->bio_cflags & G_RAID_BIO_FLAG_SPECIAL)) {
 		if (--trs->trso_fair_io <= 0)
 			g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
+		/* Make this new or running now round short. */
+		trs->trso_recover_slabs = 0;
 	}
 	switch (bp->bio_cmd) {
 	case BIO_READ:

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 16:04:43 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 711FE1065672;
	Fri,  4 Feb 2011 16:04:43 +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 606758FC19;
	Fri,  4 Feb 2011 16:04:43 +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 p14G4h3U089845;
	Fri, 4 Feb 2011 16:04:43 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14G4heB089843;
	Fri, 4 Feb 2011 16:04:43 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102041604.p14G4heB089843@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 16:04:43 +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: r218282 - 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: Fri, 04 Feb 2011 16:04:43 -0000

Author: mav
Date: Fri Feb  4 16:04:43 2011
New Revision: 218282
URL: http://svn.freebsd.org/changeset/base/218282

Log:
  Until we have no real RESYNC implemented, handle it same as REBUILD.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 15:47:14 2011	(r218281)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Fri Feb  4 16:04:43 2011	(r218282)
@@ -372,7 +372,8 @@ g_raid_tr_raid1_maybe_rebuild(struct g_r
 	if (trs->trso_stopping)
 		return;
 	na = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
-	nr = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_REBUILD);
+	nr = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_REBUILD) +
+	    g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_RESYNC);
 	switch(trs->trso_type) {
 	case TR_RAID1_NONE:
 		if (na == 0 || nr == 0)
@@ -402,11 +403,17 @@ g_raid_tr_event_raid1(struct g_raid_tr_o
 	vol = tr->tro_volume;
 	switch (event) {
 	case G_RAID_SUBDISK_E_NEW:
-		if (sd->sd_state == G_RAID_SUBDISK_S_NEW)
+		if (sd->sd_state == G_RAID_SUBDISK_S_NEW) {
+			sd->sd_rebuild_pos = 0;
 			g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_REBUILD);
+		} else if (sd->sd_state == G_RAID_SUBDISK_S_STALE) {
+			sd->sd_rebuild_pos = 0;
+			g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_RESYNC);
+		}
 		break;
 	case G_RAID_SUBDISK_E_FAILED:
-		if (trs->trso_type == TR_RAID1_REBUILD)
+		if (trs->trso_type == TR_RAID1_REBUILD ||
+		    trs->trso_type == TR_RAID1_RESYNC)
 			g_raid_tr_raid1_rebuild_abort(tr, vol);
 //		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_FAILED);
 		break;

From owner-svn-src-projects@FreeBSD.ORG  Fri Feb  4 23:57:51 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 7235B106566C;
	Fri,  4 Feb 2011 23:57:51 +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 5ED9E8FC14;
	Fri,  4 Feb 2011 23:57:51 +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 p14NvpcL008190;
	Fri, 4 Feb 2011 23:57:51 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p14Nvpw3008180;
	Fri, 4 Feb 2011 23:57:51 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102042357.p14Nvpw3008180@svn.freebsd.org>
From: Alexander Motin 
Date: Fri, 4 Feb 2011 23:57:51 +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: r218307 - in projects/graid/8: . contrib/bsnmp/snmpd
	contrib/top contrib/xz gnu/usr.bin lib/libusb
	release/picobsd/floppy.tree/sbin sbin/geom/class/raid
	sbin/geom/class/sched sbin/geom/...
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: Fri, 04 Feb 2011 23:57:51 -0000

Author: mav
Date: Fri Feb  4 23:57:50 2011
New Revision: 218307
URL: http://svn.freebsd.org/changeset/base/218307

Log:
  MFH
  r216978, r216979, r216980, r216981, r216984, r217014, r217188,
  r217189, r217193, r216981, r216984, r217014, r217188, r217189,
  r217193, r217194, r217267, r217284, r217285, r217287, r217293,
  r217301, r217311, r217363, r217372, r217373, r217378, r217380,
  r217389, r217409, r217411, r217462, r217465, r217466, r217467,
  r217507, r217546, r217565, r217662, r217827, r217828, r217842,
  r217884, r217889, r217891, r217892, r217907, r217912, r217918,
  r217919, r217920, r217926, r217929, r217972, r217989, r217992,
  r217998, r217999, r218006, r218008, r218016, r218023, r218052,
  r218053, r218062, r218063, r218083, r218084, r218086, r218106,
  r218143, r218161, r218174, r218204, r218212, r218213, r218220,
  r218222, r218224, r218226, r218230, r218231, r218233, r218234,
  r218236, r218237, r218239, r218244, r218247, r218248, r218249,
  r218250, r218251, r218252, r218253, r218254, r218255, r218257,
  r218260, r218262, r218263, r218265, r218279, r218281, r218282.

Added:
  projects/graid/8/sys/amd64/conf/CISCO
     - copied unchanged from r216979, projects/graid/head/sys/amd64/conf/CISCO
Modified:
  projects/graid/8/sbin/geom/class/raid/geom_raid.c
  projects/graid/8/sbin/geom/class/raid/graid.8
  projects/graid/8/sbin/geom/core/geom.8
  projects/graid/8/sbin/geom/core/geom.c
  projects/graid/8/sys/cam/ata/ata_da.c
  projects/graid/8/sys/conf/options
  projects/graid/8/sys/dev/led/led.c
  projects/graid/8/sys/dev/led/led.h
  projects/graid/8/sys/geom/geom.h
  projects/graid/8/sys/geom/geom_dev.c
  projects/graid/8/sys/geom/geom_disk.c
  projects/graid/8/sys/geom/raid/g_raid.c
  projects/graid/8/sys/geom/raid/g_raid.h
  projects/graid/8/sys/geom/raid/g_raid_ctl.c
  projects/graid/8/sys/geom/raid/g_raid_md_if.m
  projects/graid/8/sys/geom/raid/g_raid_tr_if.m
  projects/graid/8/sys/geom/raid/md_intel.c
  projects/graid/8/sys/geom/raid/tr_raid0.c
  projects/graid/8/sys/geom/raid/tr_raid1.c
Directory Properties:
  projects/graid/8/   (props changed)
  projects/graid/8/COPYRIGHT   (props changed)
  projects/graid/8/Makefile   (props changed)
  projects/graid/8/Makefile.inc1   (props changed)
  projects/graid/8/ObsoleteFiles.inc   (props changed)
  projects/graid/8/UPDATING   (props changed)
  projects/graid/8/bin/   (props changed)
  projects/graid/8/bin/chio/   (props changed)
  projects/graid/8/bin/chmod/   (props changed)
  projects/graid/8/bin/cp/   (props changed)
  projects/graid/8/bin/csh/   (props changed)
  projects/graid/8/bin/date/   (props changed)
  projects/graid/8/bin/echo/   (props changed)
  projects/graid/8/bin/expr/   (props changed)
  projects/graid/8/bin/getfacl/   (props changed)
  projects/graid/8/bin/kill/   (props changed)
  projects/graid/8/bin/ln/   (props changed)
  projects/graid/8/bin/ls/   (props changed)
  projects/graid/8/bin/mv/   (props changed)
  projects/graid/8/bin/pax/   (props changed)
  projects/graid/8/bin/pkill/   (props changed)
  projects/graid/8/bin/ps/   (props changed)
  projects/graid/8/bin/pwait/   (props changed)
  projects/graid/8/bin/setfacl/   (props changed)
  projects/graid/8/bin/sh/   (props changed)
  projects/graid/8/bin/sleep/   (props changed)
  projects/graid/8/bin/test/   (props changed)
  projects/graid/8/cddl/compat/opensolaris/   (props changed)
  projects/graid/8/cddl/contrib/opensolaris/   (props changed)
  projects/graid/8/cddl/lib/   (props changed)
  projects/graid/8/cddl/lib/libnvpair/   (props changed)
  projects/graid/8/cddl/lib/libzpool/   (props changed)
  projects/graid/8/cddl/usr.bin/   (props changed)
  projects/graid/8/cddl/usr.sbin/   (props changed)
  projects/graid/8/contrib/   (props changed)
  projects/graid/8/contrib/bind9/   (props changed)
  projects/graid/8/contrib/binutils/   (props changed)
  projects/graid/8/contrib/bsnmp/   (props changed)
  projects/graid/8/contrib/bsnmp/snmpd/bsnmpd.1   (props changed)
  projects/graid/8/contrib/bzip2/   (props changed)
  projects/graid/8/contrib/com_err/   (props changed)
  projects/graid/8/contrib/csup/   (props changed)
  projects/graid/8/contrib/ee/   (props changed)
  projects/graid/8/contrib/expat/   (props changed)
  projects/graid/8/contrib/file/   (props changed)
  projects/graid/8/contrib/gcc/   (props changed)
  projects/graid/8/contrib/gdb/   (props changed)
  projects/graid/8/contrib/gdtoa/   (props changed)
  projects/graid/8/contrib/groff/   (props changed)
  projects/graid/8/contrib/ipfilter/   (props changed)
  projects/graid/8/contrib/less/   (props changed)
  projects/graid/8/contrib/libpcap/   (props changed)
  projects/graid/8/contrib/ncurses/   (props changed)
  projects/graid/8/contrib/netcat/   (props changed)
  projects/graid/8/contrib/ntp/   (props changed)
  projects/graid/8/contrib/nvi/   (props changed)
  projects/graid/8/contrib/one-true-awk/   (props changed)
  projects/graid/8/contrib/openbsm/   (props changed)
  projects/graid/8/contrib/openpam/   (props changed)
  projects/graid/8/contrib/pf/   (props changed)
  projects/graid/8/contrib/sendmail/   (props changed)
  projects/graid/8/contrib/tcp_wrappers/   (props changed)
  projects/graid/8/contrib/tcpdump/   (props changed)
  projects/graid/8/contrib/tcsh/   (props changed)
  projects/graid/8/contrib/telnet/   (props changed)
  projects/graid/8/contrib/top/   (props changed)
  projects/graid/8/contrib/top/install-sh   (props changed)
  projects/graid/8/contrib/traceroute/   (props changed)
  projects/graid/8/contrib/wpa/   (props changed)
  projects/graid/8/contrib/xz/   (props changed)
  projects/graid/8/contrib/xz/AUTHORS   (props changed)
  projects/graid/8/contrib/xz/COPYING   (props changed)
  projects/graid/8/contrib/xz/ChangeLog   (props changed)
  projects/graid/8/contrib/xz/FREEBSD-Xlist   (props changed)
  projects/graid/8/contrib/xz/FREEBSD-upgrade   (props changed)
  projects/graid/8/contrib/xz/README   (props changed)
  projects/graid/8/contrib/xz/THANKS   (props changed)
  projects/graid/8/contrib/xz/TODO   (props changed)
  projects/graid/8/contrib/xz/po/   (props changed)
  projects/graid/8/contrib/xz/src/   (props changed)
  projects/graid/8/crypto/heimdal/   (props changed)
  projects/graid/8/crypto/openssh/   (props changed)
  projects/graid/8/crypto/openssl/   (props changed)
  projects/graid/8/etc/   (props changed)
  projects/graid/8/games/factor/   (props changed)
  projects/graid/8/games/fortune/   (props changed)
  projects/graid/8/games/grdc/   (props changed)
  projects/graid/8/games/pom/   (props changed)
  projects/graid/8/gnu/lib/csu/   (props changed)
  projects/graid/8/gnu/lib/libgcc/   (props changed)
  projects/graid/8/gnu/lib/libstdc++/   (props changed)
  projects/graid/8/gnu/usr.bin/   (props changed)
  projects/graid/8/gnu/usr.bin/Makefile   (props changed)
  projects/graid/8/gnu/usr.bin/dialog/   (props changed)
  projects/graid/8/gnu/usr.bin/gdb/   (props changed)
  projects/graid/8/gnu/usr.bin/gdb/kgdb/   (props changed)
  projects/graid/8/gnu/usr.bin/groff/   (props changed)
  projects/graid/8/gnu/usr.bin/patch/   (props changed)
  projects/graid/8/include/   (props changed)
  projects/graid/8/kerberos5/lib/libgssapi_krb5/   (props changed)
  projects/graid/8/kerberos5/lib/libgssapi_spnego/   (props changed)
  projects/graid/8/kerberos5/usr.bin/kdestroy/   (props changed)
  projects/graid/8/kerberos5/usr.bin/kpasswd/   (props changed)
  projects/graid/8/lib/   (props changed)
  projects/graid/8/lib/bind/   (props changed)
  projects/graid/8/lib/csu/   (props changed)
  projects/graid/8/lib/libarchive/   (props changed)
  projects/graid/8/lib/libbluetooth/   (props changed)
  projects/graid/8/lib/libc/   (props changed)
  projects/graid/8/lib/libc/stdtime/   (props changed)
  projects/graid/8/lib/libc_r/   (props changed)
  projects/graid/8/lib/libcam/   (props changed)
  projects/graid/8/lib/libcompat/   (props changed)
  projects/graid/8/lib/libdevinfo/   (props changed)
  projects/graid/8/lib/libdisk/   (props changed)
  projects/graid/8/lib/libedit/   (props changed)
  projects/graid/8/lib/libelf/   (props changed)
  projects/graid/8/lib/libexpat/   (props changed)
  projects/graid/8/lib/libfetch/   (props changed)
  projects/graid/8/lib/libgeom/   (props changed)
  projects/graid/8/lib/libgpib/   (props changed)
  projects/graid/8/lib/libgssapi/   (props changed)
  projects/graid/8/lib/libjail/   (props changed)
  projects/graid/8/lib/libkse/   (props changed)
  projects/graid/8/lib/libkvm/   (props changed)
  projects/graid/8/lib/liblzma/   (props changed)
  projects/graid/8/lib/libmagic/   (props changed)
  projects/graid/8/lib/libmemstat/   (props changed)
  projects/graid/8/lib/libpam/   (props changed)
  projects/graid/8/lib/libpmc/   (props changed)
  projects/graid/8/lib/libproc/   (props changed)
  projects/graid/8/lib/libradius/   (props changed)
  projects/graid/8/lib/librpcsec_gss/   (props changed)
  projects/graid/8/lib/librtld_db/   (props changed)
  projects/graid/8/lib/libsm/   (props changed)
  projects/graid/8/lib/libstand/   (props changed)
  projects/graid/8/lib/libtacplus/   (props changed)
  projects/graid/8/lib/libthr/   (props changed)
  projects/graid/8/lib/libthread_db/   (props changed)
  projects/graid/8/lib/libufs/   (props changed)
  projects/graid/8/lib/libugidfw/   (props changed)
  projects/graid/8/lib/libusb/   (props changed)
  projects/graid/8/lib/libusb/usb.h   (props changed)
  projects/graid/8/lib/libusbhid/   (props changed)
  projects/graid/8/lib/libutil/   (props changed)
  projects/graid/8/lib/libz/   (props changed)
  projects/graid/8/lib/libz/contrib/   (props changed)
  projects/graid/8/lib/msun/   (props changed)
  projects/graid/8/libexec/   (props changed)
  projects/graid/8/libexec/ftpd/   (props changed)
  projects/graid/8/libexec/rtld-elf/   (props changed)
  projects/graid/8/libexec/tftpd/   (props changed)
  projects/graid/8/release/   (props changed)
  projects/graid/8/release/doc/en_US.ISO8859-1/hardware/   (props changed)
  projects/graid/8/release/picobsd/   (props changed)
  projects/graid/8/release/picobsd/floppy.tree/sbin/   (props changed)
  projects/graid/8/release/picobsd/floppy.tree/sbin/dhclient-script   (props changed)
  projects/graid/8/release/picobsd/qemu/   (props changed)
  projects/graid/8/release/picobsd/tinyware/login/   (props changed)
  projects/graid/8/release/powerpc/   (props changed)
  projects/graid/8/sbin/   (props changed)
  projects/graid/8/sbin/atacontrol/   (props changed)
  projects/graid/8/sbin/bsdlabel/   (props changed)
  projects/graid/8/sbin/camcontrol/   (props changed)
  projects/graid/8/sbin/ddb/   (props changed)
  projects/graid/8/sbin/devd/   (props changed)
  projects/graid/8/sbin/devfs/   (props changed)
  projects/graid/8/sbin/dhclient/   (props changed)
  projects/graid/8/sbin/dump/   (props changed)
  projects/graid/8/sbin/dumpfs/   (props changed)
  projects/graid/8/sbin/fdisk/   (props changed)
  projects/graid/8/sbin/fsck/   (props changed)
  projects/graid/8/sbin/fsck_ffs/   (props changed)
  projects/graid/8/sbin/fsck_msdosfs/   (props changed)
  projects/graid/8/sbin/fsirand/   (props changed)
  projects/graid/8/sbin/geom/   (props changed)
  projects/graid/8/sbin/geom/class/multipath/   (props changed)
  projects/graid/8/sbin/geom/class/part/   (props changed)
  projects/graid/8/sbin/geom/class/sched/gsched.8   (props changed)
  projects/graid/8/sbin/geom/class/stripe/   (props changed)
  projects/graid/8/sbin/ggate/   (props changed)
  projects/graid/8/sbin/growfs/   (props changed)
  projects/graid/8/sbin/hastctl/   (props changed)
  projects/graid/8/sbin/hastd/   (props changed)
  projects/graid/8/sbin/ifconfig/   (props changed)
  projects/graid/8/sbin/ipfw/   (props changed)
  projects/graid/8/sbin/iscontrol/   (props changed)
  projects/graid/8/sbin/kldload/   (props changed)
  projects/graid/8/sbin/kldstat/   (props changed)
  projects/graid/8/sbin/mdconfig/   (props changed)
  projects/graid/8/sbin/mksnap_ffs/   (props changed)
  projects/graid/8/sbin/mount/   (props changed)
  projects/graid/8/sbin/mount_cd9660/   (props changed)
  projects/graid/8/sbin/mount_msdosfs/   (props changed)
  projects/graid/8/sbin/mount_nfs/   (props changed)
  projects/graid/8/sbin/natd/   (props changed)
  projects/graid/8/sbin/newfs/   (props changed)
  projects/graid/8/sbin/newfs_msdos/   (props changed)
  projects/graid/8/sbin/ping6/   (props changed)
  projects/graid/8/sbin/reboot/   (props changed)
  projects/graid/8/sbin/restore/   (props changed)
  projects/graid/8/sbin/route/   (props changed)
  projects/graid/8/sbin/routed/   (props changed)
  projects/graid/8/sbin/setkey/   (props changed)
  projects/graid/8/sbin/spppcontrol/   (props changed)
  projects/graid/8/sbin/sysctl/   (props changed)
  projects/graid/8/sbin/tunefs/   (props changed)
  projects/graid/8/sbin/umount/   (props changed)
  projects/graid/8/secure/   (props changed)
  projects/graid/8/secure/lib/libcrypto/   (props changed)
  projects/graid/8/secure/lib/libssl/   (props changed)
  projects/graid/8/secure/usr.bin/bdes/   (props changed)
  projects/graid/8/secure/usr.bin/openssl/   (props changed)
  projects/graid/8/share/dict/   (props changed)
  projects/graid/8/share/doc/papers/jail/   (props changed)
  projects/graid/8/share/doc/smm/01.setup/   (props changed)
  projects/graid/8/share/examples/   (props changed)
  projects/graid/8/share/examples/etc/   (props changed)
  projects/graid/8/share/examples/kld/syscall/   (props changed)
  projects/graid/8/share/man/   (props changed)
  projects/graid/8/share/man/man1/   (props changed)
  projects/graid/8/share/man/man3/   (props changed)
  projects/graid/8/share/man/man4/   (props changed)
  projects/graid/8/share/man/man5/   (props changed)
  projects/graid/8/share/man/man7/   (props changed)
  projects/graid/8/share/man/man8/   (props changed)
  projects/graid/8/share/man/man9/   (props changed)
  projects/graid/8/share/misc/   (props changed)
  projects/graid/8/share/mk/   (props changed)
  projects/graid/8/share/syscons/   (props changed)
  projects/graid/8/share/termcap/   (props changed)
  projects/graid/8/share/timedef/   (props changed)
  projects/graid/8/share/zoneinfo/   (props changed)
  projects/graid/8/sys/   (props changed)
  projects/graid/8/sys/amd64/include/xen/   (props changed)
  projects/graid/8/sys/cddl/contrib/opensolaris/   (props changed)
  projects/graid/8/sys/contrib/dev/acpica/   (props changed)
  projects/graid/8/sys/contrib/pf/   (props changed)
  projects/graid/8/tools/   (props changed)
  projects/graid/8/tools/build/mk/   (props changed)
  projects/graid/8/tools/build/options/   (props changed)
  projects/graid/8/tools/debugscripts/   (props changed)
  projects/graid/8/tools/kerneldoc/subsys/   (props changed)
  projects/graid/8/tools/regression/acct/   (props changed)
  projects/graid/8/tools/regression/acltools/   (props changed)
  projects/graid/8/tools/regression/aio/aiotest/   (props changed)
  projects/graid/8/tools/regression/bin/   (props changed)
  projects/graid/8/tools/regression/bin/date/   (props changed)
  projects/graid/8/tools/regression/bin/sh/   (props changed)
  projects/graid/8/tools/regression/fifo/   (props changed)
  projects/graid/8/tools/regression/geom/   (props changed)
  projects/graid/8/tools/regression/lib/libc/   (props changed)
  projects/graid/8/tools/regression/lib/msun/test-conj.t   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest1/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest2/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest3/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest4/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest5/   (props changed)
  projects/graid/8/tools/regression/netinet/   (props changed)
  projects/graid/8/tools/regression/poll/   (props changed)
  projects/graid/8/tools/regression/posixsem/   (props changed)
  projects/graid/8/tools/regression/priv/   (props changed)
  projects/graid/8/tools/regression/sockets/unix_gc/   (props changed)
  projects/graid/8/tools/regression/usr.bin/   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/pgrep-_g.t   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/pgrep-_s.t   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/pkill-_g.t   (props changed)
  projects/graid/8/tools/regression/usr.bin/sed/   (props changed)
  projects/graid/8/tools/regression/usr.bin/tr/   (props changed)
  projects/graid/8/tools/test/   (props changed)
  projects/graid/8/tools/tools/   (props changed)
  projects/graid/8/tools/tools/ath/   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs.h   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5210.c   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5211.c   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5212.c   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5416.c   (props changed)
  projects/graid/8/tools/tools/mctest/   (props changed)
  projects/graid/8/tools/tools/nanobsd/   (props changed)
  projects/graid/8/tools/tools/netrate/   (props changed)
  projects/graid/8/tools/tools/netrate/tcpp/   (props changed)
  projects/graid/8/tools/tools/termcap/termcap.pl   (props changed)
  projects/graid/8/tools/tools/umastat/   (props changed)
  projects/graid/8/tools/tools/vimage/   (props changed)
  projects/graid/8/usr.bin/   (props changed)
  projects/graid/8/usr.bin/apply/   (props changed)
  projects/graid/8/usr.bin/ar/   (props changed)
  projects/graid/8/usr.bin/awk/   (props changed)
  projects/graid/8/usr.bin/biff/   (props changed)
  projects/graid/8/usr.bin/c89/   (props changed)
  projects/graid/8/usr.bin/c99/   (props changed)
  projects/graid/8/usr.bin/calendar/   (props changed)
  projects/graid/8/usr.bin/catman/   (props changed)
  projects/graid/8/usr.bin/chpass/Makefile   (props changed)
  projects/graid/8/usr.bin/column/   (props changed)
  projects/graid/8/usr.bin/comm/   (props changed)
  projects/graid/8/usr.bin/cpio/   (props changed)
  projects/graid/8/usr.bin/csup/   (props changed)
  projects/graid/8/usr.bin/du/   (props changed)
  projects/graid/8/usr.bin/ee/   (props changed)
  projects/graid/8/usr.bin/enigma/   (props changed)
  projects/graid/8/usr.bin/fetch/   (props changed)
  projects/graid/8/usr.bin/find/   (props changed)
  projects/graid/8/usr.bin/finger/   (props changed)
  projects/graid/8/usr.bin/fold/   (props changed)
  projects/graid/8/usr.bin/fstat/   (props changed)
  projects/graid/8/usr.bin/gcore/   (props changed)
  projects/graid/8/usr.bin/getopt/   (props changed)
  projects/graid/8/usr.bin/gzip/   (props changed)
  projects/graid/8/usr.bin/hexdump/   (props changed)
  projects/graid/8/usr.bin/indent/   (props changed)
  projects/graid/8/usr.bin/jot/   (props changed)
  projects/graid/8/usr.bin/kdump/   (props changed)
  projects/graid/8/usr.bin/killall/   (props changed)
  projects/graid/8/usr.bin/ktrace/   (props changed)
  projects/graid/8/usr.bin/ldd/   (props changed)
  projects/graid/8/usr.bin/lex/   (props changed)
  projects/graid/8/usr.bin/locale/   (props changed)
  projects/graid/8/usr.bin/locate/   (props changed)
  projects/graid/8/usr.bin/lockf/   (props changed)
  projects/graid/8/usr.bin/look/   (props changed)
  projects/graid/8/usr.bin/mail/   (props changed)
  projects/graid/8/usr.bin/make/   (props changed)
  projects/graid/8/usr.bin/makewhatis/   (props changed)
  projects/graid/8/usr.bin/minigzip/   (props changed)
  projects/graid/8/usr.bin/ncal/   (props changed)
  projects/graid/8/usr.bin/netstat/   (props changed)
  projects/graid/8/usr.bin/pathchk/   (props changed)
  projects/graid/8/usr.bin/perror/   (props changed)
  projects/graid/8/usr.bin/procstat/   (props changed)
  projects/graid/8/usr.bin/rpcgen/   (props changed)
  projects/graid/8/usr.bin/ruptime/   (props changed)
  projects/graid/8/usr.bin/script/   (props changed)
  projects/graid/8/usr.bin/sed/   (props changed)
  projects/graid/8/usr.bin/sockstat/   (props changed)
  projects/graid/8/usr.bin/split/   (props changed)
  projects/graid/8/usr.bin/stat/   (props changed)
  projects/graid/8/usr.bin/systat/   (props changed)
  projects/graid/8/usr.bin/tar/   (props changed)
  projects/graid/8/usr.bin/tftp/   (props changed)
  projects/graid/8/usr.bin/top/   (props changed)
  projects/graid/8/usr.bin/touch/   (props changed)
  projects/graid/8/usr.bin/tr/   (props changed)
  projects/graid/8/usr.bin/truss/   (props changed)
  projects/graid/8/usr.bin/uname/   (props changed)
  projects/graid/8/usr.bin/unifdef/   (props changed)
  projects/graid/8/usr.bin/uniq/   (props changed)
  projects/graid/8/usr.bin/unzip/   (props changed)
  projects/graid/8/usr.bin/uudecode/   (props changed)
  projects/graid/8/usr.bin/vmstat/   (props changed)
  projects/graid/8/usr.bin/w/   (props changed)
  projects/graid/8/usr.bin/whois/   (props changed)
  projects/graid/8/usr.bin/xinstall/   (props changed)
  projects/graid/8/usr.bin/xlint/   (props changed)
  projects/graid/8/usr.bin/xz/   (props changed)
  projects/graid/8/usr.bin/yacc/   (props changed)
  projects/graid/8/usr.sbin/   (props changed)
  projects/graid/8/usr.sbin/Makefile   (props changed)
  projects/graid/8/usr.sbin/acpi/   (props changed)
  projects/graid/8/usr.sbin/arp/   (props changed)
  projects/graid/8/usr.sbin/asf/   (props changed)
  projects/graid/8/usr.sbin/bluetooth/   (props changed)
  projects/graid/8/usr.sbin/bluetooth/bthidcontrol/   (props changed)
  projects/graid/8/usr.sbin/bluetooth/bthidd/   (props changed)
  projects/graid/8/usr.sbin/boot0cfg/   (props changed)
  projects/graid/8/usr.sbin/bsnmpd/   (props changed)
  projects/graid/8/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_processor_tbl.c   (props changed)
  projects/graid/8/usr.sbin/burncd/   (props changed)
  projects/graid/8/usr.sbin/cdcontrol/   (props changed)
  projects/graid/8/usr.sbin/chown/   (props changed)
  projects/graid/8/usr.sbin/config/   (props changed)
  projects/graid/8/usr.sbin/config/SMM.doc/   (props changed)
  projects/graid/8/usr.sbin/cpucontrol/   (props changed)
  projects/graid/8/usr.sbin/crashinfo/   (props changed)
  projects/graid/8/usr.sbin/cron/   (props changed)
  projects/graid/8/usr.sbin/crunch/examples/   (props changed)
  projects/graid/8/usr.sbin/ctm/   (props changed)
  projects/graid/8/usr.sbin/cxgbtool/   (props changed)
  projects/graid/8/usr.sbin/devinfo/   (props changed)
  projects/graid/8/usr.sbin/diskinfo/   (props changed)
  projects/graid/8/usr.sbin/dumpcis/cardinfo.h   (props changed)
  projects/graid/8/usr.sbin/dumpcis/cis.h   (props changed)
  projects/graid/8/usr.sbin/faithd/   (props changed)
  projects/graid/8/usr.sbin/fdcontrol/   (props changed)
  projects/graid/8/usr.sbin/fdformat/   (props changed)
  projects/graid/8/usr.sbin/fdread/   (props changed)
  projects/graid/8/usr.sbin/fdwrite/   (props changed)
  projects/graid/8/usr.sbin/fifolog/   (props changed)
  projects/graid/8/usr.sbin/flowctl/   (props changed)
  projects/graid/8/usr.sbin/freebsd-update/   (props changed)
  projects/graid/8/usr.sbin/i2c/   (props changed)
  projects/graid/8/usr.sbin/inetd/   (props changed)
  projects/graid/8/usr.sbin/iostat/   (props changed)
  projects/graid/8/usr.sbin/jail/   (props changed)
  projects/graid/8/usr.sbin/jls/   (props changed)
  projects/graid/8/usr.sbin/lpr/   (props changed)
  projects/graid/8/usr.sbin/mailwrapper/   (props changed)
  projects/graid/8/usr.sbin/makefs/ffs/ffs_bswap.c   (props changed)
  projects/graid/8/usr.sbin/makefs/ffs/ffs_subr.c   (props changed)
  projects/graid/8/usr.sbin/makefs/ffs/ufs_bswap.h   (props changed)
  projects/graid/8/usr.sbin/makefs/getid.c   (props changed)
  projects/graid/8/usr.sbin/mergemaster/   (props changed)
  projects/graid/8/usr.sbin/mfiutil/   (props changed)
  projects/graid/8/usr.sbin/mountd/   (props changed)
  projects/graid/8/usr.sbin/moused/   (props changed)
  projects/graid/8/usr.sbin/mptutil/   (props changed)
  projects/graid/8/usr.sbin/mtest/   (props changed)
  projects/graid/8/usr.sbin/mtree/   (props changed)
  projects/graid/8/usr.sbin/named/   (props changed)
  projects/graid/8/usr.sbin/ndp/   (props changed)
  projects/graid/8/usr.sbin/newsyslog/   (props changed)
  projects/graid/8/usr.sbin/nfsdumpstate/   (props changed)
  projects/graid/8/usr.sbin/ntp/   (props changed)
  projects/graid/8/usr.sbin/pciconf/   (props changed)
  projects/graid/8/usr.sbin/periodic/   (props changed)
  projects/graid/8/usr.sbin/pkg_install/   (props changed)
  projects/graid/8/usr.sbin/pmcannotate/   (props changed)
  projects/graid/8/usr.sbin/pmccontrol/   (props changed)
  projects/graid/8/usr.sbin/pmcstat/   (props changed)
  projects/graid/8/usr.sbin/powerd/   (props changed)
  projects/graid/8/usr.sbin/ppp/   (props changed)
  projects/graid/8/usr.sbin/pppctl/   (props changed)
  projects/graid/8/usr.sbin/pstat/   (props changed)
  projects/graid/8/usr.sbin/rpc.lockd/   (props changed)
  projects/graid/8/usr.sbin/rpc.umntall/   (props changed)
  projects/graid/8/usr.sbin/rtadvd/   (props changed)
  projects/graid/8/usr.sbin/rtsold/   (props changed)
  projects/graid/8/usr.sbin/sade/   (props changed)
  projects/graid/8/usr.sbin/service/   (props changed)
  projects/graid/8/usr.sbin/services_mkdb/   (props changed)
  projects/graid/8/usr.sbin/setfmac/   (props changed)
  projects/graid/8/usr.sbin/setpmac/   (props changed)
  projects/graid/8/usr.sbin/smbmsg/   (props changed)
  projects/graid/8/usr.sbin/sysinstall/   (props changed)
  projects/graid/8/usr.sbin/syslogd/   (props changed)
  projects/graid/8/usr.sbin/traceroute/   (props changed)
  projects/graid/8/usr.sbin/traceroute6/   (props changed)
  projects/graid/8/usr.sbin/uathload/   (props changed)
  projects/graid/8/usr.sbin/ugidfw/   (props changed)
  projects/graid/8/usr.sbin/uhsoctl/   (props changed)
  projects/graid/8/usr.sbin/usbconfig/   (props changed)
  projects/graid/8/usr.sbin/vidcontrol/   (props changed)
  projects/graid/8/usr.sbin/watchdogd/   (props changed)
  projects/graid/8/usr.sbin/wpa/   (props changed)
  projects/graid/8/usr.sbin/ypserv/   (props changed)
  projects/graid/8/usr.sbin/zic/   (props changed)

Modified: projects/graid/8/sbin/geom/class/raid/geom_raid.c
==============================================================================
--- projects/graid/8/sbin/geom/class/raid/geom_raid.c	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sbin/geom/class/raid/geom_raid.c	Fri Feb  4 23:57:50 2011	(r218307)
@@ -51,15 +51,40 @@ uint32_t version = G_RAID_VERSION;
 //static void raid_main(struct gctl_req *req, unsigned flags);
 
 struct g_command class_commands[] = {
-	{ "label", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
-	    "format name level prov ..."
+	{ "label", G_FLAG_VERBOSE, NULL,
+	    {
+		{ 'S', "size", G_VAL_OPTIONAL, G_TYPE_NUMBER },
+		{ 's', "strip", G_VAL_OPTIONAL, G_TYPE_NUMBER },
+		G_OPT_SENTINEL
+	    },
+	    NULL, "[-S size] [-s stripsize] format label level prov ..."
+	},
+	{ "add", G_FLAG_VERBOSE, NULL,
+	    {
+		{ 'S', "size", G_VAL_OPTIONAL, G_TYPE_NUMBER },
+		{ 's', "strip", G_VAL_OPTIONAL, G_TYPE_NUMBER },
+		G_OPT_SENTINEL
+	    },
+	    NULL, "[-S size] [-s stripsize] name label level"
+	},
+	{ "delete", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name [label|num]"
+	},
+	{ "insert", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name prov ..."
+	},
+	{ "remove", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name prov ..."
+	},
+	{ "fail", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name prov ..."
 	},
 	{ "stop", G_FLAG_VERBOSE, NULL,
 	    {
 		{ 'f', "force", NULL, G_TYPE_BOOL },
 		G_OPT_SENTINEL
 	    },
-	    NULL, "[-fv] name ..."
+	    NULL, "[-fv] name"
 	},
 	G_CMD_SENTINEL
 };

Modified: projects/graid/8/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/8/sbin/geom/class/raid/graid.8	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sbin/geom/class/raid/graid.8	Fri Feb  4 23:57:50 2011	(r218307)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd December 18, 2010
+.Dd February 3, 2011
 .Dt GRAID 8
 .Os
 .Sh NAME
@@ -33,65 +33,40 @@
 .Sh SYNOPSIS
 .Nm
 .Cm label
-.Op Fl Fhnv
-.Op Fl b Ar balance
-.Op Fl s Ar slice
-.Ar name
-.Ar prov ...
-.Nm
-.Cm clear
-.Op Fl v
+.Op Fl S Ar size
+.Op Fl s Ar strip
+.Ar format
+.Ar label
+.Ar level
 .Ar prov ...
 .Nm
-.Cm configure
-.Op Fl adfFhnv
-.Op Fl b Ar balance
-.Op Fl s Ar slice
-.Ar name
-.Nm
-.Cm configure
-.Op Fl v
-.Fl p Ar priority
+.Cm add
+.Op Fl S Ar size
+.Op Fl s Ar strip
 .Ar name
-.Ar prov
+.Ar label
+.Ar level
 .Nm
-.Cm rebuild
-.Op Fl v
+.Cm delete
 .Ar name
-.Ar prov ...
+.Op Ar label | Ar num
 .Nm
 .Cm insert
-.Op Fl hiv
-.Op Fl p Ar priority
 .Ar name
 .Ar prov ...
 .Nm
 .Cm remove
-.Op Fl v
-.Ar name
-.Ar prov ...
-.Nm
-.Cm activate
-.Op Fl v
 .Ar name
 .Ar prov ...
 .Nm
-.Cm deactivate
-.Op Fl v
+.Cm fail
 .Ar name
 .Ar prov ...
 .Nm
-.Cm forget
-.Op Fl v
-.Ar name ...
-.Nm
 .Cm stop
 .Op Fl fv
 .Ar name ...
 .Nm
-.Cm dump
-.Ar prov ...
-.Nm
 .Cm list
 .Nm
 .Cm status
@@ -102,128 +77,93 @@
 .Sh DESCRIPTION
 The
 .Nm
-utility is used for software RAID configurations.
-After a RAID's creation, all components are detected and configured
-automatically.
-All operations like failure detection, stale component detection, rebuild
-of stale components, etc.\& are also done automatically.
-The
-.Nm
-utility uses on-disk metadata to store all needed information.
+utility is used to manage software RAID configurations, supported by the
+GEOM RAID class.
+GEOM RAID class uses on-disk metadata to provide access to software-RAID
+volumes defined by different RAID BIOSes.
+Depending on RAID BIOS type and it's metadata format, different subsets of
+configurations and features are supported.
+To allow booting from RAID volume, the metadata format should match the
+RAID BIOS type and its capabilities.
+To guarantee that these match, it is recommended to create volumes via the
+RAID BIOS interface, while experienced users are free to do it using this
+utility.
 .Pp
 The first argument to
 .Nm
 indicates an action to be performed:
-.Bl -tag -width ".Cm deactivate"
+.Bl -tag -width ".Cm destroy"
 .It Cm label
-Create a mirror.
-The order of components is important, because a component's priority is based on its position
-(starting from 0 to 255).
-The component with the biggest priority is used by the
-.Cm prefer
-balance algorithm
-and is also used as a master component when resynchronization is needed,
-e.g.\& after a power failure when the device was open for writing.
-.Pp
-Additional options include:
-.Bl -tag -width ".Fl b Ar balance"
-.It Fl b Ar balance
-Specifies balance algorithm to use, one of:
-.Bl -tag -width ".Cm round-robin"
-.It Cm load
-Read from the component with the lowest load.
-This is the default balance algorithm.
-.It Cm prefer
-Read from the component with the biggest priority.
-.It Cm round-robin
-Use round-robin algorithm when choosing component to read.
-.It Cm split
-Split read requests, which are bigger than or equal to slice size on N pieces,
-where N is the number of active components.
-.El
-.It Fl F
-Do not synchronize after a power failure or system crash.
-Assumes device is in consistent state.
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl n
-Turn off autosynchronization of stale components.
-.It Fl s Ar slice
-When using the
-.Cm split
-balance algorithm and an I/O READ request is bigger than or equal to this value,
-the I/O request will be split into N pieces, where N is the number of active
-components.
-Defaults to 4096 bytes.
-.El
-.It Cm clear
-Clear metadata on the given providers.
-.It Cm configure
-Configure the given device.
+Create an array with single volume.
+The
+.Ar format
+argument specifies the on-disk metadata format to use for this array,
+such as "Intel".
+The
+.Ar label
+argument specifies teh label of the created volume.
+The
+.Ar level
+argument specifies the RAID level of the created volume, such as:
+"RAID0", "RAID1", etc.
+The subsequent list enumerates providers to use as array components.
+The special name "NONE" can be used to reserve space for absent disks.
+The order of components can be important, depending on specific RAID level
+and metadata format.
 .Pp
 Additional options include:
-.Bl -tag -width ".Fl p Ar priority"
-.It Fl a
-Turn on autosynchronization of stale components.
-.It Fl b Ar balance
-Specifies balance algorithm to use.
-.It Fl d
-Do not hardcode providers' names in metadata.
-.It Fl f
-Synchronize device after a power failure or system crash.
-.It Fl F
-Do not synchronize after a power failure or system crash.
-Assumes device is in consistent state.
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl n
-Turn off autosynchronization of stale components.
-.It Fl p Ar priority
-Specifies priority for the given component
-.Ar prov .
-.It Fl s Ar slice
-Specifies slice size for
-.Cm split
-balance algorithm.
+.Bl -tag -width ".Fl s Ar strip"
+.It Fl S Ar size
+Use
+.Ar size
+bytes on each component for this volume.
+Should be used if several volumes per array are planned, or if smaller
+components going to be inserted later.
+Defaults to size of the smallest component.
+.It Fl s Ar strip
+Specifies strip size in bytes.
+Defaults to 131072.
 .El
-.It Cm rebuild
-Rebuild the given mirror components forcibly.
-If autosynchronization was not turned off for the given device, this command
-should be unnecessary.
+.It Cm add
+Create another volume on the existing array.
+The
+.Ar name
+argument is the name of the existing array, reported by label command.
+The rest of arguments are the same as for the label command.
+.It Cm delete
+Delete volume(s) from the existing array.
+When the last volume is deleted, the array is also deleted and its metadata
+erased.
+The
+.Ar name
+argument is the name of existing array.
+Optional
+.Ar label
+or
+.Ar num
+arguments allow specifying volume for deletion.
 .It Cm insert
-Add the given component(s) to the existing mirror.
-.Pp
-Additional options include:
-.Bl -tag -width ".Fl p Ar priority"
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl i
-Mark component(s) as inactive immediately after insertion.
-.It Fl p Ar priority
-Specifies priority of the given component(s).
-.El
+Insert specified provider(s) into specified array instead of the first missing
+or failed components.
+If there are no such components, mark disk(s) as spare.
 .It Cm remove
-Remove the given component(s) from the mirror and clear metadata on it.
-.It Cm activate
-Activate the given component(s), which were marked as inactive before.
-.It Cm deactivate
-Mark the given component(s) as inactive, so it will not be automatically
-connected to the mirror.
-.It Cm forget
-Forget about components which are not connected.
-This command is useful when a disk has failed and cannot be reconnected, preventing the
-.Cm remove
-command from being used to remove it.
+Remove the specified provider(s) from the specified array and erase metadata.
+If there are spare disks present, the removed disk(s) will be replaced by
+spares.
+.It Cm fail
+Mark the given disks(s) as failed, removing from active use unless absolutely
+necessary due to exhausted redundancy.
+If there are spare disks present - failed disk(s) will be replaced with one
+of them.
 .It Cm stop
-Stop the given mirror.
+Stop the given array.
+The metadata will not be erased.
 .Pp
 Additional options include:
 .Bl -tag -width ".Fl f"
 .It Fl f
-Stop the given mirror even if it is opened.
+Stop the given array even if some of its volumes are opened.
 .El
-.It Cm dump
-Dump metadata stored on the given providers.
 .It Cm list
 See
 .Xr geom 8 .
@@ -243,16 +183,26 @@ Additional options include:
 .It Fl v
 Be more verbose.
 .El
+.Sh SUPPORTED METADATA FORMATS
+The GEOM RAID class follows a modular design, allowing different metadata
+formats to be used.
+Support is currently implemented for the following formats:
+.Bl -tag -width "Intel"
+.It Intel
+The format used by Intel RAID BIOS.
+Supports up to two volumes per array.
+Supports configurations: RAID0 (2+ disks), RAID1 (2 disks),
+RAID5 (3+ disks), RAID10 (4 disks).
+.El
+.Sh SUPPORTED RAID LEVELS
+The GEOM RAID class follows a modular design, allowing different RAID levels
+to be used.
+Support for the following RAID levels is currently implemented: RAID0, RAID1.
 .Sh EXIT STATUS
-Exit status is 0 on success, and 1 if the command fails.
+Exit status is 0 on success, and non-zero if the command fails.
 .Sh SEE ALSO
 .Xr geom 4 ,
-.Xr dumpon 8 ,
 .Xr geom 8 ,
-.Xr mount 8 ,
-.Xr newfs 8 ,
-.Xr savecore 8 ,
-.Xr umount 8 ,
 .Xr vinum 8
 .Sh HISTORY
 The
@@ -261,3 +211,4 @@ utility appeared in
 .Fx 9.0 .
 .Sh AUTHORS
 .An Alexander Motin Aq mav@FreeBSD.org
+.An M. Warner Losh Aq imp@FreeBSD.org

Modified: projects/graid/8/sbin/geom/core/geom.8
==============================================================================
--- projects/graid/8/sbin/geom/core/geom.8	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sbin/geom/core/geom.8	Fri Feb  4 23:57:50 2011	(r218307)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 5, 2008
+.Dd January 5, 2011
 .Dt GEOM 8
 .Os
 .Sh NAME
@@ -37,11 +37,12 @@
 .Nm
 .Ar class
 .Cm list
+.Op Fl a
 .Op Ar name ...
 .Nm
 .Ar class
 .Cm status
-.Op Fl s
+.Op Fl ags
 .Op Ar name ...
 .Nm
 .Ar class
@@ -69,6 +70,11 @@ List all available commands for the give
 Print detailed information (within the given class) about all geoms
 (if no additional arguments were specified) or the given geoms.
 This command is only available if the given class exists in the kernel.
+Additional options include:
+.Bl -tag -width ".Fl a"
+.It Fl a
+Print information for geoms without providers.
+.El
 .It Cm status
 Print general information (within the given class) about all geoms
 (if no additional arguments were specified) or the given geoms.
@@ -76,6 +82,10 @@ This command is only available if the gi
 .Pp
 Additional options include:
 .Bl -tag -width ".Fl s"
+.It Fl a
+When used with -g, print status for geoms without providers.
+.It Fl g
+Report statuses for geoms instead of providers.
 .It Fl s
 Produce script-friendly output.
 .El
@@ -126,6 +136,8 @@ NOP
 .It
 PART
 .It
+RAID
+.It
 RAID3
 .It
 SHSEC

Modified: projects/graid/8/sbin/geom/core/geom.c
==============================================================================
--- projects/graid/8/sbin/geom/core/geom.c	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sbin/geom/core/geom.c	Fri Feb  4 23:57:50 2011	(r218307)
@@ -76,15 +76,21 @@ static void std_unload(struct gctl_req *
 
 struct g_command std_commands[] = {
 	{ "help", 0, std_help, G_NULL_OPTS, NULL, NULL },
-	{ "list", 0, std_list, G_NULL_OPTS, NULL, 
-	    "[name ...]"
+	{ "list", 0, std_list,
+	    {
+		{ 'a', "all", NULL, G_TYPE_BOOL },
+		G_OPT_SENTINEL
+	    },
+	    NULL, "[-a] [name ...]"
 	},
 	{ "status", 0, std_status,
 	    {
+		{ 'a', "all", NULL, G_TYPE_BOOL },
+		{ 'g', "geoms", NULL, G_TYPE_BOOL },
 		{ 's', "script", NULL, G_TYPE_BOOL },
 		G_OPT_SENTINEL
 	    },
-	    NULL, "[-s] [name ...]"
+	    NULL, "[-ags] [name ...]"
 	},
 	{ "load", G_FLAG_VERBOSE | G_FLAG_LOADKLD, std_load, G_NULL_OPTS,
 	    NULL, NULL },
@@ -800,7 +806,7 @@ std_list(struct gctl_req *req, unsigned 
 	struct gclass *classp;
 	struct ggeom *gp;
 	const char *name;
-	int error, i, nargs;
+	int all, error, i, nargs;
 
 	error = geom_gettree(&mesh);
 	if (error != 0)
@@ -811,18 +817,18 @@ std_list(struct gctl_req *req, unsigned 
 		errx(EXIT_FAILURE, "Class %s not found.", gclass_name);
 	}
 	nargs = gctl_get_int(req, "nargs");
+	all = gctl_get_int(req, "all");
 	if (nargs > 0) {
 		for (i = 0; i < nargs; i++) {
 			name = gctl_get_ascii(req, "arg%d", i);
 			gp = find_geom(classp, name);
-			if (gp != NULL)
-				list_one_geom(gp);
-			else
+			if (gp == NULL)
 				errx(EXIT_FAILURE, "No such geom: %s.", name);
+			list_one_geom(gp);
 		}
 	} else {
 		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-			if (LIST_EMPTY(&gp->lg_provider))
+			if (LIST_EMPTY(&gp->lg_provider) && !all)
 				continue;
 			list_one_geom(gp);
 		}
@@ -841,7 +847,6 @@ std_status_available(void)
 static void
 status_update_len(struct ggeom *gp, int *name_len, int *status_len)
 {
-	struct gprovider *pp;
 	struct gconfig *conf;
 	int len;
 
@@ -849,11 +854,7 @@ status_update_len(struct ggeom *gp, int 
 	assert(name_len != NULL);
 	assert(status_len != NULL);
 
-	pp = LIST_FIRST(&gp->lg_provider);
-	if (pp != NULL)
-		len = strlen(pp->lg_name);
-	else
-		len = strlen(gp->lg_name);
+	len = strlen(gp->lg_name);
 	if (*name_len < len)
 		*name_len = len;
 	LIST_FOREACH(conf, &gp->lg_config, lg_config) {
@@ -865,25 +866,67 @@ status_update_len(struct ggeom *gp, int 
 	}
 }
 
+static void
+status_update_len_prs(struct ggeom *gp, int *name_len, int *status_len)
+{
+	struct gprovider *pp;
+	struct gconfig *conf;
+	int len, glen;
+
+	assert(gp != NULL);
+	assert(name_len != NULL);
+	assert(status_len != NULL);
+
+	glen = 0;
+	LIST_FOREACH(conf, &gp->lg_config, lg_config) {
+		if (strcasecmp(conf->lg_name, "state") == 0) {
+			glen = strlen(conf->lg_val);
+			break;
+		}
+	}
+	LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
+		len = strlen(pp->lg_name);
+		if (*name_len < len)
+			*name_len = len;
+		len = glen;
+		LIST_FOREACH(conf, &pp->lg_config, lg_config) {
+			if (strcasecmp(conf->lg_name, "state") == 0) {
+				len = strlen(conf->lg_val);
+				break;
+			}
+		}
+		if (*status_len < len)
+			*status_len = len;
+	}
+}
+
 static char *
 status_one_consumer(struct gconsumer *cp)
 {
 	static char buf[256];
 	struct gprovider *pp;
 	struct gconfig *conf;
+	const char *state, *syncr;
 
 	pp = cp->lg_provider;
 	if (pp == NULL)
 		return (NULL);
+	state = NULL;
+	syncr = NULL;
 	LIST_FOREACH(conf, &cp->lg_config, lg_config) {
+		if (strcasecmp(conf->lg_name, "state") == 0)
+			state = conf->lg_val;
 		if (strcasecmp(conf->lg_name, "synchronized") == 0)
-			break;
+			syncr = conf->lg_val;
 	}
-	if (conf == NULL)
+	if (state == NULL && syncr == NULL)
 		snprintf(buf, sizeof(buf), "%s", pp->lg_name);
-	else {
+	else if (state != NULL && syncr != NULL) {
+		snprintf(buf, sizeof(buf), "%s (%s, %s)", pp->lg_name,
+		    state, syncr);
+	} else {
 		snprintf(buf, sizeof(buf), "%s (%s)", pp->lg_name,
-		    conf->lg_val);
+		    state ? state : syncr);
 	}
 	return (buf);
 }
@@ -891,25 +934,19 @@ status_one_consumer(struct gconsumer *cp
 static void
 status_one_geom(struct ggeom *gp, int script, int name_len, int status_len)
 {
-	struct gprovider *pp;
 	struct gconsumer *cp;
 	struct gconfig *conf;
 	const char *name, *status, *component;
 	int gotone;
 
-	pp = LIST_FIRST(&gp->lg_provider);
-	if (pp != NULL)
-		name = pp->lg_name;
-	else
-		name = gp->lg_name;
+	name = gp->lg_name;
+	status = "N/A";
 	LIST_FOREACH(conf, &gp->lg_config, lg_config) {
-		if (strcasecmp(conf->lg_name, "state") == 0)
+		if (strcasecmp(conf->lg_name, "state") == 0) {
+			status = conf->lg_val;
 			break;
+		}
 	}
-	if (conf == NULL)
-		status = "N/A";
-	else
-		status = conf->lg_val;
 	gotone = 0;
 	LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) {
 		component = status_one_consumer(cp);
@@ -928,6 +965,48 @@ status_one_geom(struct ggeom *gp, int sc
 }
 
 static void
+status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len)
+{
+	struct gprovider *pp;
+	struct gconsumer *cp;
+	struct gconfig *conf;
+	const char *name, *status, *component;
+	int gotone;
+
+	LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
+		name = pp->lg_name;
+		status = "N/A";
+		LIST_FOREACH(conf, &gp->lg_config, lg_config) {
+			if (strcasecmp(conf->lg_name, "state") == 0) {
+				status = conf->lg_val;
+				break;
+			}
+		}
+		LIST_FOREACH(conf, &pp->lg_config, lg_config) {
+			if (strcasecmp(conf->lg_name, "state") == 0) {
+				status = conf->lg_val;
+				break;
+			}
+		}
+		gotone = 0;
+		LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) {
+			component = status_one_consumer(cp);
+			if (component == NULL)
+				continue;
+			gotone = 1;
+			printf("%*s  %*s  %s\n", name_len, name,
+			    status_len, status, component);
+			if (!script)
+				name = status = "";
+		}
+		if (!gotone) {
+			printf("%*s  %*s  %s\n", name_len, name,
+			    status_len, status, "N/A");
+		}
+	}
+}
+
+static void
 std_status(struct gctl_req *req, unsigned flags __unused)
 {
 	struct gmesh mesh;
@@ -935,7 +1014,7 @@ std_status(struct gctl_req *req, unsigne
 	struct ggeom *gp;
 	const char *name;
 	int name_len, status_len;
-	int error, i, n, nargs, script;
+	int all, error, geoms, i, n, nargs, script;
 
 	error = geom_gettree(&mesh);
 	if (error != 0)
@@ -944,28 +1023,45 @@ std_status(struct gctl_req *req, unsigne
 	if (classp == NULL)
 		errx(EXIT_FAILURE, "Class %s not found.", gclass_name);
 	nargs = gctl_get_int(req, "nargs");
+	all = gctl_get_int(req, "all");
+	geoms = gctl_get_int(req, "geoms");
 	script = gctl_get_int(req, "script");
-	name_len = strlen("Name");
-	status_len = strlen("Status");
+	if (script) {
+		name_len = 0;
+		status_len = 0;
+	} else {
+		name_len = strlen("Name");
+		status_len = strlen("Status");
+	}
 	if (nargs > 0) {
 		for (i = 0, n = 0; i < nargs; i++) {
 			name = gctl_get_ascii(req, "arg%d", i);
 			gp = find_geom(classp, name);
 			if (gp == NULL)
 				errx(EXIT_FAILURE, "No such geom: %s.", name);
-			else {
-				status_update_len(gp, &name_len, &status_len);
-				n++;
+			if (geoms) {
+				status_update_len(gp,
+				    &name_len, &status_len);
+			} else {
+				status_update_len_prs(gp,
+				    &name_len, &status_len);
 			}
+			n++;
 		}
 		if (n == 0)
 			goto end;
 	} else {
 		n = 0;
 		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-			if (LIST_EMPTY(&gp->lg_provider))
+			if (LIST_EMPTY(&gp->lg_provider) && !all)
 				continue;
-			status_update_len(gp, &name_len, &status_len);
+			if (geoms) {
+				status_update_len(gp,
+				    &name_len, &status_len);
+			} else {
+				status_update_len_prs(gp,
+				    &name_len, &status_len);
+			}
 			n++;
 		}
 		if (n == 0)
@@ -979,16 +1075,27 @@ std_status(struct gctl_req *req, unsigne
 		for (i = 0; i < nargs; i++) {
 			name = gctl_get_ascii(req, "arg%d", i);
 			gp = find_geom(classp, name);
-			if (gp != NULL) {
+			if (gp == NULL)
+				continue;
+			if (geoms) {
 				status_one_geom(gp, script, name_len,
 				    status_len);
+			} else {
+				status_one_geom_prs(gp, script, name_len,
+				    status_len);
 			}
 		}
 	} else {
 		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-			if (LIST_EMPTY(&gp->lg_provider))
+			if (LIST_EMPTY(&gp->lg_provider) && !all)
 				continue;
-			status_one_geom(gp, script, name_len, status_len);
+			if (geoms) {
+				status_one_geom(gp, script, name_len,
+				    status_len);
+			} else {
+				status_one_geom_prs(gp, script, name_len,
+				    status_len);
+			}
 		}
 	}
 end:

Copied: projects/graid/8/sys/amd64/conf/CISCO (from r216979, projects/graid/head/sys/amd64/conf/CISCO)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/graid/8/sys/amd64/conf/CISCO	Fri Feb  4 23:57:50 2011	(r218307, copy of r216979, projects/graid/head/sys/amd64/conf/CISCO)
@@ -0,0 +1,7 @@
+# Generic, tweaked for Cisco.
+include 	"GENERIC"
+ident		CISCO_CAM
+options 	ATA_CAM
+options 	ADA_TEST_FAILURE
+makeoptions	MODULES_OVERRIDE="geom"
+

Modified: projects/graid/8/sys/cam/ata/ata_da.c
==============================================================================
--- projects/graid/8/sys/cam/ata/ata_da.c	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sys/cam/ata/ata_da.c	Fri Feb  4 23:57:50 2011	(r218307)
@@ -27,6 +27,8 @@
 #include 
 __FBSDID("$FreeBSD$");
 
+#include "opt_ada.h"
+
 #include 
 
 #ifdef _KERNEL
@@ -125,11 +127,19 @@ struct ada_softc {
 	int	 outstanding_cmds;
 	int	 trim_max_ranges;
 	int	 trim_running;
+#ifdef ADA_TEST_FAILURE
+	int      force_read_error;
+	int      force_write_error;
+	int      periodic_read_error;
+        int      periodic_read_count;
+#endif
 	struct	 disk_params params;
 	struct	 disk *disk;
 	struct task		sysctl_task;
+#ifdef ADA_TEST_FAILURE
 	struct sysctl_ctx_list	sysctl_ctx;
 	struct sysctl_oid	*sysctl_tree;
+#endif
 	struct callout		sendordered_c;
 	struct trim_request	trim_req;
 };
@@ -156,7 +166,12 @@ static	dumper_t	adadump;
 static	periph_init_t	adainit;
 static	void		adaasync(void *callback_arg, u_int32_t code,
 				struct cam_path *path, void *arg);
+#ifdef ADA_TEST_FAILURE
 static	void		adasysctlinit(void *context, int pending);
+static	int		adaforcereaderrsysctl(SYSCTL_HANDLER_ARGS);
+static	int		adaforcewriteerrsysctl(SYSCTL_HANDLER_ARGS);
+static	int		adaperiodicreaderrsysctl(SYSCTL_HANDLER_ARGS);
+#endif
 static	periph_ctor_t	adaregister;
 static	periph_dtor_t	adacleanup;
 static	periph_start_t	adastart;
@@ -549,6 +564,7 @@ adacleanup(struct cam_periph *periph)
 	xpt_print(periph->path, "removing device entry\n");
 	cam_periph_unlock(periph);
 
+#ifdef ADA_TEST_FAILURE
 	/*
 	 * If we can't free the sysctl tree, oh well...
 	 */
@@ -556,6 +572,7 @@ adacleanup(struct cam_periph *periph)
 	    && sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
 		xpt_print(periph->path, "can't remove sysctl context\n");
 	}
+#endif
 
 	disk_destroy(softc->disk);
 	callout_drain(&softc->sendordered_c);
@@ -606,6 +623,7 @@ adaasync(void *callback_arg, u_int32_t c
 	}
 }
 
+#ifdef ADA_TEST_FAILURE
 static void
 adasysctlinit(void *context, int pending)
 {
@@ -632,9 +650,66 @@ adasysctlinit(void *context, int pending
 		return;
 	}
 
+	/*
+	 * Add a 'door bell' sysctl which allows one to set it from userland
+	 * and cause something bad to happen.  For the moment, we only allow
+	 * whacking the next read or write.
+	 */
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "force_read_error", CTLTYPE_INT | CTLFLAG_RW,
+		&softc->force_read_error, 0, adaforcereaderrsysctl, "I",
+		"Force a read error for the next N reads.");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "force_write_error", CTLTYPE_INT | CTLFLAG_RW,
+		&softc->force_write_error, 0, adaforcewriteerrsysctl, "I",
+		"Force a write error for the next N writes.");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "periodic_read_error", CTLTYPE_INT | CTLFLAG_RW,
+		&softc->periodic_read_error, 0, adaperiodicreaderrsysctl, "I",
+		"Force a read error every N reads (don't set too low).");
 	cam_periph_release(periph);
 }
 
+static int
+adaforcereaderrsysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, value;
+
+	value = *(int *)arg1;
+	error = sysctl_handle_int(oidp, &value, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	*(int *)arg1 = value;
+	return (0);
+}
+
+static int
+adaforcewriteerrsysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, value;
+
+	value = *(int *)arg1;
+	error = sysctl_handle_int(oidp, &value, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	*(int *)arg1 = value;
+	return (0);
+}
+
+static int
+adaperiodicreaderrsysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, value;
+
+	value = *(int *)arg1;
+	error = sysctl_handle_int(oidp, &value, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	*(int *)arg1 = value;
+	return (0);
+}
+#endif
+
 static cam_status
 adaregister(struct cam_periph *periph, void *arg)
 {
@@ -712,7 +787,9 @@ adaregister(struct cam_periph *periph, v
 	cpi.ccb_h.func_code = XPT_PATH_INQ;
 	xpt_action((union ccb *)&cpi);
 
+#ifdef ADA_TEST_FAILURE
 	TASK_INIT(&softc->sysctl_task, 0, adasysctlinit, periph);
+#endif
 
 	/*
 	 * Register this media as a disk
@@ -774,6 +851,14 @@ adaregister(struct cam_periph *periph, v
 		dp->secsize, dp->heads,
 		dp->secs_per_track, dp->cylinders);
 	xpt_announce_periph(periph, announce_buf);
+#ifdef ADA_TEST_FAILURE
+	/*
+	 * Create our sysctl variables, now that we know
+	 * we have successfully attached.
+	 * XXX: da code does a cam_periph_acquire(periph) here -- why?.
+	 */
+	taskqueue_enqueue(taskqueue_thread, &softc->sysctl_task);
+#endif
 	/*
 	 * Add async callbacks for bus reset and
 	 * bus device reset calls.  I don't bother
@@ -896,7 +981,45 @@ adastart(struct cam_periph *periph, unio
 		{
 			uint64_t lba = bp->bio_pblkno;
 			uint16_t count = bp->bio_bcount / softc->params.secsize;
+#ifdef ADA_TEST_FAILURE
+			int fail = 0;
 
+			/*
+			 * Support the failure ioctls.  If the command is a
+			 * read, and there are pending forced read errors, or
+			 * if a write and pending write errors, then fail this
+			 * operation with EIO.  This is useful for testing
+			 * purposes.  Also, support having every Nth read fail.
+			 *
+			 * This is a rather blunt tool.
+			 */
+			if (bp->bio_cmd == BIO_READ) {
+				if (softc->force_read_error) {
+					softc->force_read_error--;
+					fail = 1;
+				}
+				if (softc->periodic_read_error > 0) {
+					if (++softc->periodic_read_count >=
+					    softc->periodic_read_error) {
+						softc->periodic_read_count = 0;
+						fail = 1;
+					}
+				}
+			} else {
+				if (softc->force_write_error) {
+					softc->force_write_error--;
+					fail = 1;
+				}
+			}
+			if (fail) {
+				bp->bio_error = EIO;
+				bp->bio_flags |= BIO_ERROR;
+				biodone(bp);
+				xpt_release_ccb(start_ccb);
+				adaschedule(periph);
+				return;
+			}
+#endif
 			cam_fill_ataio(ataio,
 			    ada_retry_count,
 			    adadone,

Modified: projects/graid/8/sys/conf/options
==============================================================================
--- projects/graid/8/sys/conf/options	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sys/conf/options	Fri Feb  4 23:57:50 2011	(r218307)
@@ -305,6 +305,9 @@ SCSI_DELAY		opt_scsi.h
 SCSI_NO_SENSE_STRINGS	opt_scsi.h
 SCSI_NO_OP_STRINGS	opt_scsi.h
 
+# Options used only in cam/ata/ata_da.c
+ADA_TEST_FAILURE       opt_ada.h
+
 # Options used only in cam/scsi/scsi_cd.c
 CHANGER_MIN_BUSY_SECONDS	opt_cd.h
 CHANGER_MAX_BUSY_SECONDS	opt_cd.h

Modified: projects/graid/8/sys/dev/led/led.c
==============================================================================
--- projects/graid/8/sys/dev/led/led.c	Fri Feb  4 22:47:55 2011	(r218306)
+++ projects/graid/8/sys/dev/led/led.c	Fri Feb  4 23:57:50 2011	(r218307)
@@ -26,6 +26,7 @@ __FBSDID("$FreeBSD$");
 
 struct ledsc {
 	LIST_ENTRY(ledsc)	list;
+	char			*name;
 	void			*private;
 	int			unit;
 	led_t			*func;
@@ -83,71 +84,43 @@ led_timeout(void *p)
 }
 
 static int
-led_state(struct cdev *dev, struct sbuf *sb, int state)
+led_state(struct ledsc *sc, struct sbuf **sb, int state)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 09:37:35 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 19778106564A;
	Sat,  5 Feb 2011 09:37:35 +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 E39548FC1B;
	Sat,  5 Feb 2011 09:37:34 +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 p159bYnM021714;
	Sat, 5 Feb 2011 09:37:34 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p159bY6D021712;
	Sat, 5 Feb 2011 09:37:34 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102050937.p159bY6D021712@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 09:37:34 +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: r218314 - 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: Sat, 05 Feb 2011 09:37:35 -0000

Author: mav
Date: Sat Feb  5 09:37:34 2011
New Revision: 218314
URL: http://svn.freebsd.org/changeset/base/218314

Log:
  Add check that size and strip arguments are positive. Mostly do it because
  of mossing optional arguments support in 7-STABLE.

Modified:
  projects/graid/head/sys/geom/raid/md_intel.c

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Sat Feb  5 06:26:16 2011	(r218313)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Sat Feb  5 09:37:34 2011	(r218314)
@@ -1364,7 +1364,8 @@ makedisk:
 		/* Handle size argument. */
 		len = sizeof(*sizearg);
 		sizearg = gctl_get_param(req, "size", &len);
-		if (sizearg != NULL && len == sizeof(*sizearg)) {
+		if (sizearg != NULL && len == sizeof(*sizearg) &&
+		    *sizearg > 0) {
 			if (*sizearg > size) {
 				gctl_error(req, "Size too big %lld > %lld.",
 				    (long long)*sizearg, (long long)size);
@@ -1377,7 +1378,8 @@ makedisk:
 		strip = 131072;
 		len = sizeof(*striparg);
 		striparg = gctl_get_param(req, "strip", &len);
-		if (striparg != NULL && len == sizeof(*striparg)) {
+		if (striparg != NULL && len == sizeof(*striparg) &&
+		    *striparg > 0) {
 			if (*striparg < sectorsize) {
 				gctl_error(req, "Strip size too small.");
 				return (-10);
@@ -1536,7 +1538,8 @@ makedisk:
 		/* Handle size argument. */
 		len = sizeof(*sizearg);
 		sizearg = gctl_get_param(req, "size", &len);
-		if (sizearg != NULL && len == sizeof(*sizearg)) {
+		if (sizearg != NULL && len == sizeof(*sizearg) &&
+		    *sizearg > 0) {
 			if (*sizearg > size) {
 				gctl_error(req, "Size too big %lld > %lld.",
 				    (long long)*sizearg, (long long)size);
@@ -1549,7 +1552,8 @@ makedisk:
 		strip = 131072;
 		len = sizeof(*striparg);
 		striparg = gctl_get_param(req, "strip", &len);
-		if (striparg != NULL && len == sizeof(*striparg)) {
+		if (striparg != NULL && len == sizeof(*striparg) &&
+		    *striparg > 0) {
 			if (*striparg < sectorsize) {
 				gctl_error(req, "Strip size too small.");
 				return (-10);

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 09:39:32 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 74113106564A;
	Sat,  5 Feb 2011 09:39:32 +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 648488FC08;
	Sat,  5 Feb 2011 09:39:32 +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 p159dWvB021786;
	Sat, 5 Feb 2011 09:39:32 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p159dW8u021784;
	Sat, 5 Feb 2011 09:39:32 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102050939.p159dW8u021784@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 09:39:32 +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: r218315 - projects/graid/head/sbin/geom/class/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: Sat, 05 Feb 2011 09:39:32 -0000

Author: mav
Date: Sat Feb  5 09:39:32 2011
New Revision: 218315
URL: http://svn.freebsd.org/changeset/base/218315

Log:
  Some cleanup.

Modified:
  projects/graid/head/sbin/geom/class/raid/geom_raid.c

Modified: projects/graid/head/sbin/geom/class/raid/geom_raid.c
==============================================================================
--- projects/graid/head/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 09:37:34 2011	(r218314)
+++ projects/graid/head/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 09:39:32 2011	(r218315)
@@ -44,12 +44,6 @@ __FBSDID("$FreeBSD$");
 uint32_t lib_version = G_LIB_VERSION;
 uint32_t version = G_RAID_VERSION;
 
-#define	GRAID_BALANCE		"load"
-#define	GRAID_SLICE		"4096"
-#define	GRAID_PRIORITY	"0"
-
-//static void raid_main(struct gctl_req *req, unsigned flags);
-
 struct g_command class_commands[] = {
 	{ "label", G_FLAG_VERBOSE, NULL,
 	    {
@@ -89,32 +83,3 @@ struct g_command class_commands[] = {
 	G_CMD_SENTINEL
 };
 
-#if 0
-static int verbose = 0;
-
-static void
-raid_main(struct gctl_req *req, unsigned flags)
-{
-	const char *name;
-
-	if ((flags & G_FLAG_VERBOSE) != 0)
-		verbose = 1;
-
-	name = gctl_get_ascii(req, "verb");
-	if (name == NULL) {
-		gctl_error(req, "No '%s' argument.", "verb");
-		return;
-	}
-	if (strcmp(name, "label") == 0)
-		raid_label(req);
-	else if (strcmp(name, "clear") == 0)
-		raid_clear(req);
-	else if (strcmp(name, "dump") == 0)
-		raid_dump(req);
-	else if (strcmp(name, "activate") == 0)
-		raid_activate(req);
-	else
-		gctl_error(req, "Unknown command: %s.", name);
-}
-#endif
-

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 11:12:12 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 F372A106564A;
	Sat,  5 Feb 2011 11:12:11 +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 E0DF78FC28;
	Sat,  5 Feb 2011 11:12:11 +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 p15BCBUW025521;
	Sat, 5 Feb 2011 11:12:11 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p15BCBNC025513;
	Sat, 5 Feb 2011 11:12:11 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102051112.p15BCBNC025513@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 11:12:11 +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: r218316 - in projects/graid/7: . contrib/bsnmp/snmpd
	contrib/wpa_supplicant gnu/usr.bin/groff/tmac
	sbin/geom/class/raid sbin/geom/core share/misc sys/amd64/conf
	sys/cam/ata sys/conf sys...
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: Sat, 05 Feb 2011 11:12:12 -0000

Author: mav
Date: Sat Feb  5 11:12:11 2011
New Revision: 218316
URL: http://svn.freebsd.org/changeset/base/218316

Log:
  MFH
  r216978, r216979, r216980, r216981, r216984, r217014, r217188,
  r217189, r217193, r216981, r216984, r217014, r217188, r217189,
  r217193, r217194, r217267, r217284, r217285, r217287, r217293,
  r217301, r217311, r217363, r217372, r217373, r217378, r217380,
  r217389, r217409, r217411, r217462, r217465, r217466, r217467,
  r217507, r217546, r217565, r217662, r217827, r217828, r217842,
  r217884, r217889, r217891, r217892, r217907, r217912, r217918,
  r217919, r217920, r217926, r217929, r217972, r217989, r217992,
  r217998, r217999, r218006, r218008, r218016, r218023, r218052,
  r218053, r218062, r218063, r218083, r218084, r218086, r218106,
  r218143, r218161, r218174, r218204, r218212, r218213, r218220,
  r218222, r218224, r218226, r218230, r218231, r218233, r218234,
  r218236, r218237, r218239, r218244, r218247, r218248, r218249,
  r218250, r218251, r218252, r218253, r218254, r218255, r218257,
  r218260, r218262, r218263, r218265, r218279, r218281, r218282,
  r218314, r218315

Added:
  projects/graid/7/sys/amd64/conf/CISCO
     - copied unchanged from r216979, projects/graid/head/sys/amd64/conf/CISCO
Modified:
  projects/graid/7/sbin/geom/class/raid/geom_raid.c
  projects/graid/7/sbin/geom/class/raid/graid.8
  projects/graid/7/sbin/geom/core/geom.8
  projects/graid/7/sbin/geom/core/geom.c
  projects/graid/7/sys/cam/ata/ata_da.c
  projects/graid/7/sys/conf/options
  projects/graid/7/sys/dev/led/led.c
  projects/graid/7/sys/dev/led/led.h
  projects/graid/7/sys/geom/geom.h
  projects/graid/7/sys/geom/geom_dev.c
  projects/graid/7/sys/geom/geom_disk.c
  projects/graid/7/sys/geom/raid/g_raid.c
  projects/graid/7/sys/geom/raid/g_raid.h
  projects/graid/7/sys/geom/raid/g_raid_ctl.c
  projects/graid/7/sys/geom/raid/g_raid_md_if.m
  projects/graid/7/sys/geom/raid/g_raid_tr_if.m
  projects/graid/7/sys/geom/raid/md_intel.c
  projects/graid/7/sys/geom/raid/tr_raid0.c
  projects/graid/7/sys/geom/raid/tr_raid1.c
Directory Properties:
  projects/graid/7/   (props changed)
  projects/graid/7/COPYRIGHT   (props changed)
  projects/graid/7/Makefile   (props changed)
  projects/graid/7/Makefile.inc1   (props changed)
  projects/graid/7/ObsoleteFiles.inc   (props changed)
  projects/graid/7/UPDATING   (props changed)
  projects/graid/7/bin/   (props changed)
  projects/graid/7/bin/chflags/   (props changed)
  projects/graid/7/bin/chio/   (props changed)
  projects/graid/7/bin/cp/   (props changed)
  projects/graid/7/bin/csh/   (props changed)
  projects/graid/7/bin/dd/   (props changed)
  projects/graid/7/bin/df/   (props changed)
  projects/graid/7/bin/echo/   (props changed)
  projects/graid/7/bin/expr/   (props changed)
  projects/graid/7/bin/kill/   (props changed)
  projects/graid/7/bin/ln/   (props changed)
  projects/graid/7/bin/ls/   (props changed)
  projects/graid/7/bin/pax/   (props changed)
  projects/graid/7/bin/ps/   (props changed)
  projects/graid/7/bin/rm/   (props changed)
  projects/graid/7/bin/sh/   (props changed)
  projects/graid/7/bin/test/   (props changed)
  projects/graid/7/cddl/contrib/opensolaris/   (props changed)
  projects/graid/7/cddl/lib/libzpool/   (props changed)
  projects/graid/7/contrib/bind9/   (props changed)
  projects/graid/7/contrib/binutils/   (props changed)
  projects/graid/7/contrib/bsnmp/   (props changed)
  projects/graid/7/contrib/bsnmp/snmpd/bsnmpd.1   (props changed)
  projects/graid/7/contrib/cpio/   (props changed)
  projects/graid/7/contrib/csup/   (props changed)
  projects/graid/7/contrib/expat/   (props changed)
  projects/graid/7/contrib/gcc/   (props changed)
  projects/graid/7/contrib/gdb/   (props changed)
  projects/graid/7/contrib/gdtoa/   (props changed)
  projects/graid/7/contrib/groff/   (props changed)
  projects/graid/7/contrib/ipfilter/   (props changed)
  projects/graid/7/contrib/less/   (props changed)
  projects/graid/7/contrib/libpcap/   (props changed)
  projects/graid/7/contrib/ncurses/   (props changed)
  projects/graid/7/contrib/netcat/   (props changed)
  projects/graid/7/contrib/ntp/   (props changed)
  projects/graid/7/contrib/nvi/   (props changed)
  projects/graid/7/contrib/pf/   (props changed)
  projects/graid/7/contrib/sendmail/   (props changed)
  projects/graid/7/contrib/smbfs/   (props changed)
  projects/graid/7/contrib/tcp_wrappers/   (props changed)
  projects/graid/7/contrib/tcsh/   (props changed)
  projects/graid/7/contrib/telnet/   (props changed)
  projects/graid/7/contrib/top/   (props changed)
  projects/graid/7/contrib/traceroute/   (props changed)
  projects/graid/7/contrib/wpa_supplicant/   (props changed)
  projects/graid/7/contrib/wpa_supplicant/wpa_supplicant.conf   (props changed)
  projects/graid/7/crypto/openssh/   (props changed)
  projects/graid/7/crypto/openssl/   (props changed)
  projects/graid/7/etc/   (props changed)
  projects/graid/7/games/factor/   (props changed)
  projects/graid/7/games/fortune/   (props changed)
  projects/graid/7/games/grdc/   (props changed)
  projects/graid/7/gnu/   (props changed)
  projects/graid/7/gnu/lib/libstdc++/   (props changed)
  projects/graid/7/gnu/usr.bin/   (props changed)
  projects/graid/7/gnu/usr.bin/cc/   (props changed)
  projects/graid/7/gnu/usr.bin/cpio/   (props changed)
  projects/graid/7/gnu/usr.bin/cvs/   (props changed)
  projects/graid/7/gnu/usr.bin/gdb/   (props changed)
  projects/graid/7/gnu/usr.bin/gdb/kgdb/   (props changed)
  projects/graid/7/gnu/usr.bin/grep/   (props changed)
  projects/graid/7/gnu/usr.bin/groff/   (props changed)
  projects/graid/7/gnu/usr.bin/groff/tmac/mdoc.local   (props changed)
  projects/graid/7/gnu/usr.bin/man/   (props changed)
  projects/graid/7/gnu/usr.bin/sort/   (props changed)
  projects/graid/7/include/   (props changed)
  projects/graid/7/kerberos5/   (props changed)
  projects/graid/7/lib/   (props changed)
  projects/graid/7/lib/bind/   (props changed)
  projects/graid/7/lib/csu/   (props changed)
  projects/graid/7/lib/libarchive/   (props changed)
  projects/graid/7/lib/libbluetooth/   (props changed)
  projects/graid/7/lib/libc/   (props changed)
  projects/graid/7/lib/libc/stdtime/   (props changed)
  projects/graid/7/lib/libc_r/   (props changed)
  projects/graid/7/lib/libcam/   (props changed)
  projects/graid/7/lib/libdisk/   (props changed)
  projects/graid/7/lib/libdwarf/   (props changed)
  projects/graid/7/lib/libelf/   (props changed)
  projects/graid/7/lib/libexpat/   (props changed)
  projects/graid/7/lib/libfetch/   (props changed)
  projects/graid/7/lib/libftpio/   (props changed)
  projects/graid/7/lib/libgeom/   (props changed)
  projects/graid/7/lib/libgssapi/   (props changed)
  projects/graid/7/lib/libkse/   (props changed)
  projects/graid/7/lib/libkvm/   (props changed)
  projects/graid/7/lib/libmagic/   (props changed)
  projects/graid/7/lib/libmemstat/   (props changed)
  projects/graid/7/lib/libpmc/   (props changed)
  projects/graid/7/lib/libradius/   (props changed)
  projects/graid/7/lib/libsm/   (props changed)
  projects/graid/7/lib/libstand/   (props changed)
  projects/graid/7/lib/libthr/   (props changed)
  projects/graid/7/lib/libthread_db/   (props changed)
  projects/graid/7/lib/libufs/   (props changed)
  projects/graid/7/lib/libutil/   (props changed)
  projects/graid/7/lib/msun/   (props changed)
  projects/graid/7/libexec/   (props changed)
  projects/graid/7/libexec/ftpd/   (props changed)
  projects/graid/7/libexec/rpc.rquotad/   (props changed)
  projects/graid/7/libexec/rpc.rstatd/   (props changed)
  projects/graid/7/libexec/rtld-elf/   (props changed)
  projects/graid/7/libexec/tftpd/   (props changed)
  projects/graid/7/release/   (props changed)
  projects/graid/7/release/doc/   (props changed)
  projects/graid/7/release/doc/en_US.ISO8859-1/hardware/   (props changed)
  projects/graid/7/release/picobsd/tinyware/login/   (props changed)
  projects/graid/7/rescue/   (props changed)
  projects/graid/7/sbin/   (props changed)
  projects/graid/7/sbin/atacontrol/   (props changed)
  projects/graid/7/sbin/bsdlabel/   (props changed)
  projects/graid/7/sbin/clri/   (props changed)
  projects/graid/7/sbin/ddb/   (props changed)
  projects/graid/7/sbin/devd/   (props changed)
  projects/graid/7/sbin/devfs/   (props changed)
  projects/graid/7/sbin/dhclient/   (props changed)
  projects/graid/7/sbin/dumpfs/   (props changed)
  projects/graid/7/sbin/fdisk/   (props changed)
  projects/graid/7/sbin/fdisk_pc98/   (props changed)
  projects/graid/7/sbin/fsck/   (props changed)
  projects/graid/7/sbin/fsck_ffs/   (props changed)
  projects/graid/7/sbin/fsck_msdosfs/   (props changed)
  projects/graid/7/sbin/geom/   (props changed)
  projects/graid/7/sbin/geom/class/label/   (props changed)
  projects/graid/7/sbin/geom/class/part/   (props changed)
  projects/graid/7/sbin/geom/class/stripe/   (props changed)
  projects/graid/7/sbin/geom/misc/   (props changed)
  projects/graid/7/sbin/growfs/   (props changed)
  projects/graid/7/sbin/ifconfig/   (props changed)
  projects/graid/7/sbin/init/   (props changed)
  projects/graid/7/sbin/ipf/   (props changed)
  projects/graid/7/sbin/ipfw/   (props changed)
  projects/graid/7/sbin/md5/   (props changed)
  projects/graid/7/sbin/mdconfig/   (props changed)
  projects/graid/7/sbin/mksnap_ffs/   (props changed)
  projects/graid/7/sbin/mount/   (props changed)
  projects/graid/7/sbin/mount_msdosfs/   (props changed)
  projects/graid/7/sbin/natd/   (props changed)
  projects/graid/7/sbin/newfs/   (props changed)
  projects/graid/7/sbin/newfs_msdos/   (props changed)
  projects/graid/7/sbin/ping6/   (props changed)
  projects/graid/7/sbin/reboot/   (props changed)
  projects/graid/7/sbin/restore/   (props changed)
  projects/graid/7/sbin/route/   (props changed)
  projects/graid/7/sbin/savecore/   (props changed)
  projects/graid/7/sbin/sconfig/   (props changed)
  projects/graid/7/sbin/shutdown/   (props changed)
  projects/graid/7/sbin/sysctl/   (props changed)
  projects/graid/7/sbin/tunefs/   (props changed)
  projects/graid/7/secure/lib/libcrypto/   (props changed)
  projects/graid/7/secure/lib/libssh/   (props changed)
  projects/graid/7/secure/lib/libssl/   (props changed)
  projects/graid/7/secure/libexec/sftp-server/   (props changed)
  projects/graid/7/secure/usr.bin/bdes/   (props changed)
  projects/graid/7/secure/usr.bin/openssl/   (props changed)
  projects/graid/7/secure/usr.bin/ssh/   (props changed)
  projects/graid/7/secure/usr.sbin/sshd/   (props changed)
  projects/graid/7/share/   (props changed)
  projects/graid/7/share/colldef/   (props changed)
  projects/graid/7/share/dict/   (props changed)
  projects/graid/7/share/doc/bind9/   (props changed)
  projects/graid/7/share/doc/papers/jail/   (props changed)
  projects/graid/7/share/doc/smm/01.setup/   (props changed)
  projects/graid/7/share/examples/   (props changed)
  projects/graid/7/share/man/   (props changed)
  projects/graid/7/share/man/man1/   (props changed)
  projects/graid/7/share/man/man3/   (props changed)
  projects/graid/7/share/man/man4/   (props changed)
  projects/graid/7/share/man/man5/   (props changed)
  projects/graid/7/share/man/man7/   (props changed)
  projects/graid/7/share/man/man8/   (props changed)
  projects/graid/7/share/man/man9/   (props changed)
  projects/graid/7/share/misc/   (props changed)
  projects/graid/7/share/misc/iso639   (props changed)
  projects/graid/7/share/misc/pci_vendors   (props changed)
  projects/graid/7/share/mk/   (props changed)
  projects/graid/7/share/mklocale/   (props changed)
  projects/graid/7/share/monetdef/   (props changed)
  projects/graid/7/share/msgdef/   (props changed)
  projects/graid/7/share/numericdef/   (props changed)
  projects/graid/7/share/sendmail/   (props changed)
  projects/graid/7/share/syscons/   (props changed)
  projects/graid/7/share/syscons/keymaps/   (props changed)
  projects/graid/7/share/termcap/   (props changed)
  projects/graid/7/share/timedef/   (props changed)
  projects/graid/7/share/zoneinfo/   (props changed)
  projects/graid/7/sys/   (props changed)
  projects/graid/7/sys/cddl/contrib/opensolaris/   (props changed)
  projects/graid/7/sys/contrib/dev/acpica/   (props changed)
  projects/graid/7/sys/contrib/pf/   (props changed)
  projects/graid/7/tools/   (props changed)
  projects/graid/7/tools/build/   (props changed)
  projects/graid/7/tools/build/options/   (props changed)
  projects/graid/7/tools/debugscripts/   (props changed)
  projects/graid/7/tools/regression/acct/   (props changed)
  projects/graid/7/tools/regression/atm/   (props changed)
  projects/graid/7/tools/regression/bin/   (props changed)
  projects/graid/7/tools/regression/bin/date/   (props changed)
  projects/graid/7/tools/regression/bin/sh/   (props changed)
  projects/graid/7/tools/regression/file/   (props changed)
  projects/graid/7/tools/regression/file/flock/   (props changed)
  projects/graid/7/tools/regression/lib/libc/   (props changed)
  projects/graid/7/tools/regression/usr.bin/   (props changed)
  projects/graid/7/tools/regression/usr.bin/jot/   (props changed)
  projects/graid/7/tools/regression/usr.bin/tr/   (props changed)
  projects/graid/7/tools/sched/   (props changed)
  projects/graid/7/tools/test/   (props changed)
  projects/graid/7/tools/tools/   (props changed)
  projects/graid/7/tools/tools/aac/   (props changed)
  projects/graid/7/tools/tools/crypto/   (props changed)
  projects/graid/7/tools/tools/editing/   (props changed)
  projects/graid/7/tools/tools/nanobsd/   (props changed)
  projects/graid/7/tools/tools/nanobsd/FlashDevice.sub   (props changed)
  projects/graid/7/tools/tools/nanobsd/nanobsd.sh   (props changed)
  projects/graid/7/tools/tools/netrate/   (props changed)
  projects/graid/7/tools/tools/umastat/   (props changed)
  projects/graid/7/tools/tools/usb/   (props changed)
  projects/graid/7/usr.bin/   (props changed)
  projects/graid/7/usr.bin/basename/   (props changed)
  projects/graid/7/usr.bin/bluetooth/rfcomm_sppd/   (props changed)
  projects/graid/7/usr.bin/calendar/   (props changed)
  projects/graid/7/usr.bin/catman/   (props changed)
  projects/graid/7/usr.bin/cksum/   (props changed)
  projects/graid/7/usr.bin/comm/   (props changed)
  projects/graid/7/usr.bin/cpuset/   (props changed)
  projects/graid/7/usr.bin/csup/   (props changed)
  projects/graid/7/usr.bin/dirname/   (props changed)
  projects/graid/7/usr.bin/du/   (props changed)
  projects/graid/7/usr.bin/fetch/   (props changed)
  projects/graid/7/usr.bin/file/   (props changed)
  projects/graid/7/usr.bin/find/   (props changed)
  projects/graid/7/usr.bin/finger/   (props changed)
  projects/graid/7/usr.bin/fold/   (props changed)
  projects/graid/7/usr.bin/fstat/   (props changed)
  projects/graid/7/usr.bin/gcore/   (props changed)
  projects/graid/7/usr.bin/gprof/   (props changed)
  projects/graid/7/usr.bin/gzip/   (props changed)
  projects/graid/7/usr.bin/hexdump/   (props changed)
  projects/graid/7/usr.bin/id/   (props changed)
  projects/graid/7/usr.bin/indent/   (props changed)
  projects/graid/7/usr.bin/ipcrm/   (props changed)
  projects/graid/7/usr.bin/ipcs/   (props changed)
  projects/graid/7/usr.bin/jot/   (props changed)
  projects/graid/7/usr.bin/kdump/   (props changed)
  projects/graid/7/usr.bin/ktrace/   (props changed)
  projects/graid/7/usr.bin/ldd/   (props changed)
  projects/graid/7/usr.bin/less/   (props changed)
  projects/graid/7/usr.bin/locate/   (props changed)
  projects/graid/7/usr.bin/lockf/   (props changed)
  projects/graid/7/usr.bin/logger/   (props changed)
  projects/graid/7/usr.bin/make/   (props changed)
  projects/graid/7/usr.bin/ncal/   (props changed)
  projects/graid/7/usr.bin/netstat/   (props changed)
  projects/graid/7/usr.bin/newgrp/   (props changed)
  projects/graid/7/usr.bin/nsupdate/   (props changed)
  projects/graid/7/usr.bin/pkill/   (props changed)
  projects/graid/7/usr.bin/procstat/   (props changed)
  projects/graid/7/usr.bin/quota/   (props changed)
  projects/graid/7/usr.bin/rpcgen/   (props changed)
  projects/graid/7/usr.bin/ruptime/   (props changed)
  projects/graid/7/usr.bin/script/   (props changed)
  projects/graid/7/usr.bin/sed/   (props changed)
  projects/graid/7/usr.bin/shar/   (props changed)
  projects/graid/7/usr.bin/sockstat/   (props changed)
  projects/graid/7/usr.bin/stat/   (props changed)
  projects/graid/7/usr.bin/su/   (props changed)
  projects/graid/7/usr.bin/systat/   (props changed)
  projects/graid/7/usr.bin/tail/   (props changed)
  projects/graid/7/usr.bin/tar/   (props changed)
  projects/graid/7/usr.bin/tftp/   (props changed)
  projects/graid/7/usr.bin/tip/   (props changed)
  projects/graid/7/usr.bin/top/   (props changed)
  projects/graid/7/usr.bin/truncate/   (props changed)
  projects/graid/7/usr.bin/truss/   (props changed)
  projects/graid/7/usr.bin/uname/   (props changed)
  projects/graid/7/usr.bin/unifdef/   (props changed)
  projects/graid/7/usr.bin/units/   (props changed)
  projects/graid/7/usr.bin/uudecode/   (props changed)
  projects/graid/7/usr.bin/vmstat/   (props changed)
  projects/graid/7/usr.bin/w/   (props changed)
  projects/graid/7/usr.bin/wc/   (props changed)
  projects/graid/7/usr.bin/whereis/   (props changed)
  projects/graid/7/usr.bin/whois/   (props changed)
  projects/graid/7/usr.bin/window/   (props changed)
  projects/graid/7/usr.bin/xargs/   (props changed)
  projects/graid/7/usr.bin/ypcat/   (props changed)
  projects/graid/7/usr.bin/ypmatch/   (props changed)
  projects/graid/7/usr.bin/ypwhich/   (props changed)
  projects/graid/7/usr.sbin/   (props changed)
  projects/graid/7/usr.sbin/Makefile   (props changed)
  projects/graid/7/usr.sbin/acpi/   (props changed)
  projects/graid/7/usr.sbin/adduser/   (props changed)
  projects/graid/7/usr.sbin/arp/   (props changed)
  projects/graid/7/usr.sbin/bluetooth/   (props changed)
  projects/graid/7/usr.sbin/bluetooth/btpand/   (props changed)
  projects/graid/7/usr.sbin/bluetooth/hcsecd/   (props changed)
  projects/graid/7/usr.sbin/bluetooth/hcseriald/   (props changed)
  projects/graid/7/usr.sbin/bluetooth/rfcomm_pppd/   (props changed)
  projects/graid/7/usr.sbin/bluetooth/sdpd/   (props changed)
  projects/graid/7/usr.sbin/boot0cfg/   (props changed)
  projects/graid/7/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_processor_tbl.c   (props changed)
  projects/graid/7/usr.sbin/bsnmpd/modules/snmp_pf/   (props changed)
  projects/graid/7/usr.sbin/burncd/   (props changed)
  projects/graid/7/usr.sbin/cdcontrol/   (props changed)
  projects/graid/7/usr.sbin/chown/   (props changed)
  projects/graid/7/usr.sbin/chroot/   (props changed)
  projects/graid/7/usr.sbin/config/   (props changed)
  projects/graid/7/usr.sbin/config/SMM.doc/   (props changed)
  projects/graid/7/usr.sbin/cpucontrol/   (props changed)
  projects/graid/7/usr.sbin/crashinfo/   (props changed)
  projects/graid/7/usr.sbin/cron/   (props changed)
  projects/graid/7/usr.sbin/cron/cron/   (props changed)
  projects/graid/7/usr.sbin/crunch/   (props changed)
  projects/graid/7/usr.sbin/cxgbtool/   (props changed)
  projects/graid/7/usr.sbin/eeprom/   (props changed)
  projects/graid/7/usr.sbin/extattr/   (props changed)
  projects/graid/7/usr.sbin/faithd/   (props changed)
  projects/graid/7/usr.sbin/fdcontrol/   (props changed)
  projects/graid/7/usr.sbin/fdformat/   (props changed)
  projects/graid/7/usr.sbin/fdread/   (props changed)
  projects/graid/7/usr.sbin/fdwrite/   (props changed)
  projects/graid/7/usr.sbin/fifolog/   (props changed)
  projects/graid/7/usr.sbin/freebsd-update/   (props changed)
  projects/graid/7/usr.sbin/fwcontrol/   (props changed)
  projects/graid/7/usr.sbin/gstat/   (props changed)
  projects/graid/7/usr.sbin/iostat/   (props changed)
  projects/graid/7/usr.sbin/jail/   (props changed)
  projects/graid/7/usr.sbin/jexec/   (props changed)
  projects/graid/7/usr.sbin/jls/   (props changed)
  projects/graid/7/usr.sbin/lpr/   (props changed)
  projects/graid/7/usr.sbin/mailwrapper/   (props changed)
  projects/graid/7/usr.sbin/makefs/   (props changed)
  projects/graid/7/usr.sbin/makefs/ffs/ffs_bswap.c   (props changed)
  projects/graid/7/usr.sbin/makefs/ffs/ffs_subr.c   (props changed)
  projects/graid/7/usr.sbin/makefs/ffs/ufs_bswap.h   (props changed)
  projects/graid/7/usr.sbin/makefs/getid.c   (props changed)
  projects/graid/7/usr.sbin/mergemaster/   (props changed)
  projects/graid/7/usr.sbin/mfiutil/   (props changed)
  projects/graid/7/usr.sbin/mountd/   (props changed)
  projects/graid/7/usr.sbin/mptutil/   (props changed)
  projects/graid/7/usr.sbin/mtree/   (props changed)
  projects/graid/7/usr.sbin/ndiscvt/   (props changed)
  projects/graid/7/usr.sbin/ndp/   (props changed)
  projects/graid/7/usr.sbin/newsyslog/   (props changed)
  projects/graid/7/usr.sbin/nscd/   (props changed)
  projects/graid/7/usr.sbin/ntp/   (props changed)
  projects/graid/7/usr.sbin/pciconf/   (props changed)
  projects/graid/7/usr.sbin/pkg_install/   (props changed)
  projects/graid/7/usr.sbin/pmccontrol/   (props changed)
  projects/graid/7/usr.sbin/pmcstat/   (props changed)
  projects/graid/7/usr.sbin/portsnap/   (props changed)
  projects/graid/7/usr.sbin/powerd/   (props changed)
  projects/graid/7/usr.sbin/ppp/   (props changed)
  projects/graid/7/usr.sbin/pstat/   (props changed)
  projects/graid/7/usr.sbin/pw/   (props changed)
  projects/graid/7/usr.sbin/pwd_mkdb/   (props changed)
  projects/graid/7/usr.sbin/rpc.lockd/   (props changed)
  projects/graid/7/usr.sbin/rpc.statd/   (props changed)
  projects/graid/7/usr.sbin/rpc.yppasswdd/   (props changed)
  projects/graid/7/usr.sbin/rtadvd/   (props changed)
  projects/graid/7/usr.sbin/rtsold/   (props changed)
  projects/graid/7/usr.sbin/sade/   (props changed)
  projects/graid/7/usr.sbin/service/   (props changed)
  projects/graid/7/usr.sbin/setfib/   (props changed)
  projects/graid/7/usr.sbin/sysinstall/   (props changed)
  projects/graid/7/usr.sbin/syslogd/   (props changed)
  projects/graid/7/usr.sbin/traceroute/   (props changed)
  projects/graid/7/usr.sbin/traceroute6/   (props changed)
  projects/graid/7/usr.sbin/tzsetup/   (props changed)
  projects/graid/7/usr.sbin/ugidfw/   (props changed)
  projects/graid/7/usr.sbin/wpa/wpa_supplicant/   (props changed)
  projects/graid/7/usr.sbin/ypserv/   (props changed)
  projects/graid/7/usr.sbin/zic/   (props changed)

Modified: projects/graid/7/sbin/geom/class/raid/geom_raid.c
==============================================================================
--- projects/graid/7/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 09:39:32 2011	(r218315)
+++ projects/graid/7/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 11:12:11 2011	(r218316)
@@ -44,52 +44,44 @@ __FBSDID("$FreeBSD$");
 uint32_t lib_version = G_LIB_VERSION;
 uint32_t version = G_RAID_VERSION;
 
-#define	GRAID_BALANCE		"load"
-#define	GRAID_SLICE		"4096"
-#define	GRAID_PRIORITY	"0"
-
-//static void raid_main(struct gctl_req *req, unsigned flags);
+static intmax_t zero = 0;
 
 struct g_command class_commands[] = {
-	{ "label", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
-	    "format name level prov ..."
+	{ "label", G_FLAG_VERBOSE, NULL,
+	    {
+		{ 'S', "size", &zero, G_TYPE_NUMBER },
+		{ 's', "strip", &zero, G_TYPE_NUMBER },
+		G_OPT_SENTINEL
+	    },
+	    NULL, "[-S size] [-s stripsize] format label level prov ..."
+	},
+	{ "add", G_FLAG_VERBOSE, NULL,
+	    {
+		{ 'S', "size", &zero, G_TYPE_NUMBER },
+		{ 's', "strip", &zero, G_TYPE_NUMBER },
+		G_OPT_SENTINEL
+	    },
+	    NULL, "[-S size] [-s stripsize] name label level"
+	},
+	{ "delete", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name [label|num]"
+	},
+	{ "insert", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name prov ..."
+	},
+	{ "remove", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name prov ..."
+	},
+	{ "fail", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL,
+	    "[-v] name prov ..."
 	},
 	{ "stop", G_FLAG_VERBOSE, NULL,
 	    {
 		{ 'f', "force", NULL, G_TYPE_BOOL },
 		G_OPT_SENTINEL
 	    },
-	    NULL, "[-fv] name ..."
+	    NULL, "[-fv] name"
 	},
 	G_CMD_SENTINEL
 };
 
-#if 0
-static int verbose = 0;
-
-static void
-raid_main(struct gctl_req *req, unsigned flags)
-{
-	const char *name;
-
-	if ((flags & G_FLAG_VERBOSE) != 0)
-		verbose = 1;
-
-	name = gctl_get_ascii(req, "verb");
-	if (name == NULL) {
-		gctl_error(req, "No '%s' argument.", "verb");
-		return;
-	}
-	if (strcmp(name, "label") == 0)
-		raid_label(req);
-	else if (strcmp(name, "clear") == 0)
-		raid_clear(req);
-	else if (strcmp(name, "dump") == 0)
-		raid_dump(req);
-	else if (strcmp(name, "activate") == 0)
-		raid_activate(req);
-	else
-		gctl_error(req, "Unknown command: %s.", name);
-}
-#endif
-

Modified: projects/graid/7/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/7/sbin/geom/class/raid/graid.8	Sat Feb  5 09:39:32 2011	(r218315)
+++ projects/graid/7/sbin/geom/class/raid/graid.8	Sat Feb  5 11:12:11 2011	(r218316)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd December 18, 2010
+.Dd February 3, 2011
 .Dt GRAID 8
 .Os
 .Sh NAME
@@ -33,65 +33,40 @@
 .Sh SYNOPSIS
 .Nm
 .Cm label
-.Op Fl Fhnv
-.Op Fl b Ar balance
-.Op Fl s Ar slice
-.Ar name
-.Ar prov ...
-.Nm
-.Cm clear
-.Op Fl v
+.Op Fl S Ar size
+.Op Fl s Ar strip
+.Ar format
+.Ar label
+.Ar level
 .Ar prov ...
 .Nm
-.Cm configure
-.Op Fl adfFhnv
-.Op Fl b Ar balance
-.Op Fl s Ar slice
-.Ar name
-.Nm
-.Cm configure
-.Op Fl v
-.Fl p Ar priority
+.Cm add
+.Op Fl S Ar size
+.Op Fl s Ar strip
 .Ar name
-.Ar prov
+.Ar label
+.Ar level
 .Nm
-.Cm rebuild
-.Op Fl v
+.Cm delete
 .Ar name
-.Ar prov ...
+.Op Ar label | Ar num
 .Nm
 .Cm insert
-.Op Fl hiv
-.Op Fl p Ar priority
 .Ar name
 .Ar prov ...
 .Nm
 .Cm remove
-.Op Fl v
-.Ar name
-.Ar prov ...
-.Nm
-.Cm activate
-.Op Fl v
 .Ar name
 .Ar prov ...
 .Nm
-.Cm deactivate
-.Op Fl v
+.Cm fail
 .Ar name
 .Ar prov ...
 .Nm
-.Cm forget
-.Op Fl v
-.Ar name ...
-.Nm
 .Cm stop
 .Op Fl fv
 .Ar name ...
 .Nm
-.Cm dump
-.Ar prov ...
-.Nm
 .Cm list
 .Nm
 .Cm status
@@ -102,128 +77,93 @@
 .Sh DESCRIPTION
 The
 .Nm
-utility is used for software RAID configurations.
-After a RAID's creation, all components are detected and configured
-automatically.
-All operations like failure detection, stale component detection, rebuild
-of stale components, etc.\& are also done automatically.
-The
-.Nm
-utility uses on-disk metadata to store all needed information.
+utility is used to manage software RAID configurations, supported by the
+GEOM RAID class.
+GEOM RAID class uses on-disk metadata to provide access to software-RAID
+volumes defined by different RAID BIOSes.
+Depending on RAID BIOS type and it's metadata format, different subsets of
+configurations and features are supported.
+To allow booting from RAID volume, the metadata format should match the
+RAID BIOS type and its capabilities.
+To guarantee that these match, it is recommended to create volumes via the
+RAID BIOS interface, while experienced users are free to do it using this
+utility.
 .Pp
 The first argument to
 .Nm
 indicates an action to be performed:
-.Bl -tag -width ".Cm deactivate"
+.Bl -tag -width ".Cm destroy"
 .It Cm label
-Create a mirror.
-The order of components is important, because a component's priority is based on its position
-(starting from 0 to 255).
-The component with the biggest priority is used by the
-.Cm prefer
-balance algorithm
-and is also used as a master component when resynchronization is needed,
-e.g.\& after a power failure when the device was open for writing.
-.Pp
-Additional options include:
-.Bl -tag -width ".Fl b Ar balance"
-.It Fl b Ar balance
-Specifies balance algorithm to use, one of:
-.Bl -tag -width ".Cm round-robin"
-.It Cm load
-Read from the component with the lowest load.
-This is the default balance algorithm.
-.It Cm prefer
-Read from the component with the biggest priority.
-.It Cm round-robin
-Use round-robin algorithm when choosing component to read.
-.It Cm split
-Split read requests, which are bigger than or equal to slice size on N pieces,
-where N is the number of active components.
-.El
-.It Fl F
-Do not synchronize after a power failure or system crash.
-Assumes device is in consistent state.
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl n
-Turn off autosynchronization of stale components.
-.It Fl s Ar slice
-When using the
-.Cm split
-balance algorithm and an I/O READ request is bigger than or equal to this value,
-the I/O request will be split into N pieces, where N is the number of active
-components.
-Defaults to 4096 bytes.
-.El
-.It Cm clear
-Clear metadata on the given providers.
-.It Cm configure
-Configure the given device.
+Create an array with single volume.
+The
+.Ar format
+argument specifies the on-disk metadata format to use for this array,
+such as "Intel".
+The
+.Ar label
+argument specifies teh label of the created volume.
+The
+.Ar level
+argument specifies the RAID level of the created volume, such as:
+"RAID0", "RAID1", etc.
+The subsequent list enumerates providers to use as array components.
+The special name "NONE" can be used to reserve space for absent disks.
+The order of components can be important, depending on specific RAID level
+and metadata format.
 .Pp
 Additional options include:
-.Bl -tag -width ".Fl p Ar priority"
-.It Fl a
-Turn on autosynchronization of stale components.
-.It Fl b Ar balance
-Specifies balance algorithm to use.
-.It Fl d
-Do not hardcode providers' names in metadata.
-.It Fl f
-Synchronize device after a power failure or system crash.
-.It Fl F
-Do not synchronize after a power failure or system crash.
-Assumes device is in consistent state.
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl n
-Turn off autosynchronization of stale components.
-.It Fl p Ar priority
-Specifies priority for the given component
-.Ar prov .
-.It Fl s Ar slice
-Specifies slice size for
-.Cm split
-balance algorithm.
+.Bl -tag -width ".Fl s Ar strip"
+.It Fl S Ar size
+Use
+.Ar size
+bytes on each component for this volume.
+Should be used if several volumes per array are planned, or if smaller
+components going to be inserted later.
+Defaults to size of the smallest component.
+.It Fl s Ar strip
+Specifies strip size in bytes.
+Defaults to 131072.
 .El
-.It Cm rebuild
-Rebuild the given mirror components forcibly.
-If autosynchronization was not turned off for the given device, this command
-should be unnecessary.
+.It Cm add
+Create another volume on the existing array.
+The
+.Ar name
+argument is the name of the existing array, reported by label command.
+The rest of arguments are the same as for the label command.
+.It Cm delete
+Delete volume(s) from the existing array.
+When the last volume is deleted, the array is also deleted and its metadata
+erased.
+The
+.Ar name
+argument is the name of existing array.
+Optional
+.Ar label
+or
+.Ar num
+arguments allow specifying volume for deletion.
 .It Cm insert
-Add the given component(s) to the existing mirror.
-.Pp
-Additional options include:
-.Bl -tag -width ".Fl p Ar priority"
-.It Fl h
-Hardcode providers' names in metadata.
-.It Fl i
-Mark component(s) as inactive immediately after insertion.
-.It Fl p Ar priority
-Specifies priority of the given component(s).
-.El
+Insert specified provider(s) into specified array instead of the first missing
+or failed components.
+If there are no such components, mark disk(s) as spare.
 .It Cm remove
-Remove the given component(s) from the mirror and clear metadata on it.
-.It Cm activate
-Activate the given component(s), which were marked as inactive before.
-.It Cm deactivate
-Mark the given component(s) as inactive, so it will not be automatically
-connected to the mirror.
-.It Cm forget
-Forget about components which are not connected.
-This command is useful when a disk has failed and cannot be reconnected, preventing the
-.Cm remove
-command from being used to remove it.
+Remove the specified provider(s) from the specified array and erase metadata.
+If there are spare disks present, the removed disk(s) will be replaced by
+spares.
+.It Cm fail
+Mark the given disks(s) as failed, removing from active use unless absolutely
+necessary due to exhausted redundancy.
+If there are spare disks present - failed disk(s) will be replaced with one
+of them.
 .It Cm stop
-Stop the given mirror.
+Stop the given array.
+The metadata will not be erased.
 .Pp
 Additional options include:
 .Bl -tag -width ".Fl f"
 .It Fl f
-Stop the given mirror even if it is opened.
+Stop the given array even if some of its volumes are opened.
 .El
-.It Cm dump
-Dump metadata stored on the given providers.
 .It Cm list
 See
 .Xr geom 8 .
@@ -243,16 +183,26 @@ Additional options include:
 .It Fl v
 Be more verbose.
 .El
+.Sh SUPPORTED METADATA FORMATS
+The GEOM RAID class follows a modular design, allowing different metadata
+formats to be used.
+Support is currently implemented for the following formats:
+.Bl -tag -width "Intel"
+.It Intel
+The format used by Intel RAID BIOS.
+Supports up to two volumes per array.
+Supports configurations: RAID0 (2+ disks), RAID1 (2 disks),
+RAID5 (3+ disks), RAID10 (4 disks).
+.El
+.Sh SUPPORTED RAID LEVELS
+The GEOM RAID class follows a modular design, allowing different RAID levels
+to be used.
+Support for the following RAID levels is currently implemented: RAID0, RAID1.
 .Sh EXIT STATUS
-Exit status is 0 on success, and 1 if the command fails.
+Exit status is 0 on success, and non-zero if the command fails.
 .Sh SEE ALSO
 .Xr geom 4 ,
-.Xr dumpon 8 ,
 .Xr geom 8 ,
-.Xr mount 8 ,
-.Xr newfs 8 ,
-.Xr savecore 8 ,
-.Xr umount 8 ,
 .Xr vinum 8
 .Sh HISTORY
 The
@@ -261,3 +211,4 @@ utility appeared in
 .Fx 9.0 .
 .Sh AUTHORS
 .An Alexander Motin Aq mav@FreeBSD.org
+.An M. Warner Losh Aq imp@FreeBSD.org

Modified: projects/graid/7/sbin/geom/core/geom.8
==============================================================================
--- projects/graid/7/sbin/geom/core/geom.8	Sat Feb  5 09:39:32 2011	(r218315)
+++ projects/graid/7/sbin/geom/core/geom.8	Sat Feb  5 11:12:11 2011	(r218316)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 21, 2004
+.Dd January 5, 2011
 .Dt GEOM 8
 .Os
 .Sh NAME
@@ -37,11 +37,12 @@
 .Nm
 .Ar class
 .Cm list
+.Op Fl a
 .Op Ar name ...
 .Nm
 .Ar class
 .Cm status
-.Op Fl s
+.Op Fl ags
 .Op Ar name ...
 .Nm
 .Ar class
@@ -69,6 +70,11 @@ List all available commands for the give
 Print detailed information (within the given class) about all geoms
 (if no additional arguments were specified) or the given geoms.
 This command is only available if the given class exists in the kernel.
+Additional options include:
+.Bl -tag -width ".Fl a"
+.It Fl a
+Print information for geoms without providers.
+.El
 .It Cm status
 Print general information (within the given class) about all geoms
 (if no additional arguments were specified) or the given geoms.
@@ -76,6 +82,10 @@ This command is only available if the gi
 .Pp
 Additional options include:
 .Bl -tag -width ".Fl s"
+.It Fl a
+When used with -g, print status for geoms without providers.
+.It Fl g
+Report statuses for geoms instead of providers.
 .It Fl s
 Produce script-friendly output.
 .El
@@ -118,6 +128,8 @@ MIRROR
 .It
 NOP
 .It
+RAID
+.It
 RAID3
 .It
 SHSEC

Modified: projects/graid/7/sbin/geom/core/geom.c
==============================================================================
--- projects/graid/7/sbin/geom/core/geom.c	Sat Feb  5 09:39:32 2011	(r218315)
+++ projects/graid/7/sbin/geom/core/geom.c	Sat Feb  5 11:12:11 2011	(r218316)
@@ -70,15 +70,21 @@ static void std_unload(struct gctl_req *
 
 struct g_command std_commands[] = {
 	{ "help", 0, std_help, G_NULL_OPTS, NULL, NULL },
-	{ "list", 0, std_list, G_NULL_OPTS, NULL, 
-	    "[name ...]"
+	{ "list", 0, std_list,
+	    {
+		{ 'a', "all", NULL, G_TYPE_BOOL },
+		G_OPT_SENTINEL
+	    },
+	    NULL, "[-a] [name ...]"
 	},
 	{ "status", 0, std_status,
 	    {
+		{ 'a', "all", NULL, G_TYPE_BOOL },
+		{ 'g', "geoms", NULL, G_TYPE_BOOL },
 		{ 's', "script", NULL, G_TYPE_BOOL },
 		G_OPT_SENTINEL
 	    },
-	    NULL, "[-s] [name ...]"
+	    NULL, "[-ags] [name ...]"
 	},
 	{ "load", G_FLAG_VERBOSE | G_FLAG_LOADKLD, std_load, G_NULL_OPTS,
 	    NULL, NULL },
@@ -737,7 +743,7 @@ std_list(struct gctl_req *req, unsigned 
 	struct gclass *classp;
 	struct ggeom *gp;
 	const char *name;
-	int error, i, nargs;
+	int all, error, i, nargs;
 
 	error = geom_gettree(&mesh);
 	if (error != 0)
@@ -748,18 +754,18 @@ std_list(struct gctl_req *req, unsigned 
 		errx(EXIT_FAILURE, "Class %s not found.", gclass_name);
 	}
 	nargs = gctl_get_int(req, "nargs");
+	all = gctl_get_int(req, "all");
 	if (nargs > 0) {
 		for (i = 0; i < nargs; i++) {
 			name = gctl_get_ascii(req, "arg%d", i);
 			gp = find_geom(classp, name);
-			if (gp != NULL)
-				list_one_geom(gp);
-			else
+			if (gp == NULL)
 				errx(EXIT_FAILURE, "No such geom: %s.", name);
+			list_one_geom(gp);
 		}
 	} else {
 		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-			if (LIST_EMPTY(&gp->lg_provider))
+			if (LIST_EMPTY(&gp->lg_provider) && !all)
 				continue;
 			list_one_geom(gp);
 		}
@@ -778,7 +784,6 @@ std_status_available(void)
 static void
 status_update_len(struct ggeom *gp, int *name_len, int *status_len)
 {
-	struct gprovider *pp;
 	struct gconfig *conf;
 	int len;
 
@@ -786,11 +791,7 @@ status_update_len(struct ggeom *gp, int 
 	assert(name_len != NULL);
 	assert(status_len != NULL);
 
-	pp = LIST_FIRST(&gp->lg_provider);
-	if (pp != NULL)
-		len = strlen(pp->lg_name);
-	else
-		len = strlen(gp->lg_name);
+	len = strlen(gp->lg_name);
 	if (*name_len < len)
 		*name_len = len;
 	LIST_FOREACH(conf, &gp->lg_config, lg_config) {
@@ -802,25 +803,67 @@ status_update_len(struct ggeom *gp, int 
 	}
 }
 
+static void
+status_update_len_prs(struct ggeom *gp, int *name_len, int *status_len)
+{
+	struct gprovider *pp;
+	struct gconfig *conf;
+	int len, glen;
+
+	assert(gp != NULL);
+	assert(name_len != NULL);
+	assert(status_len != NULL);
+
+	glen = 0;
+	LIST_FOREACH(conf, &gp->lg_config, lg_config) {
+		if (strcasecmp(conf->lg_name, "state") == 0) {
+			glen = strlen(conf->lg_val);
+			break;
+		}
+	}
+	LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
+		len = strlen(pp->lg_name);
+		if (*name_len < len)
+			*name_len = len;
+		len = glen;
+		LIST_FOREACH(conf, &pp->lg_config, lg_config) {
+			if (strcasecmp(conf->lg_name, "state") == 0) {
+				len = strlen(conf->lg_val);
+				break;
+			}
+		}
+		if (*status_len < len)
+			*status_len = len;
+	}
+}
+
 static char *
 status_one_consumer(struct gconsumer *cp)
 {
 	static char buf[256];
 	struct gprovider *pp;
 	struct gconfig *conf;
+	const char *state, *syncr;
 
 	pp = cp->lg_provider;
 	if (pp == NULL)
 		return (NULL);
+	state = NULL;
+	syncr = NULL;
 	LIST_FOREACH(conf, &cp->lg_config, lg_config) {
+		if (strcasecmp(conf->lg_name, "state") == 0)
+			state = conf->lg_val;
 		if (strcasecmp(conf->lg_name, "synchronized") == 0)
-			break;
+			syncr = conf->lg_val;
 	}
-	if (conf == NULL)
+	if (state == NULL && syncr == NULL)
 		snprintf(buf, sizeof(buf), "%s", pp->lg_name);
-	else {
+	else if (state != NULL && syncr != NULL) {
+		snprintf(buf, sizeof(buf), "%s (%s, %s)", pp->lg_name,
+		    state, syncr);
+	} else {
 		snprintf(buf, sizeof(buf), "%s (%s)", pp->lg_name,
-		    conf->lg_val);
+		    state ? state : syncr);
 	}
 	return (buf);
 }
@@ -828,25 +871,19 @@ status_one_consumer(struct gconsumer *cp
 static void
 status_one_geom(struct ggeom *gp, int script, int name_len, int status_len)
 {
-	struct gprovider *pp;
 	struct gconsumer *cp;
 	struct gconfig *conf;
 	const char *name, *status, *component;
 	int gotone;
 
-	pp = LIST_FIRST(&gp->lg_provider);
-	if (pp != NULL)
-		name = pp->lg_name;
-	else
-		name = gp->lg_name;
+	name = gp->lg_name;
+	status = "N/A";
 	LIST_FOREACH(conf, &gp->lg_config, lg_config) {
-		if (strcasecmp(conf->lg_name, "state") == 0)
+		if (strcasecmp(conf->lg_name, "state") == 0) {
+			status = conf->lg_val;
 			break;
+		}
 	}
-	if (conf == NULL)
-		status = "N/A";
-	else
-		status = conf->lg_val;
 	gotone = 0;
 	LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) {
 		component = status_one_consumer(cp);
@@ -865,6 +902,48 @@ status_one_geom(struct ggeom *gp, int sc
 }
 
 static void
+status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len)
+{
+	struct gprovider *pp;
+	struct gconsumer *cp;
+	struct gconfig *conf;
+	const char *name, *status, *component;
+	int gotone;
+
+	LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
+		name = pp->lg_name;
+		status = "N/A";
+		LIST_FOREACH(conf, &gp->lg_config, lg_config) {
+			if (strcasecmp(conf->lg_name, "state") == 0) {
+				status = conf->lg_val;
+				break;
+			}
+		}
+		LIST_FOREACH(conf, &pp->lg_config, lg_config) {
+			if (strcasecmp(conf->lg_name, "state") == 0) {
+				status = conf->lg_val;
+				break;
+			}
+		}
+		gotone = 0;
+		LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) {
+			component = status_one_consumer(cp);
+			if (component == NULL)
+				continue;
+			gotone = 1;
+			printf("%*s  %*s  %s\n", name_len, name,
+			    status_len, status, component);
+			if (!script)
+				name = status = "";
+		}
+		if (!gotone) {
+			printf("%*s  %*s  %s\n", name_len, name,
+			    status_len, status, "N/A");
+		}
+	}
+}
+
+static void
 std_status(struct gctl_req *req, unsigned flags __unused)
 {
 	struct gmesh mesh;
@@ -872,7 +951,7 @@ std_status(struct gctl_req *req, unsigne
 	struct ggeom *gp;
 	const char *name;
 	int name_len, status_len;
-	int error, i, n, nargs, script;
+	int all, error, geoms, i, n, nargs, script;
 
 	error = geom_gettree(&mesh);
 	if (error != 0)
@@ -881,28 +960,45 @@ std_status(struct gctl_req *req, unsigne
 	if (classp == NULL)
 		errx(EXIT_FAILURE, "Class %s not found.", gclass_name);
 	nargs = gctl_get_int(req, "nargs");
+	all = gctl_get_int(req, "all");
+	geoms = gctl_get_int(req, "geoms");
 	script = gctl_get_int(req, "script");
-	name_len = strlen("Name");
-	status_len = strlen("Status");
+	if (script) {
+		name_len = 0;
+		status_len = 0;
+	} else {
+		name_len = strlen("Name");
+		status_len = strlen("Status");
+	}
 	if (nargs > 0) {
 		for (i = 0, n = 0; i < nargs; i++) {
 			name = gctl_get_ascii(req, "arg%d", i);
 			gp = find_geom(classp, name);
 			if (gp == NULL)
 				errx(EXIT_FAILURE, "No such geom: %s.", name);
-			else {
-				status_update_len(gp, &name_len, &status_len);
-				n++;
+			if (geoms) {
+				status_update_len(gp,
+				    &name_len, &status_len);
+			} else {
+				status_update_len_prs(gp,
+				    &name_len, &status_len);
 			}
+			n++;
 		}
 		if (n == 0)
 			goto end;
 	} else {
 		n = 0;
 		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-			if (LIST_EMPTY(&gp->lg_provider))
+			if (LIST_EMPTY(&gp->lg_provider) && !all)
 				continue;
-			status_update_len(gp, &name_len, &status_len);
+			if (geoms) {
+				status_update_len(gp,
+				    &name_len, &status_len);
+			} else {
+				status_update_len_prs(gp,
+				    &name_len, &status_len);
+			}
 			n++;
 		}
 		if (n == 0)
@@ -916,16 +1012,27 @@ std_status(struct gctl_req *req, unsigne
 		for (i = 0; i < nargs; i++) {
 			name = gctl_get_ascii(req, "arg%d", i);
 			gp = find_geom(classp, name);
-			if (gp != NULL) {
+			if (gp == NULL)
+				continue;
+			if (geoms) {
 				status_one_geom(gp, script, name_len,
 				    status_len);
+			} else {
+				status_one_geom_prs(gp, script, name_len,
+				    status_len);
 			}
 		}
 	} else {
 		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
-			if (LIST_EMPTY(&gp->lg_provider))
+			if (LIST_EMPTY(&gp->lg_provider) && !all)
 				continue;
-			status_one_geom(gp, script, name_len, status_len);
+			if (geoms) {
+				status_one_geom(gp, script, name_len,
+				    status_len);
+			} else {
+				status_one_geom_prs(gp, script, name_len,
+				    status_len);
+			}
 		}
 	}
 end:

Copied: projects/graid/7/sys/amd64/conf/CISCO (from r216979, projects/graid/head/sys/amd64/conf/CISCO)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/graid/7/sys/amd64/conf/CISCO	Sat Feb  5 11:12:11 2011	(r218316, copy of r216979, projects/graid/head/sys/amd64/conf/CISCO)
@@ -0,0 +1,7 @@
+# Generic, tweaked for Cisco.
+include 	"GENERIC"
+ident		CISCO_CAM
+options 	ATA_CAM
+options 	ADA_TEST_FAILURE
+makeoptions	MODULES_OVERRIDE="geom"
+

Modified: projects/graid/7/sys/cam/ata/ata_da.c
==============================================================================
--- projects/graid/7/sys/cam/ata/ata_da.c	Sat Feb  5 09:39:32 2011	(r218315)
+++ projects/graid/7/sys/cam/ata/ata_da.c	Sat Feb  5 11:12:11 2011	(r218316)
@@ -27,6 +27,8 @@
 #include 
 __FBSDID("$FreeBSD$");
 
+#include "opt_ada.h"
+
 #include 
 
 #ifdef _KERNEL
@@ -125,11 +127,19 @@ struct ada_softc {
 	int	 outstanding_cmds;
 	int	 trim_max_ranges;
 	int	 trim_running;
+#ifdef ADA_TEST_FAILURE
+	int      force_read_error;
+	int      force_write_error;
+	int      periodic_read_error;
+        int      periodic_read_count;
+#endif
 	struct	 disk_params params;
 	struct	 disk *disk;
 	struct task		sysctl_task;
+#ifdef ADA_TEST_FAILURE
 	struct sysctl_ctx_list	sysctl_ctx;
 	struct sysctl_oid	*sysctl_tree;
+#endif
 	struct callout		sendordered_c;
 	struct trim_request	trim_req;
 };
@@ -156,7 +166,12 @@ static	dumper_t	adadump;
 static	periph_init_t	adainit;
 static	void		adaasync(void *callback_arg, u_int32_t code,
 				struct cam_path *path, void *arg);
+#ifdef ADA_TEST_FAILURE
 static	void		adasysctlinit(void *context, int pending);
+static	int		adaforcereaderrsysctl(SYSCTL_HANDLER_ARGS);
+static	int		adaforcewriteerrsysctl(SYSCTL_HANDLER_ARGS);
+static	int		adaperiodicreaderrsysctl(SYSCTL_HANDLER_ARGS);
+#endif
 static	periph_ctor_t	adaregister;
 static	periph_dtor_t	adacleanup;
 static	periph_start_t	adastart;
@@ -549,6 +564,7 @@ adacleanup(struct cam_periph *periph)
 	xpt_print(periph->path, "removing device entry\n");
 	cam_periph_unlock(periph);
 
+#ifdef ADA_TEST_FAILURE
 	/*
 	 * If we can't free the sysctl tree, oh well...
 	 */
@@ -556,6 +572,7 @@ adacleanup(struct cam_periph *periph)
 	    && sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
 		xpt_print(periph->path, "can't remove sysctl context\n");
 	}
+#endif
 
 	disk_destroy(softc->disk);
 	callout_drain(&softc->sendordered_c);
@@ -606,6 +623,7 @@ adaasync(void *callback_arg, u_int32_t c
 	}
 }
 
+#ifdef ADA_TEST_FAILURE
 static void
 adasysctlinit(void *context, int pending)
 {
@@ -632,9 +650,66 @@ adasysctlinit(void *context, int pending
 		return;
 	}
 
+	/*
+	 * Add a 'door bell' sysctl which allows one to set it from userland
+	 * and cause something bad to happen.  For the moment, we only allow
+	 * whacking the next read or write.
+	 */
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "force_read_error", CTLTYPE_INT | CTLFLAG_RW,
+		&softc->force_read_error, 0, adaforcereaderrsysctl, "I",
+		"Force a read error for the next N reads.");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "force_write_error", CTLTYPE_INT | CTLFLAG_RW,
+		&softc->force_write_error, 0, adaforcewriteerrsysctl, "I",
+		"Force a write error for the next N writes.");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+		OID_AUTO, "periodic_read_error", CTLTYPE_INT | CTLFLAG_RW,
+		&softc->periodic_read_error, 0, adaperiodicreaderrsysctl, "I",
+		"Force a read error every N reads (don't set too low).");
 	cam_periph_release(periph);
 }
 
+static int
+adaforcereaderrsysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, value;
+
+	value = *(int *)arg1;
+	error = sysctl_handle_int(oidp, &value, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	*(int *)arg1 = value;
+	return (0);
+}
+
+static int
+adaforcewriteerrsysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, value;
+
+	value = *(int *)arg1;
+	error = sysctl_handle_int(oidp, &value, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	*(int *)arg1 = value;
+	return (0);
+}
+
+static int
+adaperiodicreaderrsysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, value;
+
+	value = *(int *)arg1;
+	error = sysctl_handle_int(oidp, &value, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	*(int *)arg1 = value;
+	return (0);
+}
+#endif
+
 static cam_status
 adaregister(struct cam_periph *periph, void *arg)
 {
@@ -712,7 +787,9 @@ adaregister(struct cam_periph *periph, v
 	cpi.ccb_h.func_code = XPT_PATH_INQ;
 	xpt_action((union ccb *)&cpi);
 
+#ifdef ADA_TEST_FAILURE
 	TASK_INIT(&softc->sysctl_task, 0, adasysctlinit, periph);
+#endif
 
 	/*
 	 * Register this media as a disk
@@ -778,6 +855,14 @@ adaregister(struct cam_periph *periph, v
 		dp->secsize, dp->heads,
 		dp->secs_per_track, dp->cylinders);
 	xpt_announce_periph(periph, announce_buf);
+#ifdef ADA_TEST_FAILURE
+	/*
+	 * Create our sysctl variables, now that we know
+	 * we have successfully attached.
+	 * XXX: da code does a cam_periph_acquire(periph) here -- why?.
+	 */
+	taskqueue_enqueue(taskqueue_thread, &softc->sysctl_task);
+#endif
 	/*
 	 * Add async callbacks for bus reset and
 	 * bus device reset calls.  I don't bother
@@ -900,7 +985,45 @@ adastart(struct cam_periph *periph, unio
 		{
 			uint64_t lba = bp->bio_pblkno;
 			uint16_t count = bp->bio_bcount / softc->params.secsize;
+#ifdef ADA_TEST_FAILURE
+			int fail = 0;
 
+			/*
+			 * Support the failure ioctls.  If the command is a
+			 * read, and there are pending forced read errors, or
+			 * if a write and pending write errors, then fail this
+			 * operation with EIO.  This is useful for testing
+			 * purposes.  Also, support having every Nth read fail.
+			 *
+			 * This is a rather blunt tool.
+			 */
+			if (bp->bio_cmd == BIO_READ) {
+				if (softc->force_read_error) {
+					softc->force_read_error--;
+					fail = 1;
+				}
+				if (softc->periodic_read_error > 0) {
+					if (++softc->periodic_read_count >=
+					    softc->periodic_read_error) {
+						softc->periodic_read_count = 0;
+						fail = 1;
+					}
+				}
+			} else {
+				if (softc->force_write_error) {
+					softc->force_write_error--;
+					fail = 1;
+				}
+			}
+			if (fail) {
+				bp->bio_error = EIO;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 11:37:42 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 0B154106564A;
	Sat,  5 Feb 2011 11:37:42 +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 ECBA68FC12;
	Sat,  5 Feb 2011 11:37:41 +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 p15BbfsD026390;
	Sat, 5 Feb 2011 11:37:41 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p15BbfUA026387;
	Sat, 5 Feb 2011 11:37:41 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102051137.p15BbfUA026387@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 11:37:41 +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: r218318 - in projects/graid/8: . contrib/bsnmp/snmpd
	contrib/top contrib/xz gnu/usr.bin lib/libusb
	release/picobsd/floppy.tree/sbin sbin/geom/class/raid
	sbin/geom/class/sched sys/geom/r...
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: Sat, 05 Feb 2011 11:37:42 -0000

Author: mav
Date: Sat Feb  5 11:37:41 2011
New Revision: 218318
URL: http://svn.freebsd.org/changeset/base/218318

Log:
  MFH r218314, r218315.

Modified:
  projects/graid/8/sbin/geom/class/raid/geom_raid.c
  projects/graid/8/sys/geom/raid/md_intel.c
Directory Properties:
  projects/graid/8/   (props changed)
  projects/graid/8/COPYRIGHT   (props changed)
  projects/graid/8/Makefile   (props changed)
  projects/graid/8/Makefile.inc1   (props changed)
  projects/graid/8/ObsoleteFiles.inc   (props changed)
  projects/graid/8/UPDATING   (props changed)
  projects/graid/8/bin/   (props changed)
  projects/graid/8/bin/chio/   (props changed)
  projects/graid/8/bin/chmod/   (props changed)
  projects/graid/8/bin/cp/   (props changed)
  projects/graid/8/bin/csh/   (props changed)
  projects/graid/8/bin/date/   (props changed)
  projects/graid/8/bin/echo/   (props changed)
  projects/graid/8/bin/expr/   (props changed)
  projects/graid/8/bin/getfacl/   (props changed)
  projects/graid/8/bin/kill/   (props changed)
  projects/graid/8/bin/ln/   (props changed)
  projects/graid/8/bin/ls/   (props changed)
  projects/graid/8/bin/mv/   (props changed)
  projects/graid/8/bin/pax/   (props changed)
  projects/graid/8/bin/pkill/   (props changed)
  projects/graid/8/bin/ps/   (props changed)
  projects/graid/8/bin/pwait/   (props changed)
  projects/graid/8/bin/setfacl/   (props changed)
  projects/graid/8/bin/sh/   (props changed)
  projects/graid/8/bin/sleep/   (props changed)
  projects/graid/8/bin/test/   (props changed)
  projects/graid/8/cddl/compat/opensolaris/   (props changed)
  projects/graid/8/cddl/contrib/opensolaris/   (props changed)
  projects/graid/8/cddl/lib/   (props changed)
  projects/graid/8/cddl/lib/libnvpair/   (props changed)
  projects/graid/8/cddl/lib/libzpool/   (props changed)
  projects/graid/8/cddl/usr.bin/   (props changed)
  projects/graid/8/cddl/usr.sbin/   (props changed)
  projects/graid/8/contrib/   (props changed)
  projects/graid/8/contrib/bind9/   (props changed)
  projects/graid/8/contrib/binutils/   (props changed)
  projects/graid/8/contrib/bsnmp/   (props changed)
  projects/graid/8/contrib/bsnmp/snmpd/bsnmpd.1   (props changed)
  projects/graid/8/contrib/bzip2/   (props changed)
  projects/graid/8/contrib/com_err/   (props changed)
  projects/graid/8/contrib/csup/   (props changed)
  projects/graid/8/contrib/ee/   (props changed)
  projects/graid/8/contrib/expat/   (props changed)
  projects/graid/8/contrib/file/   (props changed)
  projects/graid/8/contrib/gcc/   (props changed)
  projects/graid/8/contrib/gdb/   (props changed)
  projects/graid/8/contrib/gdtoa/   (props changed)
  projects/graid/8/contrib/groff/   (props changed)
  projects/graid/8/contrib/ipfilter/   (props changed)
  projects/graid/8/contrib/less/   (props changed)
  projects/graid/8/contrib/libpcap/   (props changed)
  projects/graid/8/contrib/ncurses/   (props changed)
  projects/graid/8/contrib/netcat/   (props changed)
  projects/graid/8/contrib/ntp/   (props changed)
  projects/graid/8/contrib/nvi/   (props changed)
  projects/graid/8/contrib/one-true-awk/   (props changed)
  projects/graid/8/contrib/openbsm/   (props changed)
  projects/graid/8/contrib/openpam/   (props changed)
  projects/graid/8/contrib/pf/   (props changed)
  projects/graid/8/contrib/sendmail/   (props changed)
  projects/graid/8/contrib/tcp_wrappers/   (props changed)
  projects/graid/8/contrib/tcpdump/   (props changed)
  projects/graid/8/contrib/tcsh/   (props changed)
  projects/graid/8/contrib/telnet/   (props changed)
  projects/graid/8/contrib/top/   (props changed)
  projects/graid/8/contrib/top/install-sh   (props changed)
  projects/graid/8/contrib/traceroute/   (props changed)
  projects/graid/8/contrib/wpa/   (props changed)
  projects/graid/8/contrib/xz/   (props changed)
  projects/graid/8/contrib/xz/AUTHORS   (props changed)
  projects/graid/8/contrib/xz/COPYING   (props changed)
  projects/graid/8/contrib/xz/ChangeLog   (props changed)
  projects/graid/8/contrib/xz/FREEBSD-Xlist   (props changed)
  projects/graid/8/contrib/xz/FREEBSD-upgrade   (props changed)
  projects/graid/8/contrib/xz/README   (props changed)
  projects/graid/8/contrib/xz/THANKS   (props changed)
  projects/graid/8/contrib/xz/TODO   (props changed)
  projects/graid/8/contrib/xz/po/   (props changed)
  projects/graid/8/contrib/xz/src/   (props changed)
  projects/graid/8/crypto/heimdal/   (props changed)
  projects/graid/8/crypto/openssh/   (props changed)
  projects/graid/8/crypto/openssl/   (props changed)
  projects/graid/8/etc/   (props changed)
  projects/graid/8/games/factor/   (props changed)
  projects/graid/8/games/fortune/   (props changed)
  projects/graid/8/games/grdc/   (props changed)
  projects/graid/8/games/pom/   (props changed)
  projects/graid/8/gnu/lib/csu/   (props changed)
  projects/graid/8/gnu/lib/libgcc/   (props changed)
  projects/graid/8/gnu/lib/libstdc++/   (props changed)
  projects/graid/8/gnu/usr.bin/   (props changed)
  projects/graid/8/gnu/usr.bin/Makefile   (props changed)
  projects/graid/8/gnu/usr.bin/dialog/   (props changed)
  projects/graid/8/gnu/usr.bin/gdb/   (props changed)
  projects/graid/8/gnu/usr.bin/gdb/kgdb/   (props changed)
  projects/graid/8/gnu/usr.bin/groff/   (props changed)
  projects/graid/8/gnu/usr.bin/patch/   (props changed)
  projects/graid/8/include/   (props changed)
  projects/graid/8/kerberos5/lib/libgssapi_krb5/   (props changed)
  projects/graid/8/kerberos5/lib/libgssapi_spnego/   (props changed)
  projects/graid/8/kerberos5/usr.bin/kdestroy/   (props changed)
  projects/graid/8/kerberos5/usr.bin/kpasswd/   (props changed)
  projects/graid/8/lib/   (props changed)
  projects/graid/8/lib/bind/   (props changed)
  projects/graid/8/lib/csu/   (props changed)
  projects/graid/8/lib/libarchive/   (props changed)
  projects/graid/8/lib/libbluetooth/   (props changed)
  projects/graid/8/lib/libc/   (props changed)
  projects/graid/8/lib/libc/stdtime/   (props changed)
  projects/graid/8/lib/libc_r/   (props changed)
  projects/graid/8/lib/libcam/   (props changed)
  projects/graid/8/lib/libcompat/   (props changed)
  projects/graid/8/lib/libdevinfo/   (props changed)
  projects/graid/8/lib/libdisk/   (props changed)
  projects/graid/8/lib/libedit/   (props changed)
  projects/graid/8/lib/libelf/   (props changed)
  projects/graid/8/lib/libexpat/   (props changed)
  projects/graid/8/lib/libfetch/   (props changed)
  projects/graid/8/lib/libgeom/   (props changed)
  projects/graid/8/lib/libgpib/   (props changed)
  projects/graid/8/lib/libgssapi/   (props changed)
  projects/graid/8/lib/libjail/   (props changed)
  projects/graid/8/lib/libkse/   (props changed)
  projects/graid/8/lib/libkvm/   (props changed)
  projects/graid/8/lib/liblzma/   (props changed)
  projects/graid/8/lib/libmagic/   (props changed)
  projects/graid/8/lib/libmemstat/   (props changed)
  projects/graid/8/lib/libpam/   (props changed)
  projects/graid/8/lib/libpmc/   (props changed)
  projects/graid/8/lib/libproc/   (props changed)
  projects/graid/8/lib/libradius/   (props changed)
  projects/graid/8/lib/librpcsec_gss/   (props changed)
  projects/graid/8/lib/librtld_db/   (props changed)
  projects/graid/8/lib/libsm/   (props changed)
  projects/graid/8/lib/libstand/   (props changed)
  projects/graid/8/lib/libtacplus/   (props changed)
  projects/graid/8/lib/libthr/   (props changed)
  projects/graid/8/lib/libthread_db/   (props changed)
  projects/graid/8/lib/libufs/   (props changed)
  projects/graid/8/lib/libugidfw/   (props changed)
  projects/graid/8/lib/libusb/   (props changed)
  projects/graid/8/lib/libusb/usb.h   (props changed)
  projects/graid/8/lib/libusbhid/   (props changed)
  projects/graid/8/lib/libutil/   (props changed)
  projects/graid/8/lib/libz/   (props changed)
  projects/graid/8/lib/libz/contrib/   (props changed)
  projects/graid/8/lib/msun/   (props changed)
  projects/graid/8/libexec/   (props changed)
  projects/graid/8/libexec/ftpd/   (props changed)
  projects/graid/8/libexec/rtld-elf/   (props changed)
  projects/graid/8/libexec/tftpd/   (props changed)
  projects/graid/8/release/   (props changed)
  projects/graid/8/release/doc/en_US.ISO8859-1/hardware/   (props changed)
  projects/graid/8/release/picobsd/   (props changed)
  projects/graid/8/release/picobsd/floppy.tree/sbin/   (props changed)
  projects/graid/8/release/picobsd/floppy.tree/sbin/dhclient-script   (props changed)
  projects/graid/8/release/picobsd/qemu/   (props changed)
  projects/graid/8/release/picobsd/tinyware/login/   (props changed)
  projects/graid/8/release/powerpc/   (props changed)
  projects/graid/8/sbin/   (props changed)
  projects/graid/8/sbin/atacontrol/   (props changed)
  projects/graid/8/sbin/bsdlabel/   (props changed)
  projects/graid/8/sbin/camcontrol/   (props changed)
  projects/graid/8/sbin/ddb/   (props changed)
  projects/graid/8/sbin/devd/   (props changed)
  projects/graid/8/sbin/devfs/   (props changed)
  projects/graid/8/sbin/dhclient/   (props changed)
  projects/graid/8/sbin/dump/   (props changed)
  projects/graid/8/sbin/dumpfs/   (props changed)
  projects/graid/8/sbin/fdisk/   (props changed)
  projects/graid/8/sbin/fsck/   (props changed)
  projects/graid/8/sbin/fsck_ffs/   (props changed)
  projects/graid/8/sbin/fsck_msdosfs/   (props changed)
  projects/graid/8/sbin/fsirand/   (props changed)
  projects/graid/8/sbin/geom/   (props changed)
  projects/graid/8/sbin/geom/class/multipath/   (props changed)
  projects/graid/8/sbin/geom/class/part/   (props changed)
  projects/graid/8/sbin/geom/class/sched/gsched.8   (props changed)
  projects/graid/8/sbin/geom/class/stripe/   (props changed)
  projects/graid/8/sbin/ggate/   (props changed)
  projects/graid/8/sbin/growfs/   (props changed)
  projects/graid/8/sbin/hastctl/   (props changed)
  projects/graid/8/sbin/hastd/   (props changed)
  projects/graid/8/sbin/ifconfig/   (props changed)
  projects/graid/8/sbin/ipfw/   (props changed)
  projects/graid/8/sbin/iscontrol/   (props changed)
  projects/graid/8/sbin/kldload/   (props changed)
  projects/graid/8/sbin/kldstat/   (props changed)
  projects/graid/8/sbin/mdconfig/   (props changed)
  projects/graid/8/sbin/mksnap_ffs/   (props changed)
  projects/graid/8/sbin/mount/   (props changed)
  projects/graid/8/sbin/mount_cd9660/   (props changed)
  projects/graid/8/sbin/mount_msdosfs/   (props changed)
  projects/graid/8/sbin/mount_nfs/   (props changed)
  projects/graid/8/sbin/natd/   (props changed)
  projects/graid/8/sbin/newfs/   (props changed)
  projects/graid/8/sbin/newfs_msdos/   (props changed)
  projects/graid/8/sbin/ping6/   (props changed)
  projects/graid/8/sbin/reboot/   (props changed)
  projects/graid/8/sbin/restore/   (props changed)
  projects/graid/8/sbin/route/   (props changed)
  projects/graid/8/sbin/routed/   (props changed)
  projects/graid/8/sbin/setkey/   (props changed)
  projects/graid/8/sbin/spppcontrol/   (props changed)
  projects/graid/8/sbin/sysctl/   (props changed)
  projects/graid/8/sbin/tunefs/   (props changed)
  projects/graid/8/sbin/umount/   (props changed)
  projects/graid/8/secure/   (props changed)
  projects/graid/8/secure/lib/libcrypto/   (props changed)
  projects/graid/8/secure/lib/libssl/   (props changed)
  projects/graid/8/secure/usr.bin/bdes/   (props changed)
  projects/graid/8/secure/usr.bin/openssl/   (props changed)
  projects/graid/8/share/dict/   (props changed)
  projects/graid/8/share/doc/papers/jail/   (props changed)
  projects/graid/8/share/doc/smm/01.setup/   (props changed)
  projects/graid/8/share/examples/   (props changed)
  projects/graid/8/share/examples/etc/   (props changed)
  projects/graid/8/share/examples/kld/syscall/   (props changed)
  projects/graid/8/share/man/   (props changed)
  projects/graid/8/share/man/man1/   (props changed)
  projects/graid/8/share/man/man3/   (props changed)
  projects/graid/8/share/man/man4/   (props changed)
  projects/graid/8/share/man/man5/   (props changed)
  projects/graid/8/share/man/man7/   (props changed)
  projects/graid/8/share/man/man8/   (props changed)
  projects/graid/8/share/man/man9/   (props changed)
  projects/graid/8/share/misc/   (props changed)
  projects/graid/8/share/mk/   (props changed)
  projects/graid/8/share/syscons/   (props changed)
  projects/graid/8/share/termcap/   (props changed)
  projects/graid/8/share/timedef/   (props changed)
  projects/graid/8/share/zoneinfo/   (props changed)
  projects/graid/8/sys/   (props changed)
  projects/graid/8/sys/amd64/include/xen/   (props changed)
  projects/graid/8/sys/cddl/contrib/opensolaris/   (props changed)
  projects/graid/8/sys/contrib/dev/acpica/   (props changed)
  projects/graid/8/sys/contrib/pf/   (props changed)
  projects/graid/8/tools/   (props changed)
  projects/graid/8/tools/build/mk/   (props changed)
  projects/graid/8/tools/build/options/   (props changed)
  projects/graid/8/tools/debugscripts/   (props changed)
  projects/graid/8/tools/kerneldoc/subsys/   (props changed)
  projects/graid/8/tools/regression/acct/   (props changed)
  projects/graid/8/tools/regression/acltools/   (props changed)
  projects/graid/8/tools/regression/aio/aiotest/   (props changed)
  projects/graid/8/tools/regression/bin/   (props changed)
  projects/graid/8/tools/regression/bin/date/   (props changed)
  projects/graid/8/tools/regression/bin/sh/   (props changed)
  projects/graid/8/tools/regression/fifo/   (props changed)
  projects/graid/8/tools/regression/geom/   (props changed)
  projects/graid/8/tools/regression/lib/libc/   (props changed)
  projects/graid/8/tools/regression/lib/msun/test-conj.t   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest1/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest2/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest3/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest4/   (props changed)
  projects/graid/8/tools/regression/mqueue/mqtest5/   (props changed)
  projects/graid/8/tools/regression/netinet/   (props changed)
  projects/graid/8/tools/regression/poll/   (props changed)
  projects/graid/8/tools/regression/posixsem/   (props changed)
  projects/graid/8/tools/regression/priv/   (props changed)
  projects/graid/8/tools/regression/sockets/unix_gc/   (props changed)
  projects/graid/8/tools/regression/usr.bin/   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/pgrep-_g.t   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/pgrep-_s.t   (props changed)
  projects/graid/8/tools/regression/usr.bin/pkill/pkill-_g.t   (props changed)
  projects/graid/8/tools/regression/usr.bin/sed/   (props changed)
  projects/graid/8/tools/regression/usr.bin/tr/   (props changed)
  projects/graid/8/tools/test/   (props changed)
  projects/graid/8/tools/tools/   (props changed)
  projects/graid/8/tools/tools/ath/   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs.h   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5210.c   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5211.c   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5212.c   (props changed)
  projects/graid/8/tools/tools/ath/common/dumpregs_5416.c   (props changed)
  projects/graid/8/tools/tools/mctest/   (props changed)
  projects/graid/8/tools/tools/nanobsd/   (props changed)
  projects/graid/8/tools/tools/netrate/   (props changed)
  projects/graid/8/tools/tools/netrate/tcpp/   (props changed)
  projects/graid/8/tools/tools/termcap/termcap.pl   (props changed)
  projects/graid/8/tools/tools/umastat/   (props changed)
  projects/graid/8/tools/tools/vimage/   (props changed)
  projects/graid/8/usr.bin/   (props changed)
  projects/graid/8/usr.bin/apply/   (props changed)
  projects/graid/8/usr.bin/ar/   (props changed)
  projects/graid/8/usr.bin/awk/   (props changed)
  projects/graid/8/usr.bin/biff/   (props changed)
  projects/graid/8/usr.bin/c89/   (props changed)
  projects/graid/8/usr.bin/c99/   (props changed)
  projects/graid/8/usr.bin/calendar/   (props changed)
  projects/graid/8/usr.bin/catman/   (props changed)
  projects/graid/8/usr.bin/chpass/Makefile   (props changed)
  projects/graid/8/usr.bin/column/   (props changed)
  projects/graid/8/usr.bin/comm/   (props changed)
  projects/graid/8/usr.bin/cpio/   (props changed)
  projects/graid/8/usr.bin/csup/   (props changed)
  projects/graid/8/usr.bin/du/   (props changed)
  projects/graid/8/usr.bin/ee/   (props changed)
  projects/graid/8/usr.bin/enigma/   (props changed)
  projects/graid/8/usr.bin/fetch/   (props changed)
  projects/graid/8/usr.bin/find/   (props changed)
  projects/graid/8/usr.bin/finger/   (props changed)
  projects/graid/8/usr.bin/fold/   (props changed)
  projects/graid/8/usr.bin/fstat/   (props changed)
  projects/graid/8/usr.bin/gcore/   (props changed)
  projects/graid/8/usr.bin/getopt/   (props changed)
  projects/graid/8/usr.bin/gzip/   (props changed)
  projects/graid/8/usr.bin/hexdump/   (props changed)
  projects/graid/8/usr.bin/indent/   (props changed)
  projects/graid/8/usr.bin/jot/   (props changed)
  projects/graid/8/usr.bin/kdump/   (props changed)
  projects/graid/8/usr.bin/killall/   (props changed)
  projects/graid/8/usr.bin/ktrace/   (props changed)
  projects/graid/8/usr.bin/ldd/   (props changed)
  projects/graid/8/usr.bin/lex/   (props changed)
  projects/graid/8/usr.bin/locale/   (props changed)
  projects/graid/8/usr.bin/locate/   (props changed)
  projects/graid/8/usr.bin/lockf/   (props changed)
  projects/graid/8/usr.bin/look/   (props changed)
  projects/graid/8/usr.bin/mail/   (props changed)
  projects/graid/8/usr.bin/make/   (props changed)
  projects/graid/8/usr.bin/makewhatis/   (props changed)
  projects/graid/8/usr.bin/minigzip/   (props changed)
  projects/graid/8/usr.bin/ncal/   (props changed)
  projects/graid/8/usr.bin/netstat/   (props changed)
  projects/graid/8/usr.bin/pathchk/   (props changed)
  projects/graid/8/usr.bin/perror/   (props changed)
  projects/graid/8/usr.bin/procstat/   (props changed)
  projects/graid/8/usr.bin/rpcgen/   (props changed)
  projects/graid/8/usr.bin/ruptime/   (props changed)
  projects/graid/8/usr.bin/script/   (props changed)
  projects/graid/8/usr.bin/sed/   (props changed)
  projects/graid/8/usr.bin/sockstat/   (props changed)
  projects/graid/8/usr.bin/split/   (props changed)
  projects/graid/8/usr.bin/stat/   (props changed)
  projects/graid/8/usr.bin/systat/   (props changed)
  projects/graid/8/usr.bin/tar/   (props changed)
  projects/graid/8/usr.bin/tftp/   (props changed)
  projects/graid/8/usr.bin/top/   (props changed)
  projects/graid/8/usr.bin/touch/   (props changed)
  projects/graid/8/usr.bin/tr/   (props changed)
  projects/graid/8/usr.bin/truss/   (props changed)
  projects/graid/8/usr.bin/uname/   (props changed)
  projects/graid/8/usr.bin/unifdef/   (props changed)
  projects/graid/8/usr.bin/uniq/   (props changed)
  projects/graid/8/usr.bin/unzip/   (props changed)
  projects/graid/8/usr.bin/uudecode/   (props changed)
  projects/graid/8/usr.bin/vmstat/   (props changed)
  projects/graid/8/usr.bin/w/   (props changed)
  projects/graid/8/usr.bin/whois/   (props changed)
  projects/graid/8/usr.bin/xinstall/   (props changed)
  projects/graid/8/usr.bin/xlint/   (props changed)
  projects/graid/8/usr.bin/xz/   (props changed)
  projects/graid/8/usr.bin/yacc/   (props changed)
  projects/graid/8/usr.sbin/   (props changed)
  projects/graid/8/usr.sbin/Makefile   (props changed)
  projects/graid/8/usr.sbin/acpi/   (props changed)
  projects/graid/8/usr.sbin/arp/   (props changed)
  projects/graid/8/usr.sbin/asf/   (props changed)
  projects/graid/8/usr.sbin/bluetooth/   (props changed)
  projects/graid/8/usr.sbin/bluetooth/bthidcontrol/   (props changed)
  projects/graid/8/usr.sbin/bluetooth/bthidd/   (props changed)
  projects/graid/8/usr.sbin/boot0cfg/   (props changed)
  projects/graid/8/usr.sbin/bsnmpd/   (props changed)
  projects/graid/8/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_processor_tbl.c   (props changed)
  projects/graid/8/usr.sbin/burncd/   (props changed)
  projects/graid/8/usr.sbin/cdcontrol/   (props changed)
  projects/graid/8/usr.sbin/chown/   (props changed)
  projects/graid/8/usr.sbin/config/   (props changed)
  projects/graid/8/usr.sbin/config/SMM.doc/   (props changed)
  projects/graid/8/usr.sbin/cpucontrol/   (props changed)
  projects/graid/8/usr.sbin/crashinfo/   (props changed)
  projects/graid/8/usr.sbin/cron/   (props changed)
  projects/graid/8/usr.sbin/crunch/examples/   (props changed)
  projects/graid/8/usr.sbin/ctm/   (props changed)
  projects/graid/8/usr.sbin/cxgbtool/   (props changed)
  projects/graid/8/usr.sbin/devinfo/   (props changed)
  projects/graid/8/usr.sbin/diskinfo/   (props changed)
  projects/graid/8/usr.sbin/dumpcis/cardinfo.h   (props changed)
  projects/graid/8/usr.sbin/dumpcis/cis.h   (props changed)
  projects/graid/8/usr.sbin/faithd/   (props changed)
  projects/graid/8/usr.sbin/fdcontrol/   (props changed)
  projects/graid/8/usr.sbin/fdformat/   (props changed)
  projects/graid/8/usr.sbin/fdread/   (props changed)
  projects/graid/8/usr.sbin/fdwrite/   (props changed)
  projects/graid/8/usr.sbin/fifolog/   (props changed)
  projects/graid/8/usr.sbin/flowctl/   (props changed)
  projects/graid/8/usr.sbin/freebsd-update/   (props changed)
  projects/graid/8/usr.sbin/i2c/   (props changed)
  projects/graid/8/usr.sbin/inetd/   (props changed)
  projects/graid/8/usr.sbin/iostat/   (props changed)
  projects/graid/8/usr.sbin/jail/   (props changed)
  projects/graid/8/usr.sbin/jls/   (props changed)
  projects/graid/8/usr.sbin/lpr/   (props changed)
  projects/graid/8/usr.sbin/mailwrapper/   (props changed)
  projects/graid/8/usr.sbin/makefs/ffs/ffs_bswap.c   (props changed)
  projects/graid/8/usr.sbin/makefs/ffs/ffs_subr.c   (props changed)
  projects/graid/8/usr.sbin/makefs/ffs/ufs_bswap.h   (props changed)
  projects/graid/8/usr.sbin/makefs/getid.c   (props changed)
  projects/graid/8/usr.sbin/mergemaster/   (props changed)
  projects/graid/8/usr.sbin/mfiutil/   (props changed)
  projects/graid/8/usr.sbin/mountd/   (props changed)
  projects/graid/8/usr.sbin/moused/   (props changed)
  projects/graid/8/usr.sbin/mptutil/   (props changed)
  projects/graid/8/usr.sbin/mtest/   (props changed)
  projects/graid/8/usr.sbin/mtree/   (props changed)
  projects/graid/8/usr.sbin/named/   (props changed)
  projects/graid/8/usr.sbin/ndp/   (props changed)
  projects/graid/8/usr.sbin/newsyslog/   (props changed)
  projects/graid/8/usr.sbin/nfsdumpstate/   (props changed)
  projects/graid/8/usr.sbin/ntp/   (props changed)
  projects/graid/8/usr.sbin/pciconf/   (props changed)
  projects/graid/8/usr.sbin/periodic/   (props changed)
  projects/graid/8/usr.sbin/pkg_install/   (props changed)
  projects/graid/8/usr.sbin/pmcannotate/   (props changed)
  projects/graid/8/usr.sbin/pmccontrol/   (props changed)
  projects/graid/8/usr.sbin/pmcstat/   (props changed)
  projects/graid/8/usr.sbin/powerd/   (props changed)
  projects/graid/8/usr.sbin/ppp/   (props changed)
  projects/graid/8/usr.sbin/pppctl/   (props changed)
  projects/graid/8/usr.sbin/pstat/   (props changed)
  projects/graid/8/usr.sbin/rpc.lockd/   (props changed)
  projects/graid/8/usr.sbin/rpc.umntall/   (props changed)
  projects/graid/8/usr.sbin/rtadvd/   (props changed)
  projects/graid/8/usr.sbin/rtsold/   (props changed)
  projects/graid/8/usr.sbin/sade/   (props changed)
  projects/graid/8/usr.sbin/service/   (props changed)
  projects/graid/8/usr.sbin/services_mkdb/   (props changed)
  projects/graid/8/usr.sbin/setfmac/   (props changed)
  projects/graid/8/usr.sbin/setpmac/   (props changed)
  projects/graid/8/usr.sbin/smbmsg/   (props changed)
  projects/graid/8/usr.sbin/sysinstall/   (props changed)
  projects/graid/8/usr.sbin/syslogd/   (props changed)
  projects/graid/8/usr.sbin/traceroute/   (props changed)
  projects/graid/8/usr.sbin/traceroute6/   (props changed)
  projects/graid/8/usr.sbin/uathload/   (props changed)
  projects/graid/8/usr.sbin/ugidfw/   (props changed)
  projects/graid/8/usr.sbin/uhsoctl/   (props changed)
  projects/graid/8/usr.sbin/usbconfig/   (props changed)
  projects/graid/8/usr.sbin/vidcontrol/   (props changed)
  projects/graid/8/usr.sbin/watchdogd/   (props changed)
  projects/graid/8/usr.sbin/wpa/   (props changed)
  projects/graid/8/usr.sbin/ypserv/   (props changed)
  projects/graid/8/usr.sbin/zic/   (props changed)

Modified: projects/graid/8/sbin/geom/class/raid/geom_raid.c
==============================================================================
--- projects/graid/8/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 11:32:53 2011	(r218317)
+++ projects/graid/8/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 11:37:41 2011	(r218318)
@@ -44,12 +44,6 @@ __FBSDID("$FreeBSD$");
 uint32_t lib_version = G_LIB_VERSION;
 uint32_t version = G_RAID_VERSION;
 
-#define	GRAID_BALANCE		"load"
-#define	GRAID_SLICE		"4096"
-#define	GRAID_PRIORITY	"0"
-
-//static void raid_main(struct gctl_req *req, unsigned flags);
-
 struct g_command class_commands[] = {
 	{ "label", G_FLAG_VERBOSE, NULL,
 	    {
@@ -89,32 +83,3 @@ struct g_command class_commands[] = {
 	G_CMD_SENTINEL
 };
 
-#if 0
-static int verbose = 0;
-
-static void
-raid_main(struct gctl_req *req, unsigned flags)
-{
-	const char *name;
-
-	if ((flags & G_FLAG_VERBOSE) != 0)
-		verbose = 1;
-
-	name = gctl_get_ascii(req, "verb");
-	if (name == NULL) {
-		gctl_error(req, "No '%s' argument.", "verb");
-		return;
-	}
-	if (strcmp(name, "label") == 0)
-		raid_label(req);
-	else if (strcmp(name, "clear") == 0)
-		raid_clear(req);
-	else if (strcmp(name, "dump") == 0)
-		raid_dump(req);
-	else if (strcmp(name, "activate") == 0)
-		raid_activate(req);
-	else
-		gctl_error(req, "Unknown command: %s.", name);
-}
-#endif
-

Modified: projects/graid/8/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/8/sys/geom/raid/md_intel.c	Sat Feb  5 11:32:53 2011	(r218317)
+++ projects/graid/8/sys/geom/raid/md_intel.c	Sat Feb  5 11:37:41 2011	(r218318)
@@ -1364,7 +1364,8 @@ makedisk:
 		/* Handle size argument. */
 		len = sizeof(*sizearg);
 		sizearg = gctl_get_param(req, "size", &len);
-		if (sizearg != NULL && len == sizeof(*sizearg)) {
+		if (sizearg != NULL && len == sizeof(*sizearg) &&
+		    *sizearg > 0) {
 			if (*sizearg > size) {
 				gctl_error(req, "Size too big %lld > %lld.",
 				    (long long)*sizearg, (long long)size);
@@ -1377,7 +1378,8 @@ makedisk:
 		strip = 131072;
 		len = sizeof(*striparg);
 		striparg = gctl_get_param(req, "strip", &len);
-		if (striparg != NULL && len == sizeof(*striparg)) {
+		if (striparg != NULL && len == sizeof(*striparg) &&
+		    *striparg > 0) {
 			if (*striparg < sectorsize) {
 				gctl_error(req, "Strip size too small.");
 				return (-10);
@@ -1536,7 +1538,8 @@ makedisk:
 		/* Handle size argument. */
 		len = sizeof(*sizearg);
 		sizearg = gctl_get_param(req, "size", &len);
-		if (sizearg != NULL && len == sizeof(*sizearg)) {
+		if (sizearg != NULL && len == sizeof(*sizearg) &&
+		    *sizearg > 0) {
 			if (*sizearg > size) {
 				gctl_error(req, "Size too big %lld > %lld.",
 				    (long long)*sizearg, (long long)size);
@@ -1549,7 +1552,8 @@ makedisk:
 		strip = 131072;
 		len = sizeof(*striparg);
 		striparg = gctl_get_param(req, "strip", &len);
-		if (striparg != NULL && len == sizeof(*striparg)) {
+		if (striparg != NULL && len == sizeof(*striparg) &&
+		    *striparg > 0) {
 			if (*striparg < sectorsize) {
 				gctl_error(req, "Strip size too small.");
 				return (-10);

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 12:56:29 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 7713A106564A;
	Sat,  5 Feb 2011 12:56:29 +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 65D528FC0A;
	Sat,  5 Feb 2011 12:56:29 +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 p15CuTZC028384;
	Sat, 5 Feb 2011 12:56:29 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p15CuTKl028378;
	Sat, 5 Feb 2011 12:56:29 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102051256.p15CuTKl028378@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 12:56:29 +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: r218321 - in projects/graid/head: sbin/geom/class/raid
	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: Sat, 05 Feb 2011 12:56:29 -0000

Author: mav
Date: Sat Feb  5 12:56:29 2011
New Revision: 218321
URL: http://svn.freebsd.org/changeset/base/218321

Log:
  Add -f argument to `graid delete` to specify whether open volume should be
  destroyed.

Modified:
  projects/graid/head/sbin/geom/class/raid/geom_raid.c
  projects/graid/head/sbin/geom/class/raid/graid.8
  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

Modified: projects/graid/head/sbin/geom/class/raid/geom_raid.c
==============================================================================
--- projects/graid/head/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 12:54:59 2011	(r218320)
+++ projects/graid/head/sbin/geom/class/raid/geom_raid.c	Sat Feb  5 12:56:29 2011	(r218321)
@@ -61,8 +61,12 @@ struct g_command class_commands[] = {
 	    },
 	    "[-S size] [-s stripsize] name label level"
 	},
-	{ "delete", G_FLAG_VERBOSE, NULL, G_NULL_OPTS,
-	    "[-v] name [label|num]"
+	{ "delete", G_FLAG_VERBOSE, NULL,
+	    {
+		{ 'f', "force", NULL, G_TYPE_BOOL },
+		G_OPT_SENTINEL
+	    },
+	    "[-fv] name [label|num]"
 	},
 	{ "insert", G_FLAG_VERBOSE, NULL, G_NULL_OPTS,
 	    "[-v] name prov ..."

Modified: projects/graid/head/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/head/sbin/geom/class/raid/graid.8	Sat Feb  5 12:54:59 2011	(r218320)
+++ projects/graid/head/sbin/geom/class/raid/graid.8	Sat Feb  5 12:56:29 2011	(r218321)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 3, 2011
+.Dd February 5, 2011
 .Dt GRAID 8
 .Os
 .Sh NAME
@@ -48,6 +48,7 @@
 .Ar level
 .Nm
 .Cm delete
+.Op Fl f
 .Ar name
 .Op Ar label | Ar num
 .Nm
@@ -142,6 +143,12 @@ Optional
 or
 .Ar num
 arguments allow specifying volume for deletion.
+.Pp
+Additional options include:
+.Bl -tag -width ".Fl f"
+.It Fl f
+Delete volume(s) even if it is still open.
+.El
 .It Cm insert
 Insert specified provider(s) into specified array instead of the first missing
 or failed components.

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Sat Feb  5 12:54:59 2011	(r218320)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Sat Feb  5 12:56:29 2011	(r218321)
@@ -576,6 +576,20 @@ g_raid_nrequests(struct g_raid_softc *sc
 	return (nreqs);
 }
 
+u_int
+g_raid_nopens(struct g_raid_softc *sc)
+{
+	struct g_raid_volume *vol;
+	u_int opens;
+
+	opens = 0;
+	TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
+		if (vol->v_provider_open != 0)
+			opens++;
+	}
+	return (opens);
+}
+
 static int
 g_raid_consumer_is_busy(struct g_raid_softc *sc, struct g_consumer *cp)
 {
@@ -1442,7 +1456,7 @@ g_raid_update_node(struct g_raid_softc *
 static int
 g_raid_access(struct g_provider *pp, int acr, int acw, int ace)
 {
-	struct g_raid_volume *vol, *vol1;
+	struct g_raid_volume *vol;
 	struct g_raid_softc *sc;
 	int dcr, dcw, dce, opens, error = 0;
 
@@ -1473,11 +1487,7 @@ g_raid_access(struct g_provider *pp, int
 	if (sc->sc_stopping == G_RAID_DESTROY_DELAYED &&
 	    vol->v_provider_open == 0) {
 		/* Count open volumes. */
-		opens = 0;
-		TAILQ_FOREACH(vol1, &sc->sc_volumes, v_next) {
-			if (vol1->v_provider_open != 0)
-				opens++;
-		}
+		opens = g_raid_nopens(sc);
 		if (opens == 0) {
 			sc->sc_stopping = G_RAID_DESTROY_HARD;
 			g_raid_event_send(sc, 0, 0);	/* Wake up worker. */
@@ -1752,7 +1762,6 @@ g_raid_destroy_disk(struct g_raid_disk *
 int
 g_raid_destroy(struct g_raid_softc *sc, int how)
 {
-	struct g_raid_volume *vol;
 	int opens;
 
 	g_topology_assert_not();
@@ -1761,11 +1770,7 @@ g_raid_destroy(struct g_raid_softc *sc, 
 	sx_assert(&sc->sc_lock, SX_XLOCKED);
 
 	/* Count open volumes. */
-	opens = 0;
-	TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
-		if (vol->v_provider_open != 0)
-			opens++;
-	}
+	opens = g_raid_nopens(sc);
 
 	/* React on some opened volumes. */
 	if (opens > 0) {

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Sat Feb  5 12:54:59 2011	(r218320)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Sat Feb  5 12:56:29 2011	(r218321)
@@ -356,6 +356,7 @@ int g_raid_tr_kerneldump_common(struct g
 
 u_int g_raid_ndisks(struct g_raid_softc *sc, int state);
 u_int g_raid_nsubdisks(struct g_raid_volume *vol, int state);
+u_int g_raid_nopens(struct g_raid_softc *sc);
 #define	G_RAID_DESTROY_SOFT		0
 #define	G_RAID_DESTROY_DELAYED	1
 #define	G_RAID_DESTROY_HARD		2

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Sat Feb  5 12:54:59 2011	(r218320)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Sat Feb  5 12:56:29 2011	(r218321)
@@ -1227,7 +1227,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
 	char arg[16], serial[INTEL_SERIAL_LEN];
 	const char *verb, *volname, *levelname, *diskname;
 	char *tmp;
-	int *nargs;
+	int *nargs, *force;
 	off_t off, size, sectorsize, strip;
 	intmax_t *sizearg, *striparg;
 	int numdisks, i, len, level, qual, update;
@@ -1632,6 +1632,14 @@ makedisk:
 
 		/* Full node destruction. */
 		if (*nargs == 1) {
+			/* Check if some volume is still open. */
+			force = gctl_get_paraml(req, "force", sizeof(*force));
+			if (force != NULL && *force == 0 &&
+			    g_raid_nopens(sc) != 0) {
+				gctl_error(req, "Some volume is still open.");
+				return (-4);
+			}
+
 			TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
 				if (disk->d_consumer)
 					intel_meta_erase(disk->d_consumer);
@@ -1670,6 +1678,14 @@ makedisk:
 			return (-3);
 		}
 
+		/* Check if volume is still open. */
+		force = gctl_get_paraml(req, "force", sizeof(*force));
+		if (force != NULL && *force == 0 &&
+		    vol->v_provider_open != 0) {
+			gctl_error(req, "Volume is still open.");
+			return (-4);
+		}
+
 		/* Destroy volume and potentially node. */
 		i = 0;
 		TAILQ_FOREACH(vol1, &sc->sc_volumes, v_next)

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 13:07:35 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 6EDC3106566B;
	Sat,  5 Feb 2011 13:07:35 +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 5ED6E8FC13;
	Sat,  5 Feb 2011 13:07:35 +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 p15D7ZTc028677;
	Sat, 5 Feb 2011 13:07:35 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p15D7ZDq028675;
	Sat, 5 Feb 2011 13:07:35 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102051307.p15D7ZDq028675@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 13:07:35 +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: r218322 - 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: Sat, 05 Feb 2011 13:07:35 -0000

Author: mav
Date: Sat Feb  5 13:07:35 2011
New Revision: 218322
URL: http://svn.freebsd.org/changeset/base/218322

Log:
  Make sure that volume is closed before destroying transformation object.
  This guaranties that no requests are still running or will be running.

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Sat Feb  5 12:56:29 2011	(r218321)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Sat Feb  5 13:07:35 2011	(r218322)
@@ -1706,13 +1706,13 @@ g_raid_destroy_volume(struct g_raid_volu
 		return (EBUSY);
 	if (vol->v_provider != NULL)
 		return (EBUSY);
+	if (vol->v_provider_open != 0)
+		return (EBUSY);
 	if (vol->v_tr) {
 		G_RAID_TR_FREE(vol->v_tr);
 		kobj_delete((kobj_t)vol->v_tr, M_RAID);
 		vol->v_tr = NULL;
 	}
-	if (vol->v_provider_open != 0)
-		return (EBUSY);
 	if (vol->v_rootmount)
 		root_mount_rel(vol->v_rootmount);
 	g_topology_lock();

From owner-svn-src-projects@FreeBSD.ORG  Sat Feb  5 20:23:12 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 8D1D31065675;
	Sat,  5 Feb 2011 20:23:12 +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 7D1C48FC17;
	Sat,  5 Feb 2011 20:23:12 +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 p15KNCPT039240;
	Sat, 5 Feb 2011 20:23:12 GMT (envelope-from mav@svn.freebsd.org)
Received: (from mav@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id p15KNCLv039238;
	Sat, 5 Feb 2011 20:23:12 GMT (envelope-from mav@svn.freebsd.org)
Message-Id: <201102052023.p15KNCLv039238@svn.freebsd.org>
From: Alexander Motin 
Date: Sat, 5 Feb 2011 20:23:12 +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: r218336 - 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: Sat, 05 Feb 2011 20:23:12 -0000

Author: mav
Date: Sat Feb  5 20:23:12 2011
New Revision: 218336
URL: http://svn.freebsd.org/changeset/base/218336

Log:
  Validate main metadata fields on read to avoid later surprises.
  
  Skip disks with metadata describing volumes in unsupported migration states
  to not damage data with wrong handling.

Modified:
  projects/graid/head/sys/geom/raid/md_intel.c

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Sat Feb  5 19:13:38 2011	(r218335)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Sat Feb  5 20:23:12 2011	(r218336)
@@ -330,8 +330,10 @@ intel_meta_read(struct g_consumer *cp)
 {
 	struct g_provider *pp;
 	struct intel_raid_conf *meta;
+	struct intel_raid_vol *mvol;
+	struct intel_raid_map *mmap;
 	char *buf;
-	int error, i, left;
+	int error, i, j, k, left, size;
 	uint32_t checksum, *ptr;
 
 	pp = cp->provider;
@@ -352,14 +354,15 @@ intel_meta_read(struct g_consumer *cp)
 		g_free(buf);
 		return (NULL);
 	}
-	if (meta->config_size > 65536) {
-		G_RAID_DEBUG(1, "Intel metadata size looks too big: %d",
+	if (meta->config_size > 65536 ||
+	    meta->config_size < sizeof(struct intel_raid_conf)) {
+		G_RAID_DEBUG(1, "Intel metadata size looks wrong: %d",
 		    meta->config_size);
 		g_free(buf);
 		return (NULL);
 	}
 	meta = malloc(meta->config_size, M_MD_INTEL, M_WAITOK);
-	memcpy(meta, buf, pp->sectorsize);
+	memcpy(meta, buf, min(meta->config_size, pp->sectorsize));
 	g_free(buf);
 
 	/* Read all the rest, if needed. */
@@ -392,6 +395,68 @@ intel_meta_read(struct g_consumer *cp)
 		return (NULL);
 	}
 
+	/* Validate metadata size. */
+	size = sizeof(struct intel_raid_conf) +
+	    sizeof(struct intel_raid_disk) * (meta->total_disks - 1) +
+	    sizeof(struct intel_raid_vol) * meta->total_volumes;
+	if (size > meta->config_size) {
+badsize:
+		G_RAID_DEBUG(1, "Intel metadata size incorrect %d < %d",
+		    meta->config_size, size);
+		free(meta, M_MD_INTEL);
+		return (NULL);
+	}
+	for (i = 0; i < meta->total_volumes; i++) {
+		mvol = intel_get_volume(meta, i);
+		mmap = intel_get_map(mvol, 0);
+		size += 4 * (mmap->total_disks - 1);
+		if (size > meta->config_size)
+			goto badsize;
+		if (mvol->migr_state) {
+			size += sizeof(struct intel_raid_map);
+			if (size > meta->config_size)
+				goto badsize;
+			mmap = intel_get_map(mvol, 1);
+			size += 4 * (mmap->total_disks - 1);
+			if (size > meta->config_size)
+				goto badsize;
+		}
+	}
+
+	/* Validate disk indexes. */
+	for (i = 0; i < meta->total_volumes; i++) {
+		mvol = intel_get_volume(meta, i);
+		for (j = 0; j < (mvol->migr_state ? 2 : 1); j++) {
+			mmap = intel_get_map(mvol, j);
+			for (k = 0; k < mmap->total_disks; k++) {
+				if ((mmap->disk_idx[k] & INTEL_DI_IDX) >
+				    meta->total_disks) {
+					G_RAID_DEBUG(1, "Intel metadata disk"
+					    " index %d too big (>%d)",
+					    mmap->disk_idx[k] & INTEL_DI_IDX,
+					    meta->total_disks);
+					free(meta, M_MD_INTEL);
+					return (NULL);
+				}
+			}
+		}
+	}
+
+	/* Validate migration types. */
+	for (i = 0; i < meta->total_volumes; i++) {
+		mvol = intel_get_volume(meta, i);
+		if (mvol->migr_state &&
+		    mvol->migr_type != INTEL_MT_INIT &&
+		    mvol->migr_type != INTEL_MT_REBUILD &&
+		    mvol->migr_type != INTEL_MT_VERIFY &&
+		    mvol->migr_type != INTEL_MT_REPAIR) {
+			G_RAID_DEBUG(1, "Intel metadata has unsupported"
+			    " migration type %d", mvol->migr_type);
+			free(meta, M_MD_INTEL);
+			return (NULL);
+		}
+	}
+
 	return (meta);
 }