From owner-p4-projects@FreeBSD.ORG Tue Aug 23 10:21:44 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E3BA616A421; Tue, 23 Aug 2005 10:21:43 +0000 (GMT) X-Original-To: perforce@freebsd.org 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 A14A316A41F for ; Tue, 23 Aug 2005 10:21:43 +0000 (GMT) (envelope-from soc-cjones@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5FC4343D45 for ; Tue, 23 Aug 2005 10:21:43 +0000 (GMT) (envelope-from soc-cjones@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j7NALhsQ023237 for ; Tue, 23 Aug 2005 10:21:43 GMT (envelope-from soc-cjones@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j7NALhHQ023234 for perforce@freebsd.org; Tue, 23 Aug 2005 10:21:43 GMT (envelope-from soc-cjones@freebsd.org) Date: Tue, 23 Aug 2005 10:21:43 GMT Message-Id: <200508231021.j7NALhHQ023234@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to soc-cjones@freebsd.org using -f From: soc-cjones To: Perforce Change Reviews Cc: Subject: PERFORCE change 82440 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Aug 2005 10:21:44 -0000 http://perforce.freebsd.org/chv.cgi?CH=82440 Change 82440 by soc-cjones@soc-cjones_ishtar on 2005/08/23 10:21:38 Yeeeeeehaw! We've now got moves working, kernel-panic-less, with one exception: the new sd's consumer is set to 0. Which is, well, wrong. But this is easily fixable, after I get some sleep. Affected files ... .. //depot/projects/soc2005/gvinum/src/sys/geom/vinum/geom_vinum_move.c#11 edit Differences ... ==== //depot/projects/soc2005/gvinum/src/sys/geom/vinum/geom_vinum_move.c#11 (text+ko) ==== @@ -170,6 +170,7 @@ struct gv_sd *newsd, *s, *s2; struct gv_plex *p; struct gv_volume *v; + struct g_consumer *cp; char errstr[ERRBUFSIZ]; printf("gv_move_sd: entering\n"); @@ -235,6 +236,9 @@ } /* Replace the old sd by the new one. */ + cp = cursd->consumer; + g_detach(cp); + printf("gv_move_sd: detached consumer\n"); LIST_FOREACH_SAFE(s, &p->subdisks, in_plex, s2) { printf("gv_move_sd: traversing in_plex list (s: %p, s->name: '%s', s2: %p)\n", s, s->name, s2); printf("gv_move_sd: for sd '%s', consumer = %p\n", s->name, s->consumer); @@ -242,7 +246,7 @@ printf("\thit!\n"); p->sdcount--; err = gv_rm_sd(sc, req, s, 0); - printf("gv_move_sd: removed subdisk\n"); + printf("gv_move_sd: removed old subdisk\n"); if (err) { printf("gv_move_sd: gv_rm_sd = %d\n", err); return err; @@ -252,24 +256,34 @@ } printf("gv_move_sd: completed traversing in_plex\n"); gv_sd_to_plex(p, newsd, 1); - newsd->flags |= GV_SD_NEWBORN; + /* newsd->flags |= GV_SD_NEWBORN; */ printf("gv_move_sd: gave sd to plex, set flags\n"); - gv_drive_modify(d); + gv_drive_modify(d); /* Creates the new providers.... */ printf("gv_move_sd: gv_drive_modify(d)\n"); - /* XXX - how to get the consumer set? s->consumer = g_new_consumer(p->geom); */ - printf("gv_move_sd: set s->consumer to %p\n", s->consumer); + printf("cp=%p, newsd=%p, newsd->provider=%p\n", cp, newsd, newsd->provider); + /* And reconnect the consumer ... */ + err = g_attach(cp, newsd->provider); + printf("gv_move_sd: called g_attach(%p, %p) => %d; new consumer %p\n", cp, newsd->provider, err, newsd->consumer); + if (err) { + g_destroy_consumer(cp); + gctl_error(req, "proposed move would create a loop in GEOM config"); + return err; + } else { + printf("gv_move_sd: set newsd->consumer to %p\n", newsd->consumer); + } + printf("gv_move_sd: before LIST_INSERT_HEAD\n"); LIST_INSERT_HEAD(&sc->subdisks, newsd, sd); - printf("gv_move_sd: inserted sd into subdisks list\n"); + printf("gv_move_sd: inserted newsd into subdisks list\n"); - LIST_FOREACH(s, &sc->subdisks, sd) + /* LIST_FOREACH(s, &sc->subdisks, sd) gv_update_sd_state(s); - printf("gv_move_sd: updated subdisk states\n"); - LIST_FOREACH(p, &sc->plexes, plex) + printf("gv_move_sd: updated subdisk states\n"); + LIST_FOREACH(p, &sc->plexes, plex) gv_update_plex_config(p); - printf("gv_move_sd: updated plex configs\n"); - LIST_FOREACH(v, &sc->volumes, volume) + printf("gv_move_sd: updated plex configs\n"); + LIST_FOREACH(v, &sc->volumes, volume) gv_update_vol_state(v); - printf("gv_move_sd: updated volume states\n"); + printf("gv_move_sd: updated volume states\n"); */ gv_save_config_all(sc);