aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVivek Goyal <vgoyal@redhat.com>2015-07-31 09:20:36 -0400
committerMike Snitzer <snitzer@redhat.com>2015-08-12 11:32:21 -0400
commite80d1c805a3b2f0ad2081369be5dc5deedd5ee59 (patch)
tree9e1044dc46f00ac0e2c34f92c6c10189c89f0ce9
parentab37844d6169c2dd6f96e665b07b692ba1a4c180 (diff)
dm: do not override error code returned from dm_get_device()
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>
-rw-r--r--drivers/md/dm-crypt.c4
-rw-r--r--drivers/md/dm-delay.c16
-rw-r--r--drivers/md/dm-flakey.c6
-rw-r--r--drivers/md/dm-linear.c7
-rw-r--r--drivers/md/dm-log-writes.c11
-rw-r--r--drivers/md/dm-raid1.c8
-rw-r--r--drivers/md/dm-stripe.c8
7 files changed, 41 insertions, 19 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 0f48fed44a17..9a75d462b3fb 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -1811,11 +1811,13 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1811 } 1811 }
1812 cc->iv_offset = tmpll; 1812 cc->iv_offset = tmpll;
1813 1813
1814 if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev)) { 1814 ret = dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev);
1815 if (ret) {
1815 ti->error = "Device lookup failed"; 1816 ti->error = "Device lookup failed";
1816 goto bad; 1817 goto bad;
1817 } 1818 }
1818 1819
1820 ret = -EINVAL;
1819 if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1) { 1821 if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1) {
1820 ti->error = "Invalid device sector"; 1822 ti->error = "Invalid device sector";
1821 goto bad; 1823 goto bad;
diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c
index 57b6a1901c91..b34f6e27293d 100644
--- a/drivers/md/dm-delay.c
+++ b/drivers/md/dm-delay.c
@@ -129,6 +129,7 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
129 struct delay_c *dc; 129 struct delay_c *dc;
130 unsigned long long tmpll; 130 unsigned long long tmpll;
131 char dummy; 131 char dummy;
132 int ret;
132 133
133 if (argc != 3 && argc != 6) { 134 if (argc != 3 && argc != 6) {
134 ti->error = "requires exactly 3 or 6 arguments"; 135 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)
143 144
144 dc->reads = dc->writes = 0; 145 dc->reads = dc->writes = 0;
145 146
147 ret = -EINVAL;
146 if (sscanf(argv[1], "%llu%c", &tmpll, &dummy) != 1) { 148 if (sscanf(argv[1], "%llu%c", &tmpll, &dummy) != 1) {
147 ti->error = "Invalid device sector"; 149 ti->error = "Invalid device sector";
148 goto bad; 150 goto bad;
@@ -154,12 +156,14 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
154 goto bad; 156 goto bad;
155 } 157 }
156 158
157 if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), 159 ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
158 &dc->dev_read)) { 160 &dc->dev_read);
161 if (ret) {
159 ti->error = "Device lookup failed"; 162 ti->error = "Device lookup failed";
160 goto bad; 163 goto bad;
161 } 164 }
162 165
166 ret = -EINVAL;
163 dc->dev_write = NULL; 167 dc->dev_write = NULL;
164 if (argc == 3) 168 if (argc == 3)
165 goto out; 169 goto out;
@@ -175,13 +179,15 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
175 goto bad_dev_read; 179 goto bad_dev_read;
176 } 180 }
177 181
178 if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), 182 ret = dm_get_device(ti, argv[3], dm_table_get_mode(ti->table),
179 &dc->dev_write)) { 183 &dc->dev_write);
184 if (ret) {
180 ti->error = "Write device lookup failed"; 185 ti->error = "Write device lookup failed";
181 goto bad_dev_read; 186 goto bad_dev_read;
182 } 187 }
183 188
184out: 189out:
190 ret = -EINVAL;
185 dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); 191 dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0);
186 if (!dc->kdelayd_wq) { 192 if (!dc->kdelayd_wq) {
187 DMERR("Couldn't start kdelayd"); 193 DMERR("Couldn't start kdelayd");
@@ -208,7 +214,7 @@ bad_dev_read:
208 dm_put_device(ti, dc->dev_read); 214 dm_put_device(ti, dc->dev_read);
209bad: 215bad:
210 kfree(dc); 216 kfree(dc);
211 return -EINVAL; 217 return ret;
212} 218}
213 219
214static void delay_dtr(struct dm_target *ti) 220static void delay_dtr(struct dm_target *ti)
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
index b257e46876d3..ffb994527bcf 100644
--- a/drivers/md/dm-flakey.c
+++ b/drivers/md/dm-flakey.c
@@ -183,6 +183,7 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
183 183
184 devname = dm_shift_arg(&as); 184 devname = dm_shift_arg(&as);
185 185
186 r = -EINVAL;
186 if (sscanf(dm_shift_arg(&as), "%llu%c", &tmpll, &dummy) != 1) { 187 if (sscanf(dm_shift_arg(&as), "%llu%c", &tmpll, &dummy) != 1) {
187 ti->error = "Invalid device sector"; 188 ti->error = "Invalid device sector";
188 goto bad; 189 goto bad;
@@ -211,7 +212,8 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
211 if (r) 212 if (r)
212 goto bad; 213 goto bad;
213 214
214 if (dm_get_device(ti, devname, dm_table_get_mode(ti->table), &fc->dev)) { 215 r = dm_get_device(ti, devname, dm_table_get_mode(ti->table), &fc->dev);
216 if (r) {
215 ti->error = "Device lookup failed"; 217 ti->error = "Device lookup failed";
216 goto bad; 218 goto bad;
217 } 219 }
@@ -224,7 +226,7 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
224 226
225bad: 227bad:
226 kfree(fc); 228 kfree(fc);
227 return -EINVAL; 229 return r;
228} 230}
229 231
230static void flakey_dtr(struct dm_target *ti) 232static void flakey_dtr(struct dm_target *ti)
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index 53e848c10939..62c26e4ad6ac 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -30,6 +30,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
30 struct linear_c *lc; 30 struct linear_c *lc;
31 unsigned long long tmp; 31 unsigned long long tmp;
32 char dummy; 32 char dummy;
33 int ret;
33 34
34 if (argc != 2) { 35 if (argc != 2) {
35 ti->error = "Invalid argument count"; 36 ti->error = "Invalid argument count";
@@ -42,13 +43,15 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
42 return -ENOMEM; 43 return -ENOMEM;
43 } 44 }
44 45
46 ret = -EINVAL;
45 if (sscanf(argv[1], "%llu%c", &tmp, &dummy) != 1) { 47 if (sscanf(argv[1], "%llu%c", &tmp, &dummy) != 1) {
46 ti->error = "dm-linear: Invalid device sector"; 48 ti->error = "dm-linear: Invalid device sector";
47 goto bad; 49 goto bad;
48 } 50 }
49 lc->start = tmp; 51 lc->start = tmp;
50 52
51 if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &lc->dev)) { 53 ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &lc->dev);
54 if (ret) {
52 ti->error = "dm-linear: Device lookup failed"; 55 ti->error = "dm-linear: Device lookup failed";
53 goto bad; 56 goto bad;
54 } 57 }
@@ -61,7 +64,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
61 64
62 bad: 65 bad:
63 kfree(lc); 66 kfree(lc);
64 return -EINVAL; 67 return ret;
65} 68}
66 69
67static void linear_dtr(struct dm_target *ti) 70static void linear_dtr(struct dm_target *ti)
diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c
index ad1b049ae2ab..51d29b67eb01 100644
--- a/drivers/md/dm-log-writes.c
+++ b/drivers/md/dm-log-writes.c
@@ -420,6 +420,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
420 struct log_writes_c *lc; 420 struct log_writes_c *lc;
421 struct dm_arg_set as; 421 struct dm_arg_set as;
422 const char *devname, *logdevname; 422 const char *devname, *logdevname;
423 int ret;
423 424
424 as.argc = argc; 425 as.argc = argc;
425 as.argv = argv; 426 as.argv = argv;
@@ -443,18 +444,22 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
443 atomic_set(&lc->pending_blocks, 0); 444 atomic_set(&lc->pending_blocks, 0);
444 445
445 devname = dm_shift_arg(&as); 446 devname = dm_shift_arg(&as);
446 if (dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev)) { 447 ret = dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev);
448 if (ret) {
447 ti->error = "Device lookup failed"; 449 ti->error = "Device lookup failed";
448 goto bad; 450 goto bad;
449 } 451 }
450 452
451 logdevname = dm_shift_arg(&as); 453 logdevname = dm_shift_arg(&as);
452 if (dm_get_device(ti, logdevname, dm_table_get_mode(ti->table), &lc->logdev)) { 454 ret = dm_get_device(ti, logdevname, dm_table_get_mode(ti->table),
455 &lc->logdev);
456 if (ret) {
453 ti->error = "Log device lookup failed"; 457 ti->error = "Log device lookup failed";
454 dm_put_device(ti, lc->dev); 458 dm_put_device(ti, lc->dev);
455 goto bad; 459 goto bad;
456 } 460 }
457 461
462 ret = -EINVAL;
458 lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write"); 463 lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write");
459 if (!lc->log_kthread) { 464 if (!lc->log_kthread) {
460 ti->error = "Couldn't alloc kthread"; 465 ti->error = "Couldn't alloc kthread";
@@ -479,7 +484,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
479 484
480bad: 485bad:
481 kfree(lc); 486 kfree(lc);
482 return -EINVAL; 487 return ret;
483} 488}
484 489
485static int log_mark(struct log_writes_c *lc, char *data) 490static int log_mark(struct log_writes_c *lc, char *data)
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c
index d83696bf403b..933a1fd99b77 100644
--- a/drivers/md/dm-raid1.c
+++ b/drivers/md/dm-raid1.c
@@ -943,16 +943,18 @@ static int get_mirror(struct mirror_set *ms, struct dm_target *ti,
943{ 943{
944 unsigned long long offset; 944 unsigned long long offset;
945 char dummy; 945 char dummy;
946 int ret;
946 947
947 if (sscanf(argv[1], "%llu%c", &offset, &dummy) != 1) { 948 if (sscanf(argv[1], "%llu%c", &offset, &dummy) != 1) {
948 ti->error = "Invalid offset"; 949 ti->error = "Invalid offset";
949 return -EINVAL; 950 return -EINVAL;
950 } 951 }
951 952
952 if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), 953 ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
953 &ms->mirror[mirror].dev)) { 954 &ms->mirror[mirror].dev);
955 if (ret) {
954 ti->error = "Device lookup failure"; 956 ti->error = "Device lookup failure";
955 return -ENXIO; 957 return ret;
956 } 958 }
957 959
958 ms->mirror[mirror].ms = ms; 960 ms->mirror[mirror].ms = ms;
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c
index a672a1502c14..9a814a5eb89f 100644
--- a/drivers/md/dm-stripe.c
+++ b/drivers/md/dm-stripe.c
@@ -75,13 +75,15 @@ static int get_stripe(struct dm_target *ti, struct stripe_c *sc,
75{ 75{
76 unsigned long long start; 76 unsigned long long start;
77 char dummy; 77 char dummy;
78 int ret;
78 79
79 if (sscanf(argv[1], "%llu%c", &start, &dummy) != 1) 80 if (sscanf(argv[1], "%llu%c", &start, &dummy) != 1)
80 return -EINVAL; 81 return -EINVAL;
81 82
82 if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), 83 ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
83 &sc->stripe[stripe].dev)) 84 &sc->stripe[stripe].dev);
84 return -ENXIO; 85 if (ret)
86 return ret;
85 87
86 sc->stripe[stripe].physical_start = start; 88 sc->stripe[stripe].physical_start = start;
87 89