| From foo@baz Wed Aug 9 11:19:16 PDT 2017 |
| From: Omar Sandoval <osandov@fb.com> |
| Date: Mon, 9 Jan 2017 11:44:12 -0800 |
| Subject: virtio_blk: fix panic in initialization error path |
| |
| From: Omar Sandoval <osandov@fb.com> |
| |
| |
| [ Upstream commit 6bf6b0aa3da84a3d9126919a94c49c0fb7ee2fb3 ] |
| |
| If blk_mq_init_queue() returns an error, it gets assigned to |
| vblk->disk->queue. Then, when we call put_disk(), we end up calling |
| blk_put_queue() with the ERR_PTR, causing a bad dereference. Fix it by |
| only assigning to vblk->disk->queue on success. |
| |
| Signed-off-by: Omar Sandoval <osandov@fb.com> |
| Reviewed-by: Jeff Moyer <jmoyer@redhat.com> |
| Signed-off-by: Jens Axboe <axboe@fb.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/block/virtio_blk.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/block/virtio_blk.c |
| +++ b/drivers/block/virtio_blk.c |
| @@ -641,11 +641,12 @@ static int virtblk_probe(struct virtio_d |
| if (err) |
| goto out_put_disk; |
| |
| - q = vblk->disk->queue = blk_mq_init_queue(&vblk->tag_set); |
| + q = blk_mq_init_queue(&vblk->tag_set); |
| if (IS_ERR(q)) { |
| err = -ENOMEM; |
| goto out_free_tags; |
| } |
| + vblk->disk->queue = q; |
| |
| q->queuedata = vblk; |
| |