aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2014-02-19 20:32:33 -0500
committerMike Snitzer <snitzer@redhat.com>2014-02-24 11:41:18 -0500
commit1acacc0784aab45627b6009e0e9224886279ac0b (patch)
treedd1b3ce2e1bd51c2b81a7d3d4b0d066fa09bac10 /drivers/md
parentf3a44fe0608eb628e1f8f6e3540462e6d171a745 (diff)
dm thin: fix the error path for the thin device constructor
dm_pool_close_thin_device() must be called if dm_set_target_max_io_len() fails in thin_ctr(). Otherwise __pool_destroy() will fail because the pool will still have an open thin device: device-mapper: thin metadata: attempt to close pmd when 1 device(s) are still open device-mapper: thin: __pool_destroy: dm_pool_metadata_close() failed. Also, must establish error code if failing thin_ctr() because the pool is in fail_io mode. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Acked-by: Joe Thornber <ejt@redhat.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-thin.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index d501e436a7d9..4cf4b198cb60 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -2895,6 +2895,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
2895 2895
2896 if (get_pool_mode(tc->pool) == PM_FAIL) { 2896 if (get_pool_mode(tc->pool) == PM_FAIL) {
2897 ti->error = "Couldn't open thin device, Pool is in fail mode"; 2897 ti->error = "Couldn't open thin device, Pool is in fail mode";
2898 r = -EINVAL;
2898 goto bad_thin_open; 2899 goto bad_thin_open;
2899 } 2900 }
2900 2901
@@ -2906,7 +2907,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
2906 2907
2907 r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block); 2908 r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block);
2908 if (r) 2909 if (r)
2909 goto bad_thin_open; 2910 goto bad_target_max_io_len;
2910 2911
2911 ti->num_flush_bios = 1; 2912 ti->num_flush_bios = 1;
2912 ti->flush_supported = true; 2913 ti->flush_supported = true;
@@ -2927,6 +2928,8 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
2927 2928
2928 return 0; 2929 return 0;
2929 2930
2931bad_target_max_io_len:
2932 dm_pool_close_thin_device(tc->td);
2930bad_thin_open: 2933bad_thin_open:
2931 __pool_dec(tc->pool); 2934 __pool_dec(tc->pool);
2932bad_pool_lookup: 2935bad_pool_lookup: