diff options
author | Mike Snitzer <snitzer@redhat.com> | 2014-02-19 20:32:33 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2014-02-24 11:41:18 -0500 |
commit | 1acacc0784aab45627b6009e0e9224886279ac0b (patch) | |
tree | dd1b3ce2e1bd51c2b81a7d3d4b0d066fa09bac10 /drivers/md | |
parent | f3a44fe0608eb628e1f8f6e3540462e6d171a745 (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.c | 5 |
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 | ||
2931 | bad_target_max_io_len: | ||
2932 | dm_pool_close_thin_device(tc->td); | ||
2930 | bad_thin_open: | 2933 | bad_thin_open: |
2931 | __pool_dec(tc->pool); | 2934 | __pool_dec(tc->pool); |
2932 | bad_pool_lookup: | 2935 | bad_pool_lookup: |