summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/vinum/vinumconfig.c228
1 files changed, 117 insertions, 111 deletions
diff --git a/sys/dev/vinum/vinumconfig.c b/sys/dev/vinum/vinumconfig.c
index 0a66f91..32e56b9 100644
--- a/sys/dev/vinum/vinumconfig.c
+++ b/sys/dev/vinum/vinumconfig.c
@@ -44,7 +44,7 @@
* otherwise) arising in any way out of the use of this software, even if
* advised of the possibility of such damage.
*
- * $Id: config.c,v 1.6 1998/12/28 04:56:22 peter Exp $
+ * $Id: vinumconfig.c,v 1.22 1998/12/30 05:07:24 grog Exp grog $
*/
#define STATIC /* nothing while we're testing XXX */
@@ -55,10 +55,8 @@
extern jmp_buf command_fail; /* return on a failed command */
-#if __FreeBSD__ >= 3
/* Why aren't these declared anywhere? XXX */
void longjmp(jmp_buf, int);
-#endif
#define MAXTOKEN 64 /* maximum number of tokens in a line */
@@ -95,7 +93,6 @@ struct putchar_arg {
void
throw_rude_remark(int error, char *msg,...)
{
- BROKEN_GDB;
int retval;
va_list ap;
char *text;
@@ -148,7 +145,6 @@ int atoi(char *); /* no atoi in the kernel */
int
atoi(char *s)
{ /* no atoi in the kernel */
- BROKEN_GDB;
int r = 0;
int sign = 1;
@@ -166,7 +162,6 @@ atoi(char *s)
int
volume_index(struct volume *vol)
{
- BROKEN_GDB;
int i;
for (i = 0; i < vinum_conf.volumes_used; i++)
@@ -180,7 +175,6 @@ volume_index(struct volume *vol)
int
plex_index(struct plex *plex)
{
- BROKEN_GDB;
int i;
for (i = 0; i < vinum_conf.plexes_used; i++)
@@ -194,7 +188,6 @@ plex_index(struct plex *plex)
int
sd_index(struct sd *sd)
{
- BROKEN_GDB;
int i;
for (i = 0; i < vinum_conf.subdisks_used; i++)
@@ -208,7 +201,6 @@ sd_index(struct sd *sd)
int
drive_index(struct drive *drive)
{
- BROKEN_GDB;
int i;
for (i = 0; i < vinum_conf.drives_used; i++)
@@ -222,7 +214,6 @@ drive_index(struct drive *drive)
int
my_plex(int volno, int plexno)
{
- BROKEN_GDB;
int i;
struct volume *vol;
@@ -238,7 +229,6 @@ my_plex(int volno, int plexno)
int
my_sd(int plexno, int sdno)
{
- BROKEN_GDB;
int i;
struct plex *plex;
@@ -254,16 +244,14 @@ my_sd(int plexno, int sdno)
void
checkkernel(char *op)
{
- BROKEN_GDB;
if (vinum_conf.flags & VF_KERNELOP == 0)
- throw_rude_remark(EPERM, "Can't perform '%s' from user space", op);
+ throw_rude_remark(EPERM, "Can't perform '%s' from user space", op);
}
/* Add plex to the volume if possible */
int
give_plex_to_volume(int volno, int plexno)
{
- BROKEN_GDB;
struct volume *vol;
/* XXX It's not an error for the plex to already
@@ -278,6 +266,9 @@ give_plex_to_volume(int volno, int plexno)
throw_rude_remark(ENOSPC,
"Too many plexes for volume %s",
vol->name);
+ else if ((vol->plexes > 0) /* we have other plexes */
+ &&(vol->flags & VF_CONFIG_SETUPSTATE == 0)) /* and we're not setting up state */
+ invalidate_subdisks(&PLEX[plexno], sd_stale); /* make the subdisks invalid */
vol->plex[vol->plexes] = plexno; /* this one */
vol->plexes++; /* add another plex */
PLEX[plexno].volno = volno; /* note the number of our volume */
@@ -289,7 +280,6 @@ give_plex_to_volume(int volno, int plexno)
int
give_sd_to_plex(int plexno, int sdno)
{
- BROKEN_GDB;
int i;
struct plex *plex;
struct sd *sd;
@@ -309,7 +299,11 @@ give_sd_to_plex(int plexno, int sdno)
if (sd->plexoffset < 0) { /* no offset specified */
if (plex->subdisks > 0) {
struct sd *lastsd = &SD[plex->sdnos[plex->subdisks - 1]]; /* last subdisk */
- sd->plexoffset = lastsd->sectors + lastsd->plexoffset; /* take it */
+
+ if (plex->organization == plex_concat) /* concat, */
+ sd->plexoffset = lastsd->sectors + lastsd->plexoffset; /* starts here */
+ else /* striped or RAID-5, */
+ sd->plexoffset = plex->stripesize * plex->subdisks; /* starts here */
} else /* first subdisk */
sd->plexoffset = 0; /* start at the beginning */
}
@@ -323,19 +317,11 @@ give_sd_to_plex(int plexno, int sdno)
if (plex->subdisks >= plex->subdisks_allocated) /* need more space */
EXPAND(plex->sdnos, int, plex->subdisks_allocated, INITIAL_SUBDISKS_IN_PLEX);
- /* XXX I'm not sure this makes any sense
- * for anything except concatenated plexes,
- * and it comes up with the wrong answer for
- * RAID-5 plexes, but it's currently needed
- * for the calculations. We'll adjust for
- * RAID-5 in config_plex */
- if ((sd->sectors + sd->plexoffset) > plex->length) { /* gone beyond the end of the plex */
- plex->length = sd->sectors + sd->plexoffset; /* adjust the length */
-
- if ((plex->volno >= 0) /* we have a volume */
- &&(plex->length > VOL[plex->volno].size)) /* and we're now the longest plex */
- VOL[plex->volno].size = plex->length; /* increase the size of the volume */
- }
+ /* Adjust size of plex and volume. */
+ plex->length += sd->sectors; /* plex gets this much bigger */
+ if (plex->volno >= 0) /* we have a volume */
+ VOL[plex->volno].size = max(VOL[plex->volno].size, plex->length); /* adjust its size */
+
/* We need to check that the subdisks don't overlap,
* but we can't do that until a point where we *must*
* know the size of all the subdisks. That's not
@@ -348,6 +334,7 @@ give_sd_to_plex(int plexno, int sdno)
for (j = plex->subdisks - 1; j > i; j--) /* move up one at a time */
plex->sdnos[j] = plex->sdnos[j - 1];
plex->sdnos[i] = sdno;
+ sd->plexsdno = i; /* note where we are in the subdisk */
return i;
}
}
@@ -355,6 +342,7 @@ give_sd_to_plex(int plexno, int sdno)
/* The plex doesn't have any subdisk with a larger
* offset. Insert it */
plex->sdnos[i] = sdno;
+ sd->plexsdno = i; /* note where we are in the subdisk */
return i;
}
@@ -364,7 +352,6 @@ give_sd_to_plex(int plexno, int sdno)
static void
give_sd_to_drive(int sdno)
{
- BROKEN_GDB;
struct sd *sd; /* pointer to subdisk */
struct drive *drive; /* and drive */
int fe; /* index in free list */
@@ -372,9 +359,9 @@ give_sd_to_drive(int sdno)
sd = &SD[sdno]; /* point to sd */
drive = &DRIVE[sd->driveno]; /* and drive */
- if (drive->state != drive_up) /* not up */
- throw_rude_remark(EIO, "Drive %s is not accessible", drive->label.name);
- else if (sd->sectors > drive->sectors_available) { /* too big, */
+ if (drive->state != drive_up)
+ update_sd_state(sdno); /* that crashes the subdisk */
+ if (sd->sectors > drive->sectors_available) { /* too big, */
sd->driveoffset = -1; /* don't be confusing */
throw_rude_remark(ENOSPC, "No space for %s on %s", sd->name, drive->label.name);
}
@@ -469,7 +456,6 @@ give_sd_to_drive(int sdno)
int
get_empty_drive(void)
{
- BROKEN_GDB;
int driveno;
struct drive *drive;
@@ -502,7 +488,6 @@ get_empty_drive(void)
int
find_drive(const char *name, int create)
{
- BROKEN_GDB;
int driveno;
struct drive *drive;
@@ -526,6 +511,7 @@ find_drive(const char *name, int create)
min(sizeof(drive->label.name),
strlen(name)));
drive->state = drive_uninit; /* in use, nothing worthwhile there */
+ drive->flags |= VF_NEWBORN; /* newly born drive */
return driveno; /* return the index */
}
@@ -535,14 +521,13 @@ find_drive(const char *name, int create)
int
find_drive_by_dev(const char *devname, int create)
{
- BROKEN_GDB;
int driveno;
struct drive *drive;
for (driveno = 0; driveno < vinum_conf.drives_used; driveno++) {
drive = &DRIVE[driveno]; /* point to drive */
if ((drive->label.name[0] != '\0') /* it has a name */
- &&(strcmp(drive->label.name, devname) == 0)) /* and it's this one: found */
+ &&(strcmp(drive->devicename, devname) == 0)) /* and it's this one: found */
return driveno;
}
@@ -557,6 +542,7 @@ find_drive_by_dev(const char *devname, int create)
min(sizeof(drive->devicename),
strlen(devname)));
drive->state = drive_uninit; /* in use, nothing worthwhile there */
+ drive->flags |= VF_NEWBORN; /* newly born drive */
return driveno; /* return the index */
}
@@ -564,7 +550,6 @@ find_drive_by_dev(const char *devname, int create)
int
get_empty_sd(void)
{
- BROKEN_GDB;
int sdno;
struct sd *sd;
@@ -593,11 +578,12 @@ get_empty_sd(void)
void
free_drive(struct drive *drive)
{
- BROKEN_GDB;
+ lockdrive(drive);
if (drive->vp != NULL) /* device open */
vn_close(drive->vp, FREAD | FWRITE, FSCRED, drive->p);
bzero(drive, sizeof(struct drive)); /* this also sets drive_unallocated */
vinum_conf.drives_used--; /* one less drive */
+ unlockdrive(drive);
}
/* Find the named subdisk in vinum_conf.sd.
@@ -609,7 +595,6 @@ free_drive(struct drive *drive)
int
find_subdisk(const char *name, int create)
{
- BROKEN_GDB;
int sdno;
struct sd *sd;
@@ -626,6 +611,7 @@ find_subdisk(const char *name, int create)
sdno = get_empty_sd();
sd = &SD[sdno];
bcopy(name, sd->name, min(sizeof(sd->name), strlen(name))); /* put in its name */
+ sd->flags |= VF_NEWBORN; /* newly born subdisk */
return sdno; /* return the pointer */
}
@@ -636,7 +622,6 @@ find_subdisk(const char *name, int create)
void
free_sd(int sdno)
{
- BROKEN_GDB;
struct sd *sd;
struct drive *drive;
int fe; /* free list entry */
@@ -722,7 +707,6 @@ free_sd(int sdno)
int
get_empty_plex(void)
{
- BROKEN_GDB;
int plexno;
struct plex *plex; /* if we allocate one */
@@ -759,7 +743,6 @@ get_empty_plex(void)
int
find_plex(const char *name, int create)
{
- BROKEN_GDB;
int plexno;
struct plex *plex;
@@ -776,6 +759,7 @@ find_plex(const char *name, int create)
plexno = get_empty_plex();
plex = &PLEX[plexno]; /* point to it */
bcopy(name, plex->name, min(sizeof(plex->name), strlen(name))); /* put in its name */
+ plex->flags |= VF_NEWBORN; /* newly born plex */
return plexno; /* return the pointer */
}
@@ -784,7 +768,6 @@ find_plex(const char *name, int create)
void
free_plex(int plexno)
{
- BROKEN_GDB;
struct plex *plex;
plex = &PLEX[plexno];
@@ -792,10 +775,6 @@ free_plex(int plexno)
Free(plex->sdnos);
if (plex->lock)
Free(plex->lock);
- if (plex->defective_region)
- Free(plex->defective_region);
- if (plex->unmapped_region)
- Free(plex->unmapped_region);
bzero(plex, sizeof(struct plex)); /* and clear it out */
plex->state = plex_unallocated;
vinum_conf.plexes_used--; /* one less plex */
@@ -805,7 +784,6 @@ free_plex(int plexno)
int
get_empty_volume(void)
{
- BROKEN_GDB;
int volno;
struct volume *vol;
@@ -839,7 +817,6 @@ get_empty_volume(void)
int
find_volume(const char *name, int create)
{
- BROKEN_GDB;
int volno;
struct volume *vol;
@@ -857,6 +834,7 @@ find_volume(const char *name, int create)
vol = &VOL[volno];
bcopy(name, vol->name, min(sizeof(vol->name), strlen(name))); /* put in its name */
vol->blocksize = DEV_BSIZE; /* block size of this volume */
+ vol->flags |= VF_NEWBORN; /* newly born volume */
return volno; /* return the pointer */
}
@@ -865,7 +843,6 @@ find_volume(const char *name, int create)
void
free_volume(int volno)
{
- BROKEN_GDB;
struct volume *vol;
vol = &VOL[volno];
@@ -880,9 +857,8 @@ free_volume(int volno)
* If we find an error, print a message and return
*/
void
-config_drive(void)
+config_drive(int update)
{
- BROKEN_GDB;
enum drive_label_info partition_status; /* info about the partition */
int parameter;
int driveno; /* index of drive in vinum_conf */
@@ -892,6 +868,9 @@ config_drive(void)
throw_rude_remark(EINVAL, "Drive has no name");
driveno = find_drive(token[1], 1); /* allocate a drive to initialize */
drive = &DRIVE[driveno]; /* and get a pointer */
+ if (update && ((drive->flags & VF_NEWBORN) == 0)) /* this drive exists already */
+ return; /* don't do anything */
+ drive->flags &= ~VF_NEWBORN; /* no longer newly born */
if (drive->state != drive_uninit) { /* we already know this drive */
/* XXX Check which definition is more up-to-date. Give
@@ -908,13 +887,14 @@ config_drive(void)
else /* no change */
break;
}
+ /* open the device and get the configuration */
bcopy(token[parameter], /* insert device information */
drive->devicename,
min(sizeof(drive->devicename),
strlen(token[parameter])));
- /* open the device and get the configuration */
- partition_status = read_drive_label(drive);
- if (partition_status == DL_CANT_OPEN) { /* not our kind */
+ partition_status = read_drive_label(drive, 1);
+ switch (partition_status) {
+ case DL_CANT_OPEN: /* not our kind */
close_drive(drive);
if (drive->lasterror == EFTYPE) /* wrong kind of partition */
throw_rude_remark(drive->lasterror,
@@ -924,13 +904,30 @@ config_drive(void)
throw_rude_remark(drive->lasterror,
"Can't initialize drive %s",
drive->label.name);
- } else if (partition_status == DL_WRONG_DRIVE) { /* valid drive, not ours */
+ break;
+
+ case DL_WRONG_DRIVE: /* valid drive, not the name we expected */
close_drive(drive);
throw_rude_remark(drive->lasterror,
"Incorrect drive name %s specified for drive %s",
token[1],
drive->label.name);
+ break;
+
+ case DL_DELETED_LABEL: /* it was a drive, but we deleted it */
+ break;
+
+ case DL_NOT_OURS: /* nothing to do with the rest */
+ case DL_OURS:
+ break;
}
+ /* read_drive_label overwrites the device name.
+ * If we get here, we can have the drive,
+ * so put it back again */
+ bcopy(token[parameter],
+ drive->devicename,
+ min(sizeof(drive->devicename),
+ strlen(token[parameter])));
break;
case kw_state:
@@ -959,20 +956,20 @@ config_drive(void)
* If we find an error, print a message and return
*/
void
-config_subdisk(void)
+config_subdisk(int update)
{
- BROKEN_GDB;
int parameter;
int sdno; /* index of sd in vinum_conf */
struct sd *sd; /* and pointer to it */
u_int64_t size;
- int sectors; /* sector offset value */
int detached = 0; /* set to 1 if this is a detached subdisk */
int sdindex = -1; /* index in plexes subdisk table */
int namedsdno;
+ enum sdstate state = sd_unallocated; /* state to set, if specified */
sdno = get_empty_sd(); /* allocate an SD to initialize */
sd = &SD[sdno]; /* and get a pointer */
+
for (parameter = 1; parameter < tokens; parameter++) { /* look at the other tokens */
switch (get_keyword(token[parameter], &keyword_set)) {
case kw_detached:
@@ -997,8 +994,12 @@ config_subdisk(void)
case kw_name:
namedsdno = find_subdisk(token[++parameter], 0); /* find an existing sd with this name */
- if (namedsdno >= 0)
- throw_rude_remark(EINVAL, "Duplicate subdisk %s", token[parameter]);
+ if (namedsdno >= 0) { /* got one */
+ if (update) /* are we updating? */
+ return; /* that's OK, nothing more to do */
+ else
+ throw_rude_remark(EINVAL, "Duplicate subdisk %s", token[parameter]);
+ }
bcopy(token[parameter],
sd->name,
min(sizeof(sd->name), strlen(token[parameter])));
@@ -1020,9 +1021,11 @@ config_subdisk(void)
sd->plexno = find_plex(token[++parameter], 1); /* insert plex information */
break;
+ /* Set the state. We can't do this directly,
+ * because give_sd_to_plex may change it */
case kw_state:
checkkernel(token[++parameter]); /* must be a kernel user */
- sd->state = SdState(token[parameter]); /* set the state */
+ state = SdState(token[parameter]); /* set the state */
break;
default:
@@ -1062,8 +1065,10 @@ config_subdisk(void)
if (sd->sectors == 0)
throw_rude_remark(EINVAL, "sd %s has no length spec", sd->name);
- if (sd->state == sd_unallocated) /* no state decided, */
- sd->state = sd_init; /* at least we're in the game */
+ if (state != sd_unallocated) /* we had a specific state to set */
+ sd->state = state; /* do it now */
+ else if (sd->state == sd_unallocated) /* no, nothing set yet, */
+ sd->state = sd_up; /* must be up */
/* register the subdisk with the drive. This action
* will have the side effect of setting the offset if
@@ -1073,12 +1078,10 @@ config_subdisk(void)
}
/* Handle a plex definition.
- * If we find an error, print a message, deallocate the nascent plex, and return
*/
void
-config_plex(void)
+config_plex(int update)
{
- BROKEN_GDB;
int parameter;
int plexno; /* index of plex in vinum_conf */
struct plex *plex; /* and pointer to it */
@@ -1090,6 +1093,7 @@ config_plex(void)
plexno = get_empty_plex(); /* allocate a plex */
plex = &PLEX[plexno]; /* and point to it */
plex->plexno = plexno; /* and back to the config */
+
for (parameter = 1; parameter < tokens; parameter++) { /* look at the other tokens */
switch (get_keyword(token[parameter], &keyword_set)) {
case kw_detached:
@@ -1098,8 +1102,12 @@ config_plex(void)
case kw_name:
namedplexno = find_plex(token[++parameter], 0); /* find an existing plex with this name */
- if (namedplexno >= 0)
- throw_rude_remark(EINVAL, "Duplicate plex %s", token[parameter]);
+ if (namedplexno >= 0) { /* plex exists already, */
+ if (update) /* are we updating? */
+ return; /* yes: that's OK, just return */
+ else
+ throw_rude_remark(EINVAL, "Duplicate plex %s", token[parameter]);
+ }
bcopy(token[parameter], /* put in the name */
plex->name,
min(MAXPLEXNAME, strlen(token[parameter])));
@@ -1190,9 +1198,8 @@ config_plex(void)
* If we find an error, print a message, deallocate the nascent volume, and return
*/
void
-config_volume(void)
+config_volume(int update)
{
- BROKEN_GDB;
int parameter;
int volno;
struct volume *vol; /* collect volume info here */
@@ -1203,6 +1210,9 @@ config_volume(void)
current_volume = -1; /* forget the previous volume */
volno = find_volume(token[1], 1); /* allocate a volume to initialize */
vol = &VOL[volno]; /* and get a pointer */
+ if (update && ((vol->flags & VF_NEWBORN) == 0)) /* this volume exists already */
+ return; /* don't do anything */
+ vol->flags &= ~VF_NEWBORN; /* no longer newly born */
for (parameter = 2; parameter < tokens; parameter++) { /* look at all tokens */
switch (get_keyword(token[parameter], &keyword_set)) {
@@ -1309,9 +1319,8 @@ config_volume(void)
*
* Return 0 if all is well, otherwise EINVAL */
int
-parse_config(char *cptr, struct keywordset *keyset)
+parse_config(char *cptr, struct keywordset *keyset, int update)
{
- BROKEN_GDB;
int status;
status = 0; /* until proven otherwise */
@@ -1325,32 +1334,23 @@ parse_config(char *cptr, struct keywordset *keyset)
switch (get_keyword(token[0], keyset)) { /* decide what to do */
case kw_read: /* read config from a specified drive */
- vinum_conf.flags |= VF_KERNELOP | VF_READING_CONFIG; /* kernel operation: reading config */
- status = check_drive(token[1]); /* check the drive info */
- vinum_conf.flags &= ~(VF_KERNELOP | VF_READING_CONFIG);
- if (status != 0) {
- char *msg = "Can't read configuration from %s";
- if (status == ENODEV)
- msg = "No vinum configuration on %s";
- throw_rude_remark(status, msg, token[1]);
- }
- updateconfig(VF_KERNELOP); /* update from kernel space */
+ vinum_scandisk(&token[1], tokens - 1); /* read the config from disk */
break;
case kw_drive:
- config_drive();
+ config_drive(update);
break;
case kw_subdisk:
- config_subdisk();
+ config_subdisk(update);
break;
case kw_plex:
- config_plex();
+ config_plex(update);
break;
case kw_volume:
- config_volume();
+ config_volume(update);
break;
/* Anything else is invalid in this context */
@@ -1372,11 +1372,10 @@ parse_config(char *cptr, struct keywordset *keyset)
int
parse_user_config(char *cptr, struct keywordset *keyset)
{
- BROKEN_GDB;
int status;
ioctl_reply = (struct _ioctl_reply *) cptr;
- status = parse_config(cptr, keyset);
+ status = parse_config(cptr, keyset, 0);
ioctl_reply = NULL; /* don't do this again */
return status;
}
@@ -1436,6 +1435,7 @@ remove_drive_entry(int driveno, int force, int recurse)
for (sdno = 0; sdno < vinum_conf.subdisks_used; sdno++) {
if ((SD[sdno].state != sd_unallocated) /* subdisk is allocated */
&&(SD[sdno].driveno == driveno)) { /* and it belongs to this drive */
+ sdmsg.index = sdno;
sdmsg.type = sd_object;
sdmsg.recurse = 1;
sdmsg.force = force;
@@ -1478,14 +1478,18 @@ remove_sd_entry(int sdno, int force, int recurse)
* RAID-5 plex really tears the hell out
* of the structure, and it needs to be
* reinitialized */
+ /* XXX Think about this. Maybe we should just
+ * leave a hole */
if (plex->organization != plex_concat) /* not concatenated, */
set_plex_state(plex->plexno, plex_faulty, setstate_force); /* need to reinitialize */
- rebuild_plex_unmappedlist(plex); /* and see what remains */
+ printf("vinum: removing %s\n", sd->name);
free_sd(sdno);
} else
ioctl_reply->error = EBUSY; /* can't do that */
- } else
+ } else {
+ printf("vinum: removing %s\n", sd->name);
free_sd(sdno);
+ }
}
/* remove a plex */
@@ -1541,6 +1545,7 @@ remove_plex_entry(int plexno, int force, int recurse)
return;
}
}
+ printf("vinum: removing %s\n", plex->name);
free_plex(plexno);
}
@@ -1568,25 +1573,28 @@ remove_volume_entry(int volno, int force, int recurse)
plexmsg.index = vol->plex[plexno]; /* plex number */
remove(&plexmsg);
}
+ printf("vinum: removing %s\n", vol->name);
free_volume(volno);
} else
ioctl_reply->error = EBUSY; /* can't do that */
- } else
+ } else {
+ printf("vinum: removing %s\n", vol->name);
free_volume(volno);
+ }
}
void
update_sd_config(int sdno, int kernelstate)
{
if (!kernelstate)
- set_sd_state(sdno, sd_up, setstate_configuring | setstate_norecurse);
+ set_sd_state(sdno, sd_up, setstate_configuring);
}
void
update_plex_config(int plexno, int kernelstate)
{
int error = 0;
- int size;
+ u_int64_t size;
int sdno;
struct plex *plex = &PLEX[plexno];
enum plexstate state = plex_up; /* state we want the plex in */
@@ -1603,7 +1611,7 @@ update_plex_config(int plexno, int kernelstate)
error = 1;
printf("vinum: plex %s does not have at least 2 subdisks\n", plex->name);
if (!kernelstate)
- set_plex_state(plexno, plex_down, setstate_force | setstate_configuring | setstate_norecurse);
+ set_plex_state(plexno, plex_down, setstate_force | setstate_configuring);
}
size = 0;
for (sdno = 0; sdno < plex->subdisks; sdno++) {
@@ -1612,22 +1620,24 @@ update_plex_config(int plexno, int kernelstate)
&& (sdno > 0)
&& (SD[plex->sdnos[sdno]].sectors != SD[plex->sdnos[sdno - 1]].sectors)) {
error = 1;
- printf("vinum: plex %s must have equal sized subdisks\n", plex->name);
- set_plex_state(plexno, plex_down, setstate_force | setstate_configuring | setstate_norecurse);
+ printf("vinum: %s must have equal sized subdisks\n", plex->name);
+ set_plex_state(plexno, plex_down, setstate_force | setstate_configuring);
}
size += SD[plex->sdnos[sdno]].sectors;
}
if (plex->subdisks) { /* plex has subdisks, calculate size */
- rebuild_plex_unmappedlist(plex); /* rebuild the unmapped list first */
-
+ /* XXX We shouldn't need to calculate the size any
+ * more. Check this some time */
+ if (plex->length != size)
+ printf("Correcting length of %s: was %qd, is %qd\n", plex->name, plex->length, size);
plex->length = size;
} else { /* no subdisks, */
plex->length = 0; /* no size */
state = plex_down; /* take it down */
}
if (!(kernelstate || error))
- set_plex_state(plexno, state, setstate_none | setstate_configuring | setstate_norecurse);
+ set_plex_state(plexno, state, setstate_none | setstate_configuring);
}
void
@@ -1648,7 +1658,7 @@ update_volume_config(int volno, int kernelstate)
}
}
if (!kernelstate) /* try to bring it up */
- set_volume_state(volno, volume_up, setstate_configuring | setstate_norecurse);
+ set_volume_state(volno, volume_up, setstate_configuring);
}
/* Update the global configuration.
@@ -1661,21 +1671,17 @@ update_volume_config(int volno, int kernelstate)
void
updateconfig(int kernelstate)
{
- BROKEN_GDB;
- int sdno;
int plexno;
int volno;
- struct volume *vol;
- struct plex *plex;
- for (sdno = 0; sdno < vinum_conf.subdisks_used; sdno++)
- update_sd_config(sdno, kernelstate);
for (plexno = 0; plexno < vinum_conf.plexes_used; plexno++)
update_plex_config(plexno, kernelstate);
- for (volno = 0; volno < vinum_conf.volumes_used; volno++)
- update_volume_config(volno, kernelstate);
+ for (volno = 0; volno < vinum_conf.volumes_used; volno++) {
+ VOL[volno].flags &= ~VF_CONFIG_SETUPSTATE; /* no more setupstate */
+ set_volume_state(volno, volume_up, setstate_configuring);
+ }
save_config();
}
@@ -1693,7 +1699,7 @@ start_config(void)
return error;
}
/* We need two flags here: VF_CONFIGURING
- * tells other processes to hold off (this
+ * tells other processes to hold off (this
* function), and VF_CONFIG_INCOMPLETE
* tells the state change routines not to
* propagate incrememntal state changes */
OpenPOWER on IntegriCloud