summaryrefslogtreecommitdiff
path: root/drivers/md
diff options
context:
space:
mode:
authorTahsin Erdogan <tahsin@google.com>2016-10-10 05:35:19 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-11-10 16:36:34 +0100
commitcb270a3f16668efb80141e530f5235035301cc11 (patch)
treee802afe4d932b272acb953e60ccda16b3d49140c /drivers/md
parentf49f9df84eb20cefbb3b354fa755ebf056613568 (diff)
dm: free io_barrier after blk_cleanup_queue call
commit d09960b0032174eb493c4c13be5b9c9ef36dc9a7 upstream. dm_old_request_fn() has paths that access md->io_barrier. The party destroying io_barrier should ensure that no future execution of dm_old_request_fn() is possible. Move io_barrier destruction to below blk_cleanup_queue() to ensure this and avoid a NULL pointer crash during request-based DM device shutdown. Signed-off-by: Tahsin Erdogan <tahsin@google.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 84aa8b1d0480..3384a3eef917 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -2260,8 +2260,6 @@ static void cleanup_mapped_device(struct mapped_device *md)
if (md->bs)
bioset_free(md->bs);
- cleanup_srcu_struct(&md->io_barrier);
-
if (md->disk) {
spin_lock(&_minor_lock);
md->disk->private_data = NULL;
@@ -2273,6 +2271,8 @@ static void cleanup_mapped_device(struct mapped_device *md)
if (md->queue)
blk_cleanup_queue(md->queue);
+ cleanup_srcu_struct(&md->io_barrier);
+
if (md->bdev) {
bdput(md->bdev);
md->bdev = NULL;