From 4b21f1466243d4c64ebd49a630d4811fd97cbd46 Mon Sep 17 00:00:00 2001 From: Ming Lei Date: Fri, 28 Jun 2019 15:07:50 +0800 Subject: [PATCH] blk-mq: move cancel of hctx->run_work into blk_mq_hw_sysfs_release mainline inclusion from mainline-5.2-rc1 commit 1b97871b501f1bac0fd39a073c4c8473ee457a55 category: bugfix bugzilla: 14864 CVE: NA --------------------------- hctx is always released after requeue is freed. With holding queue's kobject refcount, it is safe for driver to run queue, so one run queue might be scheduled after blk_sync_queue() is done. So moving the cancel of hctx->run_work into blk_mq_hw_sysfs_release() for avoiding run released queue. Cc: Dongli Zhang Cc: James Smart Cc: Bart Van Assche Cc: linux-scsi@vger.kernel.org, Cc: Martin K . Petersen , Cc: Christoph Hellwig , Cc: James E . J . Bottomley , Reviewed-by: Bart Van Assche Reviewed-by: Hannes Reinecke Tested-by: James Smart Signed-off-by: Ming Lei Signed-off-by: Jens Axboe Conflict: block/blk-core.c Signed-off-by: yangerkun Reviewed-by: zhangyi (F) Signed-off-by: Yang Yingliang --- block/blk-core.c | 9 +-------- block/blk-mq-sysfs.c | 2 ++ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 4eea979b78c8..a90b79c06b05 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -407,15 +407,8 @@ void blk_sync_queue(struct request_queue *q) del_timer_sync(&q->timeout); cancel_work_sync(&q->timeout_work); - if (q->mq_ops) { - struct blk_mq_hw_ctx *hctx; - int i; - - queue_for_each_hw_ctx(q, hctx, i) - cancel_delayed_work_sync(&hctx->run_work); - } else { + if (!q->mq_ops) cancel_delayed_work_sync(&q->delay_work); - } } EXPORT_SYMBOL(blk_sync_queue); diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c index f931086bd2b2..5ffaf379d683 100644 --- a/block/blk-mq-sysfs.c +++ b/block/blk-mq-sysfs.c @@ -35,6 +35,8 @@ static void blk_mq_hw_sysfs_release(struct kobject *kobj) struct blk_mq_hw_ctx *hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); + cancel_delayed_work_sync(&hctx->run_work); + if (hctx->flags & BLK_MQ_F_BLOCKING) cleanup_srcu_struct(hctx->srcu); blk_free_flush_queue(hctx->fq); -- GitLab