diff options
author | Tahsin Erdogan <tahsin@google.com> | 2016-10-10 14:35:19 +0200 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2016-10-18 18:02:08 +0200 |
commit | d09960b0032174eb493c4c13be5b9c9ef36dc9a7 (patch) | |
tree | 1dfe65031f7b8b7316806e9abc4eb69f3244295a /drivers/md | |
parent | dm raid: fix activation of existing raid4/10 devices (diff) | |
download | linux-d09960b0032174eb493c4c13be5b9c9ef36dc9a7.tar.xz linux-d09960b0032174eb493c4c13be5b9c9ef36dc9a7.zip |
dm: free io_barrier after blk_cleanup_queue call
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.
Cc: stable@vger.kernel.org # 4.3+
Signed-off-by: Tahsin Erdogan <tahsin@google.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index be35258324c1..ec513ee864f2 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1423,8 +1423,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; @@ -1436,6 +1434,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; |