]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerBen Hutchings <ben@decadent.org.uk>
Tue, 28 Apr 2020 18:02:36 +0000 (19:02 +0100)
commit e80d1c805a3b2f0ad2081369be5dc5deedd5ee59 upstream.

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>
[bwh: Backported to 3.16: drop changes to dm-log-writes]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/md/dm-crypt.c
drivers/md/dm-delay.c
drivers/md/dm-flakey.c
drivers/md/dm-linear.c
drivers/md/dm-raid1.c
drivers/md/dm-stripe.c

index dfab51ff09eacdaa440e4baa49936b10a49e89cf..284871a103f8a934fcdf8e5d86bbfccbcb5f2d5c 100644 (file)
@@ -1762,11 +1762,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 42c3a27a14cc3a906b5f892a6206de348b6b58ee..7e194aa1463496e3e99622448fedca1841ed443a 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 0f5e1820c92de54960a41637fb35b7c9554115fb..12a1c47b7d7313b02718cf2be4d32555414901ee 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 089d62751f7ff2a3aedf7e441cb88bec0d06b8a7..3a477f97952afadda82498c9c77a84279fcddcd9 100644 (file)
@@ -923,16 +923,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 d1600d2aa2e2e6983643ef0ef864195f858d4f9d..e7b07b1282d8facad3a28dd95d068b0b3481a77c 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;