Skip to content

Commit

Permalink
dm mpath: use more error codes
Browse files Browse the repository at this point in the history
This patch allows path errors from the multipath ctr function to
propagate up to userspace as errno values from the ioctl() call.

This is in response to
  https://www.redhat.com/archives/dm-devel/2008-May/msg00000.html
and
  https://bugzilla.redhat.com/show_bug.cgi?id=444421

The patch only lets through the errors that it needs to in order to
get the path errors from parse_path().

Signed-off-by: Benjamin Marzinski <[email protected]>
Signed-off-by: Alasdair G Kergon <[email protected]>
  • Loading branch information
bmarzins authored and kergon committed Oct 10, 2008
1 parent 3fa8749 commit 01460f3
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions drivers/md/dm-mpath.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,12 +563,12 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
/* we need at least a path arg */
if (as->argc < 1) {
ti->error = "no device given";
return NULL;
return ERR_PTR(-EINVAL);
}

p = alloc_pgpath();
if (!p)
return NULL;
return ERR_PTR(-ENOMEM);

r = dm_get_device(ti, shift(as), ti->begin, ti->len,
dm_table_get_mode(ti->table), &p->path.dev);
Expand Down Expand Up @@ -596,7 +596,7 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,

bad:
free_pgpath(p);
return NULL;
return ERR_PTR(r);
}

static struct priority_group *parse_priority_group(struct arg_set *as,
Expand All @@ -614,14 +614,14 @@ static struct priority_group *parse_priority_group(struct arg_set *as,

if (as->argc < 2) {
as->argc = 0;
ti->error = "not enough priority group aruments";
return NULL;
ti->error = "not enough priority group arguments";
return ERR_PTR(-EINVAL);
}

pg = alloc_priority_group();
if (!pg) {
ti->error = "couldn't allocate priority group";
return NULL;
return ERR_PTR(-ENOMEM);
}
pg->m = m;

Expand Down Expand Up @@ -654,8 +654,10 @@ static struct priority_group *parse_priority_group(struct arg_set *as,
path_args.argv = as->argv;

pgpath = parse_path(&path_args, &pg->ps, ti);
if (!pgpath)
if (IS_ERR(pgpath)) {
r = PTR_ERR(pgpath);
goto bad;
}

pgpath->pg = pg;
list_add_tail(&pgpath->list, &pg->pgpaths);
Expand All @@ -666,7 +668,7 @@ static struct priority_group *parse_priority_group(struct arg_set *as,

bad:
free_priority_group(pg, ti);
return NULL;
return ERR_PTR(r);
}

static int parse_hw_handler(struct arg_set *as, struct multipath *m)
Expand Down Expand Up @@ -785,8 +787,8 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc,
struct priority_group *pg;

pg = parse_priority_group(&as, m);
if (!pg) {
r = -EINVAL;
if (IS_ERR(pg)) {
r = PTR_ERR(pg);
goto bad;
}

Expand Down

0 comments on commit 01460f3

Please sign in to comment.