diff options
author | grog <grog@FreeBSD.org> | 2003-05-05 05:32:52 +0000 |
---|---|---|
committer | grog <grog@FreeBSD.org> | 2003-05-05 05:32:52 +0000 |
commit | 6b74835fffdefce28a29b87d4df3434d62d4004f (patch) | |
tree | 39d9561fc5e45e1e8a7f560a9df2f6a61e6ba07d | |
parent | 27e027d2550b37d82342cefa0ea529a02133d007 (diff) | |
download | FreeBSD-src-6b74835fffdefce28a29b87d4df3434d62d4004f.zip FreeBSD-src-6b74835fffdefce28a29b87d4df3434d62d4004f.tar.gz |
vinum_scandisk: Make sure the config is locked before we mess around
with it.
Finally implement read policies. The previous "implementation" didn't
work because it referred to plexes which were almost invariably when
referred to. Instead, deprecate the "prefer" keyword for volumes
(though it's still there for the moment) and add a keyword "preferred"
to the plex definition. The relationship is like this:
Old:
vol foo ... prefer foo.p3
New:
plex foo.p3 volume foo preferred
print_config: Print "preferred" where appropriate.
No longer print "prefer" on volume config entries.
-rw-r--r-- | sys/dev/vinum/vinumio.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/sys/dev/vinum/vinumio.c b/sys/dev/vinum/vinumio.c index 3b31f6e..9f4b01c 100644 --- a/sys/dev/vinum/vinumio.c +++ b/sys/dev/vinum/vinumio.c @@ -33,7 +33,7 @@ * otherwise) arising in any way out of the use of this software, even if * advised of the possibility of such damage. * - * $Id: vinumio.c,v 1.36 2003/04/28 02:54:07 grog Exp $ + * $Id: vinumio.c,v 1.37 2003/05/04 05:23:42 grog Exp grog $ * $FreeBSD$ */ @@ -408,13 +408,6 @@ format_config(char *config, int len) volume_state(vol->state)); while (*s) s++; /* find the end */ - if (vol->preferred_plex >= 0) /* preferences, */ - snprintf(s, - configend - s, - " readpol prefer %s", - vinum_conf.plex[vol->preferred_plex].name); - while (*s) - s++; /* find the end */ s = sappend("\n", s); } } @@ -422,6 +415,7 @@ format_config(char *config, int len) /* Then the plex configuration */ for (i = 0; i < vinum_conf.plexes_allocated; i++) { struct plex *plex; + struct volume *vol; plex = &vinum_conf.plex[i]; if ((plex->state > plex_referenced) @@ -442,13 +436,20 @@ format_config(char *config, int len) while (*s) s++; /* find the end */ } - if (plex->volno >= 0) /* we have a volume */ + if (plex->volno >= 0) { /* we have a volume */ + vol = &VOL[plex->volno]; snprintf(s, configend - s, "vol %s ", - vinum_conf.volume[plex->volno].name); - while (*s) - s++; /* find the end */ + vol->name); + while (*s) + s++; /* find the end */ + if ((vol->preferred_plex >= 0) /* has a preferred plex */ + &&vol->plex[vol->preferred_plex] == i) /* and it's us */ + snprintf(s, configend - s, "preferred "); + while (*s) + s++; /* find the end */ + } for (j = 0; j < plex->subdisks; j++) { snprintf(s, configend - s, @@ -776,12 +777,10 @@ vinum_scandisk(char *devicename) return ENOMEM; } else malloced = 1; - /* Now det the list of disks */ + /* Now get the list of disks */ kernel_sysctlbyname(&thread0, "kern.disks", devicename, &alloclen, NULL, 0, NULL); } - printf("vinum_scandisk: devicename is %s\n", devicename); /* XXX */ - status = 0; /* success indication */ vinum_conf.flags |= VF_READING_CONFIG; /* reading config from disk */ partname = Malloc(MAXPATHLEN); /* extract name of disk here */ @@ -797,6 +796,12 @@ vinum_scandisk(char *devicename) drives = 256; /* should be enough for most cases */ drivelist = (int *) Malloc(drives * sizeof(int)); CHECKALLOC(drivelist, "Can't allocate memory"); + error = lock_config(); /* make sure we're alone here */ + if (error) + return error; + error = setjmp(command_fail); /* come back here on error */ + if (error) /* longjmped out */ + return error; /* Open all drives and find which was modified most recently */ for (cp = devicename; *cp; cp = ep) { @@ -883,6 +888,7 @@ vinum_scandisk(char *devicename) log(LOG_INFO, "vinum: no additional drives found\n"); if (malloced) Free(devicename); + unlock_config(); return ENOENT; } /* @@ -966,6 +972,7 @@ vinum_scandisk(char *devicename) updateconfig(VF_READING_CONFIG); /* update from disk config */ if (malloced) Free(devicename); + unlock_config(); return status; } |