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>
This commit is contained in:
parent
b052b07c39
commit
d09960b003
|
@ -1423,8 +1423,6 @@ static void cleanup_mapped_device(struct mapped_device *md)
|
||||||
if (md->bs)
|
if (md->bs)
|
||||||
bioset_free(md->bs);
|
bioset_free(md->bs);
|
||||||
|
|
||||||
cleanup_srcu_struct(&md->io_barrier);
|
|
||||||
|
|
||||||
if (md->disk) {
|
if (md->disk) {
|
||||||
spin_lock(&_minor_lock);
|
spin_lock(&_minor_lock);
|
||||||
md->disk->private_data = NULL;
|
md->disk->private_data = NULL;
|
||||||
|
@ -1436,6 +1434,8 @@ static void cleanup_mapped_device(struct mapped_device *md)
|
||||||
if (md->queue)
|
if (md->queue)
|
||||||
blk_cleanup_queue(md->queue);
|
blk_cleanup_queue(md->queue);
|
||||||
|
|
||||||
|
cleanup_srcu_struct(&md->io_barrier);
|
||||||
|
|
||||||
if (md->bdev) {
|
if (md->bdev) {
|
||||||
bdput(md->bdev);
|
bdput(md->bdev);
|
||||||
md->bdev = NULL;
|
md->bdev = NULL;
|
||||||
|
|
Loading…
Reference in New Issue