PERFORCE change 118020 for review
Ulf Lilleengen
lulf at FreeBSD.org
Fri Apr 13 17:46:23 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=118020
Change 118020 by lulf at lulf_vimes on 2007/04/13 17:45:56
- Update and create new SoC branches.
Affected files ...
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum.h#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_drive.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_init.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_list.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_move.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_plex.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_raid5.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_raid5.h#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_rename.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_rm.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_share.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_share.h#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_state.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_subr.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_var.h#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_kernel/geom_vinum_volume.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_user/Makefile#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_user/gvinum.8#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_user/gvinum.c#1 branch
.. //depot/projects/soc2007/lulf-gvinum/vinum_user/gvinum.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_drive.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_init.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_list.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_move.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_plex.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_raid5.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_raid5.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_rename.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_rm.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_share.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_share.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_state.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_subr.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_var.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_kernel/geom_vinum_volume.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/Makefile#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_drive.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_init.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_list.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_move.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_plex.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_raid5.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_raid5.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_rename.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_rm.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_share.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_share.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_state.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_subr.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_var.h#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/geom_vinum_volume.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/gvinum.8#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/gvinum.c#1 branch
.. //depot/projects/soc2007/lulf/gvinum_fixup/vinum_user/gvinum.h#1 branch
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum.h#2 edit
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_drive.c#2 edit
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_plex.c#2 edit
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_rm.c#3 edit
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_subr.c#4 edit
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_var.h#2 edit
.. //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_volume.c#2 edit
.. //depot/user/lulf/gvinum_concat/vinum_kernel/geom_vinum_create.c#6 edit
.. //depot/user/lulf/gvinum_concat/vinum_kernel/geom_vinum_share.c#2 edit
.. //depot/user/lulf/gvinum_concat/vinum_user/gvinum.c#14 edit
Differences ...
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum.h#2 (text+ko) ====
@@ -91,5 +91,7 @@
int gv_sd_to_plex(struct gv_plex *, struct gv_sd *, int);
void gv_update_plex_config(struct gv_plex *);
void gv_update_vol_size(struct gv_volume *, off_t);
+off_t gv_vol_size(struct gv_volume *);
+off_t gv_plex_size(struct gv_plex *);
#endif /* !_GEOM_VINUM_H_ */
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_drive.c#2 (text+ko) ====
@@ -401,7 +401,7 @@
struct g_geom *gp, *gp2;
struct g_consumer *cp;
struct gv_drive *d;
- struct gv_sd *s;
+ struct gv_sd *s, *s2;
struct gv_softc *sc;
struct gv_freelist *fl;
struct gv_hdr *vhdr;
@@ -463,7 +463,6 @@
* configuration.
*/
d = gv_find_drive(sc, vhdr->label.name);
-
/* We already know about this drive. */
if (d != NULL) {
/* Check if this drive already has a geom. */
@@ -471,10 +470,22 @@
g_topology_unlock();
break;
}
- bcopy(vhdr, d->hdr, sizeof(*vhdr));
-
+ /* If we have a dummy, remove it. */
+ if (d->flags & GV_DRIVE_DUMMY) {
+ LIST_FOREACH_SAFE(s, &d->subdisks, from_drive,
+ s2) {
+ s->drive_sc = NULL;
+ LIST_REMOVE(s, from_drive);
+ }
+ LIST_REMOVE(d, drive);
+ g_free(d);
+ d = NULL;
+ } else
+ bcopy(vhdr, d->hdr, sizeof(*vhdr));
+
+ }
/* This is a new drive. */
- } else {
+ if (d == NULL) {
d = g_malloc(sizeof(*d), M_WAITOK | M_ZERO);
/* Initialize all needed variables. */
@@ -526,10 +537,12 @@
* them.
*/
LIST_FOREACH(s, &sc->subdisks, sd) {
- if (!strncmp(s->drive, d->name, GV_MAXDRIVENAME))
+ if (!strncmp(s->drive, d->name, GV_MAXDRIVENAME)) {
/* XXX: errors ignored */
gv_sd_to_drive(sc, d, s, errstr,
sizeof(errstr));
+ s->flags ^= GV_SD_AWAITING;
+ }
}
/* This drive is now up for sure. */
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_plex.c#2 (text+ko) ====
@@ -728,6 +728,9 @@
* configuration, we don't check the given value (should we?).
* XXX: shouldn't be done here
*/
+ printf("Adding sd %s on drive %s\n", s->name, s->drive);
+ if (s->flags & GV_SD_AWAITING)
+ s->state = GV_SD_DOWN;
gv_sd_to_plex(p, s, 0);
/* Now check if there's already a geom for this plex. */
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_rm.c#3 (text+ko) ====
@@ -217,9 +217,7 @@
{
struct g_geom *gp;
struct gv_volume *v;
- struct gv_plex *p2;
struct gv_sd *s, *s2;
- off_t minplexsize;
int err;
g_topology_assert();
@@ -265,16 +263,8 @@
p->vol_sc->plexcount--;
LIST_REMOVE(p, in_volume);
p->vol_sc = NULL;
- /* Correctly update the volume size. XXX: Do this on subdisk
- * removal also? */
- p2 = LIST_FIRST(&v->plexes);
- minplexsize = p2->size;
- LIST_FOREACH(p2, &v->plexes, plex) {
- if (p2->size < minplexsize) {
- minplexsize = p2->size;
- }
- }
- gv_update_vol_size(v, minplexsize);
+ /* Correctly update the volume size. */
+ gv_update_vol_size(v, gv_vol_size(v));
}
gv_kill_plex_thread(p);
@@ -293,14 +283,28 @@
gv_rm_sd(struct gv_softc *sc, struct gctl_req *req, struct gv_sd *s, int flags)
{
struct g_provider *pp;
+ struct gv_plex *p;
+ struct gv_volume *v;
KASSERT(s != NULL, ("gv_rm_sd: NULL s"));
pp = s->provider;
+ p = s->plex_sc;
+ v = NULL;
/* Clean up. */
- if (s->plex_sc)
+ if (p != NULL) {
LIST_REMOVE(s, in_plex);
+
+ p->sdcount--;
+ /* Update the plexsize. */
+ p->size = gv_plex_size(p);
+ v = p->vol_sc;
+ if (v != NULL) {
+ /* Update the size of our plex' volume. */
+ gv_update_vol_size(v, gv_vol_size(v));
+ }
+ }
if (s->drive_sc)
LIST_REMOVE(s, from_drive);
LIST_REMOVE(s, sd);
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_subr.c#4 (text+ko) ====
@@ -89,6 +89,7 @@
struct gv_volume *v, *v2;
struct gv_plex *p, *p2;
struct gv_sd *s, *s2;
+ struct gv_drive *d;
int tokens;
char *token[GV_MAXARGS];
@@ -164,6 +165,25 @@
}
}
+ /* If drive's not up yet, we create a dummy. */
+ d = gv_find_drive(sc, s->drive);
+ if (d == NULL) {
+ d = g_malloc(sizeof(*d),
+ M_WAITOK | M_ZERO);
+ d->size = s->size;
+ strlcpy(d->name, s->drive,
+ GV_MAXDRIVENAME);
+ d->flags |= GV_DRIVE_DUMMY;
+ LIST_INSERT_HEAD(&sc->drives, d,
+ drive);
+ LIST_INSERT_HEAD(&d->subdisks, s,
+ from_drive);
+ s->drive_sc = d;
+ }
+
+ if ((d->flags & GV_DRIVE_DUMMY) && s->state == GV_SD_UP)
+ s->flags |= GV_SD_AWAITING;
+
s->vinumconf = sc;
LIST_INSERT_HEAD(&sc->subdisks, s, sd);
}
@@ -345,6 +365,60 @@
v->size = size;
}
+/* Calculates the plex size. */
+off_t
+gv_plex_size(struct gv_plex *p)
+{
+ struct gv_sd *s;
+ off_t size;
+
+ KASSERT(p != NULL, ("gv_plex_size: NULL p"));
+
+ if (p->sdcount == 0)
+ return (0);
+
+ /* Adjust the size of our plex. */
+ size = 0;
+ switch (p->org) {
+ case GV_PLEX_CONCAT:
+ LIST_FOREACH(s, &p->subdisks, in_plex)
+ size += s->size;
+ break;
+ case GV_PLEX_STRIPED:
+ s = LIST_FIRST(&p->subdisks);
+ size = p->sdcount * s->size;
+ break;
+ case GV_PLEX_RAID5:
+ s = LIST_FIRST(&p->subdisks);
+ size = (p->sdcount - 1) * s->size;
+ break;
+ }
+
+ return (size);
+}
+
+/* Returns the size of a volume. */
+off_t
+gv_vol_size(struct gv_volume *v)
+{
+ struct gv_plex *p;
+ off_t minplexsize;
+
+ KASSERT(v != NULL, ("gv_vol_size: NULL v"));
+
+ p = LIST_FIRST(&v->plexes);
+ if (p == NULL)
+ return (0);
+
+ minplexsize = p->size;
+ LIST_FOREACH(p, &v->plexes, plex) {
+ if (p->size < minplexsize) {
+ minplexsize = p->size;
+ }
+ }
+ return (minplexsize);
+}
+
void
gv_update_plex_config(struct gv_plex *p)
{
@@ -641,13 +715,11 @@
gv_free_sd(struct gv_sd *s)
{
struct gv_drive *d;
- struct gv_plex *p;
struct gv_freelist *fl, *fl2;
KASSERT(s != NULL, ("gv_free_sd: NULL s"));
d = s->drive_sc;
- p = s->plex_sc;
if (d == NULL)
return;
@@ -693,21 +765,8 @@
fl->offset = s->drive_offset;
}
- printf("Decrementing from %d to %d\n", p->sdcount, p->sdcount - 1);
d->avail += s->size;
d->sdcount--;
- p->sdcount--;
- switch(p->org) {
- case GV_PLEX_CONCAT:
- p->size -= s->size;
- break;
- case GV_PLEX_STRIPED:
- p->size = p->sdcount * s->size;
- break;
- case GV_PLEX_RAID5:
- p->size = (p->sdcount - 1) * s->size;
- break;
- }
}
void
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_var.h#2 (text+ko) ====
@@ -190,6 +190,7 @@
#define GV_DRIVE_THREAD_DIE 0x02 /* Signal the worker thread to die. */
#define GV_DRIVE_THREAD_DEAD 0x04 /* The worker thread has died. */
#define GV_DRIVE_NEWBORN 0x08 /* The drive was just created. */
+#define GV_DRIVE_DUMMY 0x10 /* This is a dummy drive. */
struct gv_hdr *hdr; /* The drive header. */
@@ -230,6 +231,7 @@
int flags;
#define GV_SD_NEWBORN 0x01 /* Subdisk was just created. */
#define GV_SD_INITCANCEL 0x02 /* Cancel initialization process. */
+#define GV_SD_AWAITING 0x04 /* Awaiting underlying drive. */
char drive[GV_MAXDRIVENAME]; /* Name of underlying drive. */
char plex[GV_MAXPLEXNAME]; /* Name of associated plex. */
==== //depot/user/lulf/gvinum_bugs/vinum_kernel/geom_vinum_volume.c#2 (text+ko) ====
==== //depot/user/lulf/gvinum_concat/vinum_kernel/geom_vinum_create.c#6 (text+ko) ====
==== //depot/user/lulf/gvinum_concat/vinum_kernel/geom_vinum_share.c#2 (text+ko) ====
==== //depot/user/lulf/gvinum_concat/vinum_user/gvinum.c#14 (text+ko) ====
@@ -170,11 +170,6 @@
if (name == NULL)
err(1, "not enough memory");
-/* req = gctl_get_handle();
- gctl_ro_param(req, "class", -1, "VINUM");
- gctl_ro_param(req, "verb", -1, "exists");
- gctl_ro_param(req, "type", sizeof(int), &type);*/
-
/*
* We loop to find a unique drive name for our object. Jump out of the loop
* if we reach 100000, which is a pretty big number never going to be reach
@@ -220,12 +215,8 @@
printf("Trying to create drive on %s\n", device);
/* Strip away eventual /dev/ in front. */
- if (*device == '/') {
- device++;
- while (*device != '/')
- device++;
- device++;
- }
+ if (strncmp(device, "/dev/", 5) == 0)
+ device += 5;
drivename = gvinum_find_name("gvinumdrive", GV_TYPE_DRIVE,
GV_MAXDRIVENAME);
More information about the p4-projects
mailing list