From owner-p4-projects@FreeBSD.ORG Thu May 3 20:21:30 2007 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 9494316A407; Thu, 3 May 2007 20:21:30 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 5EF0616A401 for ; Thu, 3 May 2007 20:21:30 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 4F05C13C465 for ; Thu, 3 May 2007 20:21:30 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l43KLU5d041924 for ; Thu, 3 May 2007 20:21:30 GMT (envelope-from lulf@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l43KLTwK041921 for perforce@freebsd.org; Thu, 3 May 2007 20:21:29 GMT (envelope-from lulf@FreeBSD.org) Date: Thu, 3 May 2007 20:21:29 GMT Message-Id: <200705032021.l43KLTwK041921@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to lulf@FreeBSD.org using -f From: Ulf Lilleengen To: Perforce Change Reviews Cc: Subject: PERFORCE change 119204 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: Thu, 03 May 2007 20:21:31 -0000 http://perforce.freebsd.org/chv.cgi?CH=119204 Change 119204 by lulf@lulf_vimes on 2007/05/03 20:21:17 - Change gv_is_open to gv_consumer_is_open and add a similar function for checking if a provider is open. - Fix compilation issues from last commit. The setstate of subdisk, plex and drive should work properly and seems to work after some tests. Affected files ... .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#5 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#4 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#2 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rm.c#3 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#6 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_subr.c#2 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_var.h#3 edit Differences ... ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#5 (text+ko) ==== @@ -529,7 +529,20 @@ * ERROR CODES.*/ if (err) printf("VINUM: error setting drive " - "state"); + "state\n"); + g_free(ev->arg2); + g_free(ev->arg3); + break; + + case GV_EVENT_SET_VOL_STATE: + printf("VINUM: event 'setstate volume'\n"); + v = ev->arg1; + newstate = *(int *)ev->arg2; + flags = *(int *)ev->arg3; + err = gv_set_vol_state(v, newstate, flags); + if (err) + printf("VINUM: error setting volume " + "state\n"); g_free(ev->arg2); g_free(ev->arg3); break; ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#4 (text+ko) ==== @@ -63,6 +63,7 @@ void gv_setstate(struct g_geom *, struct gctl_req *); int gv_set_drive_state(struct gv_drive *, int, int); int gv_set_sd_state(struct gv_sd *, int, int); +int gv_set_vol_state(struct gv_volume *, int, int); void gv_update_sd_state(struct gv_sd *); void gv_update_plex_state(struct gv_plex *); void gv_update_vol_state(struct gv_volume *); @@ -76,7 +77,8 @@ struct gv_volume *gv_find_vol(struct gv_softc *, char *); void gv_format_config(struct gv_softc *, struct sbuf *, int, char *); int gv_is_striped(struct gv_plex *); -int gv_is_open(struct g_consumer *); +int gv_consumer_is_open(struct g_consumer *); +int gv_provider_is_open(struct g_provider *); int gv_object_type(struct gv_softc *, char *); void gv_parse_config(struct gv_softc *, u_char *); int gv_sd_to_drive(struct gv_sd *, struct gv_drive *); ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#2 (text+ko) ==== @@ -361,7 +361,7 @@ { struct gv_sync_args *sync; - if (gv_is_open(p->geom)) + if (gv_consumer_is_open(p->geom)) return (EBUSY); if (p->flags & GV_PLEX_SYNCING) ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rm.c#3 (text+ko) ==== @@ -127,7 +127,7 @@ case GV_TYPE_DRIVE: d = gv_find_drive(sc, argv); /* We don't allow to remove open drives. */ - if (gv_is_open(d->consumer)) { + if (gv_consumer_is_open(d->consumer)) { gctl_error(req, "drive '%s' is open", d->name); return; } @@ -163,7 +163,7 @@ /* First make sure nothing is open. */ LIST_FOREACH_SAFE(d, &sc->drives, drive, d2) { - if (gv_is_open(d->consumer)) { + if (gv_consumer_is_open(d->consumer)) { gctl_error(req, "drive '%s' is busy", d->name); return (-1); } ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#6 (text+ko) ==== @@ -43,6 +43,7 @@ struct gv_softc *sc; struct gv_sd *s; struct gv_drive *d; + struct gv_volume *v; char *obj, *state; int f, *flags, *newstatep, *flagp, type; @@ -142,7 +143,7 @@ return (0); /* We allow to take down an open drive only with force. */ - if ((newstate == GV_DRIVE_DOWN) && gv_is_open(d->consumer) && + if ((newstate == GV_DRIVE_DOWN) && gv_consumer_is_open(d->consumer) && (!(flags & GV_SETSTATE_FORCE))) return (-1); @@ -155,7 +156,7 @@ /* Save the config back to disk. */ if (flags & GV_SETSTATE_CONFIG) - gv_post_event(sc, GV_EVENT_SAVE_CONFIG, v->vinumconf, NULL, NULL); + gv_save_config(d->vinumconf); return (0); } @@ -270,7 +271,7 @@ /* Save the config back to disk. */ if (flags & GV_SETSTATE_CONFIG) - gv_post_event(sc, GV_EVENT_SAVE_CONFIG, v->vinumconf, NULL, NULL); + gv_save_config(s->vinumconf); return (status); } @@ -291,15 +292,16 @@ case GV_VOL_UP: /* Let update handle if the volume can come up. */ gv_update_vol_state(v); - if (v->state != GV_VOL_UP && flags & GV_SETSTATE_FORCE) - v->state = newstate; + if (v->state != GV_VOL_UP && !(flags & GV_SETSTATE_FORCE)) + return (-1); /* XXX: ERROR CODES. */ + v->state = newstate; break; case GV_VOL_DOWN: /* * Set state to GV_VOL_DOWN only if noone is using the volume, * or if the state should be forced. */ - if ((gv_is_open(v->geom) != 0) && + if (!gv_provider_is_open(v->provider) && !(flags & GV_SETSTATE_FORCE)) return (-1); /* XXX: ERROR CODES. */ v->state = newstate; @@ -307,7 +309,8 @@ } /* Save config */ if (flags & GV_SETSTATE_CONFIG) - gv_post_event(sc, GV_EVENT_SAVE_CONFIG, v->vinumconf, NULL, NULL); + gv_save_config(v->vinumconf); + return (0); } /* Update the state of a subdisk based on its environment. */ ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_subr.c#2 (text+ko) ==== @@ -853,7 +853,7 @@ /* Check if any consumer of the given geom is open. */ int -gv_is_open(struct g_consumer *cp) +gv_consumer_is_open(struct g_consumer *cp) { if (cp == NULL) return (0); @@ -864,6 +864,17 @@ return (0); } +int +gv_provider_is_open(struct g_provider *pp) { + if (pp == NULL) + return (0); + + if (pp->acr || pp->acw || pp->ace) + return (1); + + return (0); +} + /* * Compare the modification dates of the drives. * Return 1 if a > b, 0 otherwise. ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_var.h#3 (text+ko) ==== @@ -174,6 +174,7 @@ #define GV_EVENT_RM_DRIVE 12 #define GV_EVENT_SET_SD_STATE 13 #define GV_EVENT_SET_DRIVE_STATE 14 +#define GV_EVENT_SET_VOL_STATE 15 struct gv_event { int type;