[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[dm-devel] [PATCH RFC 0/1] async path-selector initialization
- From: Mike Christie <michaelc cs wisc edu>
- To: dm-devel redhat com, Joe Thornber <thornber redhat com>
- Cc:
- Subject: [dm-devel] [PATCH RFC 0/1] async path-selector initialization
- Date: Wed, 21 Apr 2004 00:09:43 -0700
01-ps-args.patch - enables a path-selector to be able to get selector
wide arguments - vs path level args. (the interface for the status function
still needs work)
diffstat 01-ps-args.patch
dm-mpath.c | 65 ++++++++++++++++++++++++++++++++++++-----------------
dm-path-selector.c | 59 ++++++++++++++++++++++++++++++++----------------
dm-path-selector.h | 17 ++++++++-----
3 files changed, 96 insertions(+), 45 deletions(-)
diff -arup linux-2.6.5-orig/drivers/md/dm-mpath.c linux-2.6.5-psargs/drivers/md/dm-mpath.c
--- linux-2.6.5-orig/drivers/md/dm-mpath.c 2004-04-18 20:34:44.000000000 -0700
+++ linux-2.6.5-psargs/drivers/md/dm-mpath.c 2004-04-18 22:29:27.991470346 -0700
@@ -324,8 +324,8 @@ static void trigger_event(void *data)
/*-----------------------------------------------------------------
* Constructor/argument parsing:
- * <num priority groups> [<selector>
- * <num paths> <num selector args> [<path> [<arg>]* ]+ ]+
+ * <num priority groups> [<selector> <num selector args> [<arg>]*
+ * <num path args> <num paths> [<path> [<arg>]* ]+ ]+
*---------------------------------------------------------------*/
struct param {
unsigned min;
@@ -420,7 +420,7 @@ static struct priority_group *parse_prio
};
int r;
- unsigned i, nr_selector_args, nr_params;
+ unsigned i, nr_args;
struct priority_group *pg;
struct path_selector_type *pst;
@@ -443,34 +443,47 @@ static struct priority_group *parse_prio
goto bad;
}
- r = pst->ctr(pg->ps);
+ /*
+ * nr selector args
+ */
+ r = read_param(_params + 1, shift(as), &nr_args, &ti->error);
+ if (r)
+ goto bad;
+ if (as->argc < nr_args)
+ goto bad;
+
+ r = pst->ctr(pg->ps, nr_args, as->argv, &ti->error);
if (r) {
/* FIXME: need to put the pst ? fix after
* factoring out the register */
goto bad;
}
pg->ps->type = pst;
+ consume(as, nr_args);
/*
- * read the paths
+ * nr path args
*/
- r = read_param(_params, shift(as), &pg->nr_paths, &ti->error);
+ r = read_param(_params + 1, shift(as), &nr_args, &ti->error);
if (r)
goto bad;
- r = read_param(_params + 1, shift(as), &nr_selector_args, &ti->error);
+ /*
+ * read the paths
+ */
+ r = read_param(_params, shift(as), &pg->nr_paths, &ti->error);
if (r)
goto bad;
- nr_params = 1 + nr_selector_args;
+ nr_args += 1;
for (i = 0; i < pg->nr_paths; i++) {
struct path *path;
struct arg_set path_args;
- if (as->argc < nr_params)
+ if (as->argc < nr_args)
goto bad;
- path_args.argc = nr_params;
+ path_args.argc = nr_args;
path_args.argv = as->argv;
path = parse_path(&path_args, pg->ps, ti);
@@ -479,7 +492,7 @@ static struct priority_group *parse_prio
path->pg = pg;
list_add_tail(&path->list, &pg->paths);
- consume(as, nr_params);
+ consume(as, nr_args);
}
return pg;
@@ -617,10 +630,11 @@ static int multipath_end_io(struct dm_ta
/*
* Info string has the following format:
- * num_groups [num_paths num_selector_args [path_dev A|F fail_count [selector_args]* ]+ ]+
+ * num_groups [[selector_args]* num_paths [path_dev A|F fail_count [path_args]* ]+ ]+
*
* Table string has the following format (identical to the constructor string):
- * num_groups [priority selector-name num_paths num_selector_args [path_dev [selector_args]* ]+ ]+
+ * num_groups [selector-name num_selector_args [selector_args]* num_path_args num_paths
+ * [path_dev [path_args]* ]+ ]+
*/
static int multipath_status(struct dm_target *ti, status_type_t type,
char *result, unsigned int maxlen)
@@ -630,6 +644,7 @@ static int multipath_status(struct dm_ta
struct priority_group *pg;
struct path *p;
char buffer[32];
+ struct path_selector_type *pst;
#define EMIT(x...) sz += ((sz >= maxlen) ? \
0 : scnprintf(result + sz, maxlen - sz, x))
@@ -639,13 +654,18 @@ static int multipath_status(struct dm_ta
EMIT("%u ", m->nr_priority_groups);
list_for_each_entry(pg, &m->priority_groups, list) {
- EMIT("%u %u ", pg->nr_paths, pg->ps->type->info_args);
+ pst = pg->ps->type;
+
+ sz += pst->ps_status(pg->ps, type, result + sz,
+ maxlen - sz);
+ EMIT("%u ", pg->nr_paths);
list_for_each_entry(p, &pg->paths, list) {
format_dev_t(buffer, p->dev->bdev->bd_dev);
EMIT("%s ", buffer);
- sz += pg->ps->type->status(pg->ps, p, type,
- result + sz, maxlen - sz);
+ sz += pst->path_status(pg->ps, p, type,
+ result + sz,
+ maxlen - sz);
}
}
break;
@@ -654,14 +674,19 @@ static int multipath_status(struct dm_ta
EMIT("%u ", m->nr_priority_groups);
list_for_each_entry(pg, &m->priority_groups, list) {
- EMIT("%s %u %u ", pg->ps->type->name,
- pg->nr_paths, pg->ps->type->table_args);
+ pst = pg->ps->type;
+
+ EMIT("%s ", pst->name);
+ sz += pst->ps_status(pg->ps, type, result + sz,
+ maxlen - sz);
+ EMIT("%u ", pg->nr_paths);
list_for_each_entry(p, &pg->paths, list) {
format_dev_t(buffer, p->dev->bdev->bd_dev);
EMIT("%s ", buffer);
- pg->ps->type->status(pg->ps, p, type,
- result + sz, maxlen - sz);
+ sz += pst->path_status(pg->ps, p, type,
+ result + sz,
+ maxlen - sz);
}
}
diff -arup linux-2.6.5-orig/drivers/md/dm-path-selector.c linux-2.6.5-psargs/drivers/md/dm-path-selector.c
--- linux-2.6.5-orig/drivers/md/dm-path-selector.c 2004-04-18 20:34:44.000000000 -0700
+++ linux-2.6.5-psargs/drivers/md/dm-path-selector.c 2004-04-18 22:15:13.867049131 -0700
@@ -174,10 +174,17 @@ static struct selector *alloc_selector(v
}
/* Path selector constructor */
-static int rr_ctr(struct path_selector *ps)
+static int rr_ctr(struct path_selector *ps, int argc, char **argv,
+ char **error)
{
struct selector *s;
+ /* parse the path-selector arguments */
+ if (argc != 0) {
+ *error = "round-robin ps: incorrect number of arguments";
+ return -EINVAL;
+ }
+
s = alloc_selector();
if (!s)
return -ENOMEM;
@@ -273,8 +280,8 @@ static struct path *rr_select_path(struc
}
/* Path status */
-static int rr_status(struct path_selector *ps, struct path *path,
- status_type_t type, char *result, unsigned int maxlen)
+static int rr_path_status(struct path_selector *ps, struct path *path,
+ status_type_t type, char *result, unsigned int maxlen)
{
unsigned long flags;
struct path_info *pi;
@@ -282,26 +289,39 @@ static int rr_status(struct path_selecto
struct selector *s = (struct selector *) ps->context;
int sz = 0;
- if (type == STATUSTYPE_TABLE)
- return 0;
+ if (type == STATUSTYPE_INFO) {
- spin_lock_irqsave(&s->lock, flags);
+ spin_lock_irqsave(&s->lock, flags);
- /*
- * Is status called often for testing or something?
- * If so maybe a ps's info should be allocated w/ path
- * so a simple container_of can be used.
- */
- pi = path_lookup(&s->valid_paths, path);
- if (!pi) {
- failed = 1;
- pi = path_lookup(&s->invalid_paths, path);
+ /*
+ * Is status called often for testing or something?
+ * If so maybe a ps's info should be allocated w/ path
+ * so a simple container_of can be used.
+ */
+ pi = path_lookup(&s->valid_paths, path);
+ if (!pi) {
+ failed = 1;
+ pi = path_lookup(&s->invalid_paths, path);
+ }
+
+ sz = scnprintf(result, maxlen, "%s %u ", failed ? "F" : "A",
+ pi->fail_count);
+
+ spin_unlock_irqrestore(&s->lock, flags);
}
- sz = scnprintf(result, maxlen, "%s %u ", failed ? "F" : "A",
- pi->fail_count);
+ return sz;
+}
- spin_unlock_irqrestore(&s->lock, flags);
+/* path selector status */
+static int rr_ps_status(struct path_selector *ps, status_type_t type,
+ char *result, unsigned int maxlen)
+{
+ int sz = 0;
+
+ if (type == STATUSTYPE_TABLE)
+ /* <num selector args> [<arg>]* <num path args> */
+ sz = scnprintf(result, maxlen, "0 0 ");
return sz;
}
@@ -315,7 +335,8 @@ static struct path_selector_type rr_ps =
.add_path = rr_add_path,
.update_path = rr_update_path,
.select_path = rr_select_path,
- .status = rr_status,
+ .ps_status = rr_ps_status,
+ .path_status = rr_path_status,
};
/*
diff -arup linux-2.6.5-orig/drivers/md/dm-path-selector.h linux-2.6.5-psargs/drivers/md/dm-path-selector.h
--- linux-2.6.5-orig/drivers/md/dm-path-selector.h 2004-04-18 20:34:44.000000000 -0700
+++ linux-2.6.5-psargs/drivers/md/dm-path-selector.h 2004-04-18 22:13:27.980742649 -0700
@@ -31,7 +31,8 @@ struct path_selector {
/*
* Constructs a path selector object, takes custom arguments
*/
-typedef int (*ps_ctr_fn) (struct path_selector *ps);
+typedef int (*ps_ctr_fn) (struct path_selector *ps, int argc, char **argv,
+ char **error);
typedef void (*ps_dtr_fn) (struct path_selector *ps);
/*
@@ -69,10 +70,13 @@ typedef void (*ps_update_path_fn) (struc
* Table content based on parameters added in ps_add_path_fn
* or path selector status
*/
-typedef int (*ps_status_fn) (struct path_selector *ps,
- struct path *path,
- status_type_t type,
- char *result, unsigned int maxlen);
+typedef int (*ps_path_status_fn) (struct path_selector *ps,
+ struct path *path,
+ status_type_t type,
+ char *result, unsigned int maxlen);
+typedef int (*ps_selector_status_fn) (struct path_selector *ps,
+ status_type_t type,
+ char *result, unsigned int maxlen);
/* Information about a path selector type */
struct path_selector_type {
@@ -86,7 +90,8 @@ struct path_selector_type {
ps_add_path_fn add_path;
ps_update_path_fn update_path;
ps_select_path_fn select_path;
- ps_status_fn status;
+ ps_path_status_fn path_status;
+ ps_selector_status_fn ps_status;
};
/*
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]