From owner-p4-projects@FreeBSD.ORG Mon Sep 27 03:27:45 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CB02B16A4D0; Mon, 27 Sep 2004 03:27:44 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8CCA616A4CE for ; Mon, 27 Sep 2004 03:27:44 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 773E243D1D for ; Mon, 27 Sep 2004 03:27:44 +0000 (GMT) (envelope-from julian@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i8R3Rijs060847 for ; Mon, 27 Sep 2004 03:27:44 GMT (envelope-from julian@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i8R3RiAp060844 for perforce@freebsd.org; Mon, 27 Sep 2004 03:27:44 GMT (envelope-from julian@freebsd.org) Date: Mon, 27 Sep 2004 03:27:44 GMT Message-Id: <200409270327.i8R3RiAp060844@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to julian@freebsd.org using -f From: Julian Elischer To: Perforce Change Reviews Subject: PERFORCE change 62271 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Sep 2004 03:27:45 -0000 http://perforce.freebsd.org/chv.cgi?CH=62271 Change 62271 by julian@julian_ref on 2004/09/27 03:26:53 IFC Affected files ... .. //depot/projects/nsched/sys/geom/mirror/g_mirror.c#8 integrate .. //depot/projects/nsched/sys/geom/mirror/g_mirror.h#2 integrate .. //depot/projects/nsched/sys/ia64/ia32/ia32_trap.c#2 integrate Differences ... ==== //depot/projects/nsched/sys/geom/mirror/g_mirror.c#8 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/geom/mirror/g_mirror.c,v 1.29 2004/09/26 20:30:15 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/geom/mirror/g_mirror.c,v 1.30 2004/09/26 20:41:07 pjd Exp $"); #include #include @@ -392,6 +392,7 @@ disk->d_sync.ds_consumer = NULL; disk->d_sync.ds_offset = md->md_sync_offset; disk->d_sync.ds_offset_done = md->md_sync_offset; + disk->d_sync.ds_resync = -1; disk->d_sync.ds_syncid = md->md_syncid; if (errorp != NULL) *errorp = 0; @@ -952,6 +953,9 @@ return; } case BIO_WRITE: + { + struct g_mirror_disk_sync *sync; + if (bp->bio_error != 0) { G_MIRROR_LOGREQ(0, bp, "Synchronization request failed (error=%d).", @@ -964,17 +968,20 @@ return; } G_MIRROR_LOGREQ(3, bp, "Synchronization request finished."); - disk->d_sync.ds_offset_done = bp->bio_offset + bp->bio_length; + sync = &disk->d_sync; + sync->ds_offset_done = bp->bio_offset + bp->bio_length; g_destroy_bio(bp); - if (disk->d_sync.ds_offset_done == sc->sc_provider->mediasize) { + if (sync->ds_resync != -1) + break; + if (sync->ds_offset_done == sc->sc_provider->mediasize) { /* * Disk up-to-date, activate it. */ g_mirror_event_send(disk, G_MIRROR_DISK_STATE_ACTIVE, G_MIRROR_EVENT_DONTWAIT); return; - } else if ((disk->d_sync.ds_offset_done % - (G_MIRROR_SYNC_BLOCK_SIZE * 100)) == 0) { + } else if (sync->ds_offset_done % + (G_MIRROR_SYNC_BLOCK_SIZE * 100) == 0) { /* * Update offset_done on every 100 blocks. * XXX: This should be configurable. @@ -984,6 +991,7 @@ g_topology_unlock(); } return; + } default: KASSERT(1 == 0, ("Invalid command here: %u (device=%s)", bp->bio_cmd, sc->sc_name)); @@ -1205,6 +1213,7 @@ case BIO_DELETE: { struct g_mirror_disk *disk; + struct g_mirror_disk_sync *sync; struct bio_queue_head queue; struct g_consumer *cp; struct bio *cbp; @@ -1215,12 +1224,21 @@ */ bioq_init(&queue); LIST_FOREACH(disk, &sc->sc_disks, d_next) { + sync = &disk->d_sync; switch (disk->d_state) { case G_MIRROR_DISK_STATE_ACTIVE: break; case G_MIRROR_DISK_STATE_SYNCHRONIZING: - if (bp->bio_offset >= disk->d_sync.ds_offset) + if (bp->bio_offset >= sync->ds_offset) continue; + else if (bp->bio_offset + bp->bio_length > + sync->ds_offset_done && + (bp->bio_offset < sync->ds_resync || + sync->ds_resync != -1)) { + sync->ds_resync = bp->bio_offset - + (bp->bio_offset % + G_MIRROR_SYNC_BLOCK_SIZE); + } break; default: continue; @@ -1330,6 +1348,7 @@ { struct g_mirror_softc *sc; struct g_mirror_disk *disk; + struct g_mirror_disk_sync *sync; struct g_mirror_event *ep; struct bio *bp; u_int nreqs; @@ -1411,13 +1430,17 @@ G_MIRROR_DISK_STATE_SYNCHRONIZING) { continue; } - if (disk->d_sync.ds_offset >= + sync = &disk->d_sync; + if (sync->ds_offset >= sc->sc_provider->mediasize) { continue; } - if (disk->d_sync.ds_offset > - disk->d_sync.ds_offset_done) { + if (sync->ds_offset > sync->ds_offset_done) continue; + if (sync->ds_resync != -1) { + sync->ds_offset = sync->ds_resync; + sync->ds_offset_done = sync->ds_resync; + sync->ds_resync = -1; } g_mirror_sync_one(disk); } ==== //depot/projects/nsched/sys/geom/mirror/g_mirror.h#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/geom/mirror/g_mirror.h,v 1.8 2004/08/11 23:41:53 pjd Exp $ + * $FreeBSD: src/sys/geom/mirror/g_mirror.h,v 1.9 2004/09/26 20:42:35 pjd Exp $ */ #ifndef _G_MIRROR_H_ @@ -97,6 +97,7 @@ off_t ds_offset; /* Offset of next request to send. */ off_t ds_offset_done; /* Offset of already synchronized region. */ + off_t ds_resync; /* Resynchronize from this offset. */ u_int ds_syncid; /* Disk's synchronization ID. */ u_char *ds_data; }; ==== //depot/projects/nsched/sys/ia64/ia32/ia32_trap.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/ia64/ia32/ia32_trap.c,v 1.2 2004/09/26 00:38:56 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/ia64/ia32/ia32_trap.c,v 1.3 2004/09/26 20:39:56 marcel Exp $"); #include #include @@ -45,6 +45,10 @@ #include #include +#ifdef WITNESS +extern char *syscallnames[]; +#endif + static void ia32_syscall(struct trapframe *tf) {