| From 87eb5b21d92a92ac2da3163039d62df88c2b8422 Mon Sep 17 00:00:00 2001 |
| From: Mike Christie <michaelc@cs.wisc.edu> |
| Date: Fri, 1 Mar 2013 22:45:48 +0000 |
| Subject: dm: fix limits initialization when there are no data devices |
| |
| From: Mike Christie <michaelc@cs.wisc.edu> |
| |
| commit 87eb5b21d92a92ac2da3163039d62df88c2b8422 upstream. |
| |
| 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 <michaelc@cs.wisc.edu> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/md/dm.c |
| +++ b/drivers/md/dm.c |
| @@ -2433,7 +2433,7 @@ static void dm_queue_flush(struct mapped |
| */ |
| 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; |
| |
| @@ -2456,10 +2456,12 @@ struct dm_table *dm_swap_table(struct ma |
| 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); |