[dm-devel] [PATCH] dm-mpath: propage path errors up through the multipath ctr function

Benjamin Marzinski bmarzins at redhat.com
Tue Jun 24 19:51:35 UTC 2008


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().  It's possible that there are
other errors worth progatating that this leaves out.

The patch was built against the  2.6.26-rc3 kernel.

-Ben

Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
---
 dm-mpath.c |   20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

Index: linux-2.6.25.i686/drivers/md/dm-mpath.c
===================================================================
--- linux-2.6.25.i686.orig/drivers/md/dm-mpath.c
+++ linux-2.6.25.i686/drivers/md/dm-mpath.c
@@ -555,12 +555,12 @@ static struct pgpath *parse_path(struct 
 	/* 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);
@@ -579,7 +579,7 @@ static struct pgpath *parse_path(struct 
 
  bad:
 	free_pgpath(p);
-	return NULL;
+	return ERR_PTR(r);
 }
 
 static struct priority_group *parse_priority_group(struct arg_set *as,
@@ -598,13 +598,13 @@ static struct priority_group *parse_prio
 	if (as->argc < 2) {
 		as->argc = 0;
 		ti->error = "not enough priority group aruments";
-		return NULL;
+		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;
 
@@ -635,8 +635,10 @@ static struct priority_group *parse_prio
 		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);
@@ -647,7 +649,7 @@ static struct priority_group *parse_prio
 
  bad:
 	free_priority_group(pg, ti);
-	return NULL;
+	return ERR_PTR(r);
 }
 
 static int parse_hw_handler(struct arg_set *as, struct multipath *m)
@@ -778,8 +780,8 @@ static int multipath_ctr(struct dm_targe
 		struct priority_group *pg;
 
 		pg = parse_priority_group(&as, m);
-		if (!pg) {
-			r = -EINVAL;
+		if (IS_ERR(pg)) {
+			r = PTR_ERR(pg);
 			goto bad;
 		}
 




More information about the dm-devel mailing list