dm: do not override error code returned from dm_get_device()
authorVivek Goyal <vgoyal@redhat.com>
Fri, 31 Jul 2015 13:20:36 +0000 (09:20 -0400)
committerMike Snitzer <snitzer@redhat.com>
Wed, 12 Aug 2015 15:32:21 +0000 (11:32 -0400)
Some of the device mapper targets override the error code returned by
dm_get_device() and return either -EINVAL or -ENXIO.  There is nothing
gained by this override.  It is better to propagate the returned error
code unchanged to caller.

This work was motivated by hitting an issue where the underlying device
was busy but -EINVAL was being returned.  After this change we get
-EBUSY instead and it is easier to figure out the problem.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-crypt.c
drivers/md/dm-delay.c
drivers/md/dm-flakey.c
drivers/md/dm-linear.c
drivers/md/dm-log-writes.c
drivers/md/dm-raid1.c
drivers/md/dm-stripe.c

index 0f48fed44a17f6ee9f36967c3be979c1e20fe7b5..9a75d462b3fbeb0d44f72da613b6a9254550d6b6 100644 (file)
@@ -1811,11 +1811,13 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        }
        cc->iv_offset = tmpll;
 
-       if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev)) {
+       ret = dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev);
+       if (ret) {
                ti->error = "Device lookup failed";
                goto bad;
        }
 
+       ret = -EINVAL;
        if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1) {
                ti->error = "Invalid device sector";
                goto bad;
index 57b6a1901c917127eccb8247cd1015a9b588159e..b34f6e27293dcc9e408289c7955af921b4cb8990 100644 (file)
@@ -129,6 +129,7 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        struct delay_c *dc;
        unsigned long long tmpll;
        char dummy;
+       int ret;
 
        if (argc != 3 && argc != 6) {
                ti->error = "requires exactly 3 or 6 arguments";
@@ -143,6 +144,7 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
        dc->reads = dc->writes = 0;
 
+       ret = -EINVAL;
        if (sscanf(argv[1], "%llu%c", &tmpll, &dummy) != 1) {
                ti->error = "Invalid device sector";
                goto bad;
@@ -154,12 +156,14 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
                goto bad;
        }
 
-       if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
-                         &dc->dev_read)) {
+       ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
+                           &dc->dev_read);
+       if (ret) {
                ti->error = "Device lookup failed";
                goto bad;
        }
 
+       ret = -EINVAL;
        dc->dev_write = NULL;
        if (argc == 3)
                goto out;
@@ -175,13 +179,15 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
                goto bad_dev_read;
        }
 
-       if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table),
-                         &dc->dev_write)) {
+       ret = dm_get_device(ti, argv[3], dm_table_get_mode(ti->table),
+                           &dc->dev_write);
+       if (ret) {
                ti->error = "Write device lookup failed";
                goto bad_dev_read;
        }
 
 out:
+       ret = -EINVAL;
        dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0);
        if (!dc->kdelayd_wq) {
                DMERR("Couldn't start kdelayd");
@@ -208,7 +214,7 @@ bad_dev_read:
        dm_put_device(ti, dc->dev_read);
 bad:
        kfree(dc);
-       return -EINVAL;
+       return ret;
 }
 
 static void delay_dtr(struct dm_target *ti)
index b257e46876d357f831bf1c751010d5b16fa125b8..ffb994527bcfdbabd125f6b9e6aec92977ab7b70 100644 (file)
@@ -183,6 +183,7 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
        devname = dm_shift_arg(&as);
 
+       r = -EINVAL;
        if (sscanf(dm_shift_arg(&as), "%llu%c", &tmpll, &dummy) != 1) {
                ti->error = "Invalid device sector";
                goto bad;
@@ -211,7 +212,8 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        if (r)
                goto bad;
 
-       if (dm_get_device(ti, devname, dm_table_get_mode(ti->table), &fc->dev)) {
+       r = dm_get_device(ti, devname, dm_table_get_mode(ti->table), &fc->dev);
+       if (r) {
                ti->error = "Device lookup failed";
                goto bad;
        }
@@ -224,7 +226,7 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
 bad:
        kfree(fc);
-       return -EINVAL;
+       return r;
 }
 
 static void flakey_dtr(struct dm_target *ti)
index 53e848c1093936560a9554c9fdacbec2f6dae5bd..62c26e4ad6ac138f82a2933c0eca62d90a90f406 100644 (file)
@@ -30,6 +30,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        struct linear_c *lc;
        unsigned long long tmp;
        char dummy;
+       int ret;
 
        if (argc != 2) {
                ti->error = "Invalid argument count";
@@ -42,13 +43,15 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
                return -ENOMEM;
        }
 
+       ret = -EINVAL;
        if (sscanf(argv[1], "%llu%c", &tmp, &dummy) != 1) {
                ti->error = "dm-linear: Invalid device sector";
                goto bad;
        }
        lc->start = tmp;
 
-       if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &lc->dev)) {
+       ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &lc->dev);
+       if (ret) {
                ti->error = "dm-linear: Device lookup failed";
                goto bad;
        }
@@ -61,7 +64,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
       bad:
        kfree(lc);
-       return -EINVAL;
+       return ret;
 }
 
 static void linear_dtr(struct dm_target *ti)
index ad1b049ae2ab80a9487eaf8269f226dbb21ea4a9..51d29b67eb01612a039f32439f405e15f7e1b3b1 100644 (file)
@@ -420,6 +420,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        struct log_writes_c *lc;
        struct dm_arg_set as;
        const char *devname, *logdevname;
+       int ret;
 
        as.argc = argc;
        as.argv = argv;
@@ -443,18 +444,22 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        atomic_set(&lc->pending_blocks, 0);
 
        devname = dm_shift_arg(&as);
-       if (dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev)) {
+       ret = dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev);
+       if (ret) {
                ti->error = "Device lookup failed";
                goto bad;
        }
 
        logdevname = dm_shift_arg(&as);
-       if (dm_get_device(ti, logdevname, dm_table_get_mode(ti->table), &lc->logdev)) {
+       ret = dm_get_device(ti, logdevname, dm_table_get_mode(ti->table),
+                           &lc->logdev);
+       if (ret) {
                ti->error = "Log device lookup failed";
                dm_put_device(ti, lc->dev);
                goto bad;
        }
 
+       ret = -EINVAL;
        lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write");
        if (!lc->log_kthread) {
                ti->error = "Couldn't alloc kthread";
@@ -479,7 +484,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
 bad:
        kfree(lc);
-       return -EINVAL;
+       return ret;
 }
 
 static int log_mark(struct log_writes_c *lc, char *data)
index d83696bf403ba0dc9d80603ba94281887ee4f1e5..933a1fd99b7780d3ce6e2305eeb108dc6ac6cdba 100644 (file)
@@ -943,16 +943,18 @@ static int get_mirror(struct mirror_set *ms, struct dm_target *ti,
 {
        unsigned long long offset;
        char dummy;
+       int ret;
 
        if (sscanf(argv[1], "%llu%c", &offset, &dummy) != 1) {
                ti->error = "Invalid offset";
                return -EINVAL;
        }
 
-       if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
-                         &ms->mirror[mirror].dev)) {
+       ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
+                           &ms->mirror[mirror].dev);
+       if (ret) {
                ti->error = "Device lookup failure";
-               return -ENXIO;
+               return ret;
        }
 
        ms->mirror[mirror].ms = ms;
index a672a1502c1414e8cdc3e003ed0a1f74692e3e12..9a814a5eb89f3484718fca36aed3cf4deebf6f2d 100644 (file)
@@ -75,13 +75,15 @@ static int get_stripe(struct dm_target *ti, struct stripe_c *sc,
 {
        unsigned long long start;
        char dummy;
+       int ret;
 
        if (sscanf(argv[1], "%llu%c", &start, &dummy) != 1)
                return -EINVAL;
 
-       if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
-                         &sc->stripe[stripe].dev))
-               return -ENXIO;
+       ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
+                           &sc->stripe[stripe].dev);
+       if (ret)
+               return ret;
 
        sc->stripe[stripe].physical_start = start;