From: Mike Christie Date: Wed, 13 Feb 2013 22:42:39 +0000 (+1100) Subject: dm_calculate_queue_limits will first reset the provided limits to X-Git-Tag: next-20130218~56^2~9 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=0c5f186653c22bdf4b6691347a26157c2b287416;p=karo-tx-linux.git dm_calculate_queue_limits will first reset the provided limits to defaults using blk_set_stacking_limits; whereby defeating the purpose of retaining the original live table's limits -- as was intended via commit 3ae706561637331aa578e52bb89ecbba5edcb7a9 ("dm: retain table limits when swapping to new table with no devices"). Fix this improper limits initialization (in the no data devices case) by avoiding the call to dm_calculate_queue_limits. [patch header revised by Mike Snitzer] Signed-off-by: Mike Christie Signed-off-by: Mike Snitzer Cc: stable@vger.kernel.org # v3.6+ Signed-off-by: Alasdair G Kergon --- diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 842513c94571..add7654181a7 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2460,7 +2460,7 @@ static void dm_queue_flush(struct mapped_device *md) */ struct dm_table *dm_swap_table(struct mapped_device *md, struct dm_table *table) { - struct dm_table *live_map, *map = ERR_PTR(-EINVAL); + struct dm_table *live_map = NULL, *map = ERR_PTR(-EINVAL); struct queue_limits limits; int r; @@ -2483,10 +2483,12 @@ struct dm_table *dm_swap_table(struct mapped_device *md, struct dm_table *table) dm_table_put(live_map); } - r = dm_calculate_queue_limits(table, &limits); - if (r) { - map = ERR_PTR(r); - goto out; + if (!live_map) { + r = dm_calculate_queue_limits(table, &limits); + if (r) { + map = ERR_PTR(r); + goto out; + } } map = __bind(md, table, &limits);