Patch "dm table: fix 'all_blk_mq' inconsistency when an empty table is loaded" has been added to the 4.8-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dm table: fix 'all_blk_mq' inconsistency when an empty table is loaded
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dm-table-fix-all_blk_mq-inconsistency-when-an-empty-table-is-loaded.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6936c12cf809850180b24947271b8f068fdb15e9Mon Sep 17 00:00:00 2001
From: Mike Snitzer <[email protected]>
Date: Wed, 23 Nov 2016 13:51:09 -0500
Subject: dm table: fix 'all_blk_mq' inconsistency when an empty table is loaded
From: Mike Snitzer <[email protected]>
commit 6936c12cf809850180b24947271b8f068fdb15e9 upstream.
An earlier DM multipath table could have been build ontop of underlying devices that were all using blk-mq. In that case, if that active multipath table is replaced with an empty DM multipath table (that reflects all paths have failed) then it is important that the 'all_blk_mq' state of the active table is transfered to the new empty DM table. Otherwise dm-rq.c:dm_old_prep_tio() will incorrectly clone a request that isn't needed by the DM multipath target when it is to issue IO to an underlying blk-mq device.
--- drivers/md/dm-table.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
drivers/md/dm-table.c +13 -6
@@ -924,12 +924,6 @@ static int dm_table_determine_type(strucBUG_ON (!request_based);/* No targets in this table */ -if (list_empty (devices) &&__table_type_request_based (live_md_type)) { -/* inherit live MD type */ - t->type = live_md_type; -return 0 ; - } -/* * The only way to establish DM_TYPE_MQ_REQUEST_BASED is by * having a compatible target use dm_table_set_type.
@@ -948,6 +942,19 @@ verify_rq_based:return -EINVAL ; } +if (list_empty (devices)) { +int srcu_idx; +struct dm_table *live_table =dm_get_live_table (t->md, &srcu_idx); + +/* inherit live table's type and all_blk_mq */ +if (live_table) { + t->type = live_table->type; + t->all_blk_mq = live_table->all_blk_mq; + } +dm_put_live_table (t->md, srcu_idx); +return 0 ; + } +/* Non-request-stackable devices can't be used for request-based dm */ list_for_each_entry (dd, devices, list) {struct request_queue *q =bdev_get_queue (dd->dm_dev->bdev);
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/dm-raid-fix-discard-support-regression.patch queue-4.8/dm-rq-fix-a-race-condition-in-rq_completed.patch queue-4.8/dm-flakey-return-einval-on-interval-bounds-error-in-flakey_ctr.patch queue-4.8/dm-space-map-metadata-fix-struct-sm_metadata-leak-on-failed-create.patch queue-4.8/dm-table-fix-all_blk_mq-inconsistency-when-an-empty-table-is-loaded.patch queue-4.8/dm-crypt-mark-key-as-invalid-until-properly-loaded.patch queue-4.8/dm-table-an-all_blk_mq-table-must-be-loaded-for-a-blk-mq-dm-device.patch