From 780bedeaa596bd644473243906cd7eac2a5845f4 Mon Sep 17 00:00:00 2001 From: Greg Lehey Date: Mon, 5 May 2003 05:32:15 +0000 Subject: [PATCH] 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. --- sys/dev/vinum/vinumconfig.c | 72 ++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/sys/dev/vinum/vinumconfig.c b/sys/dev/vinum/vinumconfig.c index 885201af7c0..3181b8dd2ad 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 /* XXX */ #include #include @@ -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 */ + 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); - return vol->plexes - 1; /* and return its index */ + /* 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 */