summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorgrog <grog@FreeBSD.org>2003-05-05 05:32:15 +0000
committergrog <grog@FreeBSD.org>2003-05-05 05:32:15 +0000
commit27e027d2550b37d82342cefa0ea529a02133d007 (patch)
tree8240d99dab4842b4360e900918f4e92d10970e24 /sys
parentd986a99a30c646b33824dd55f07bd360241501d3 (diff)
downloadFreeBSD-src-27e027d2550b37d82342cefa0ea529a02133d007.zip
FreeBSD-src-27e027d2550b37d82342cefa0ea529a02133d007.tar.gz
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 give_plex_to_volume: set preferred plex if specified on plex definition entry. This involves adding a parameter to the function to specify the preferred plex. config_plex: Implement preferred keyword.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/vinum/vinumconfig.c74
1 files changed, 52 insertions, 22 deletions
diff --git a/sys/dev/vinum/vinumconfig.c b/sys/dev/vinum/vinumconfig.c
index 885201a..3181b8d 100644
--- a/sys/dev/vinum/vinumconfig.c
+++ b/sys/dev/vinum/vinumconfig.c
@@ -33,12 +33,13 @@
* otherwise) arising in any way out of the use of this software, even if
* advised of the possibility of such damage.
*
- * $Id: vinumconfig.c,v 1.38 2003/04/28 02:54:07 grog Exp $
+ * $Id: vinumconfig.c,v 1.39 2003/05/04 05:22:46 grog Exp grog $
* $FreeBSD$
*/
#define STATIC static
+#include <sys/reboot.h> /* XXX */
#include <dev/vinum/vinumhdr.h>
#include <dev/vinum/request.h>
@@ -175,10 +176,11 @@ my_sd(int plexno, int sdno)
/* Add plex to the volume if possible */
int
-give_plex_to_volume(int volno, int plexno)
+give_plex_to_volume(int volno, int plexno, int preferme)
{
struct volume *vol;
int i;
+ int volplexno;
/*
* It's not an error for the plex to already
@@ -186,25 +188,34 @@ give_plex_to_volume(int volno, int plexno)
* number of things to make sure it's done right.
* Some day.
*/
- if (my_plex(volno, plexno) >= 0)
- return plexno; /* that's it */
-
+ volplexno = my_plex(volno, plexno);
vol = &VOL[volno]; /* point to volume */
- if (vol->plexes == MAXPLEX) /* all plexes allocated */
- 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 */
-
- /* Find out how big our volume is */
- for (i = 0; i < vol->plexes; i++)
- vol->size = max(vol->size, PLEX[vol->plex[i]].length);
- return vol->plexes - 1; /* and return its index */
+ if (volplexno < 0) {
+ if (vol->plexes == MAXPLEX) /* all plexes allocated */
+ 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 our subdisks invalid */
+ vol->plex[vol->plexes] = plexno; /* this one */
+ vol->plexes++; /* add another plex */
+ PLEX[plexno].volno = volno; /* note the number of our volume */
+
+ /* Find out how big our volume is */
+ for (i = 0; i < vol->plexes; i++)
+ vol->size = max(vol->size, PLEX[vol->plex[i]].length);
+ volplexno = vol->plexes - 1; /* number of plex in volume */
+ }
+ if (preferme) {
+ if (vol->preferred_plex > 0) /* already had a facourite, */
+ printf("vinum: changing preferred plex for %s from %s to %s\n",
+ vol->name,
+ PLEX[vol->plex[vol->preferred_plex]].name,
+ PLEX[plexno].name);
+ vol->preferred_plex = volplexno;
+ }
+ return volplexno;
}
/*
@@ -1261,8 +1272,10 @@ config_plex(int update)
int detached = 0; /* don't give it to a volume */
int namedplexno;
enum plexstate state = plex_init; /* state to set at end */
+ int preferme; /* set if we want to be preferred access */
current_plex = -1; /* forget the previous plex */
+ preferme = 0; /* nothing special yet */
plexno = get_empty_plex(); /* allocate a plex */
plex = &PLEX[plexno]; /* and point to it */
plex->plexno = plexno; /* and back to the config */
@@ -1366,6 +1379,17 @@ config_plex(int update)
throw_rude_remark(EINVAL, "Need a stripe size parameter");
break;
+ /*
+ * We're the preferred plex of our volume.
+ * Unfortunately, we don't know who our
+ * volume is yet. Note that we want to be
+ * preferred, and actually do it after we
+ * get a volume.
+ */
+ case kw_preferred:
+ preferme = 1;
+ break;
+
case kw_volume:
plex->volno = find_volume(token[++parameter], 1); /* insert a pointer to the volume */
break;
@@ -1401,7 +1425,9 @@ config_plex(int update)
plex->volno = current_volume;
if (plex->volno >= 0)
- pindex = give_plex_to_volume(plex->volno, plexno); /* Now tell the volume that it has this plex */
+ pindex = give_plex_to_volume(plex->volno, /* Now tell the volume that it has this plex */
+ plexno,
+ preferme);
/* Does the plex have a name? If not, give it one */
if (plex->name[0] == '\0') { /* no name */
@@ -1494,8 +1520,12 @@ config_volume(int update)
int myplexno; /* index of this plex */
myplexno = find_plex(token[++parameter], 1); /* find a plex */
- if (myplexno < 0) /* couldn't */
+ if (myplexno < 0) { /* couldn't */
+ printf("vinum: couldn't find preferred plex %s for %s\n",
+ token[parameter],
+ vol->name);
break; /* we've already had an error message */
+ }
myplexno = my_plex(volno, myplexno); /* does it already belong to us? */
if (myplexno > 0) /* yes */
vol->preferred_plex = myplexno; /* just note the index */
OpenPOWER on IntegriCloud