diff mbox series

[V2,2/3] ublk: fail to recover device if queue setup is interrupted

Message ID 20230726144502.566785-3-ming.lei@redhat.com (mailing list archive)
State New, archived
Headers show
Series ublk: fail to start/recover/del device if interrupted by signal | expand

Commit Message

Ming Lei July 26, 2023, 2:45 p.m. UTC
In ublk_ctrl_end_recovery(), if wait_for_completion_interruptible() is
interrupted by signal, queues aren't setup successfully yet, so we
have to fail UBLK_CMD_END_USER_RECOVERY, otherwise kernel oops can be
triggered.

Fixes: c732a852b419 ("ublk_drv: add START_USER_RECOVERY and END_USER_RECOVERY support")
Reported-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 drivers/block/ublk_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Stefano Garzarella July 27, 2023, 1:04 p.m. UTC | #1
On Wed, Jul 26, 2023 at 10:45:01PM +0800, Ming Lei wrote:
>In ublk_ctrl_end_recovery(), if wait_for_completion_interruptible() is
>interrupted by signal, queues aren't setup successfully yet, so we
>have to fail UBLK_CMD_END_USER_RECOVERY, otherwise kernel oops can be
>triggered.
>
>Fixes: c732a852b419 ("ublk_drv: add START_USER_RECOVERY and END_USER_RECOVERY support")
>Reported-by: Stefano Garzarella <sgarzare@redhat.com>
>Signed-off-by: Ming Lei <ming.lei@redhat.com>
>---
> drivers/block/ublk_drv.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)

Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>

>
>diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
>index 7938221f4f7e..9fcba3834e8d 100644
>--- a/drivers/block/ublk_drv.c
>+++ b/drivers/block/ublk_drv.c
>@@ -2324,7 +2324,9 @@ static int ublk_ctrl_end_recovery(struct ublk_device *ub,
> 	pr_devel("%s: Waiting for new ubq_daemons(nr: %d) are ready, dev id %d...\n",
> 			__func__, ub->dev_info.nr_hw_queues, header->dev_id);
> 	/* wait until new ubq_daemon sending all FETCH_REQ */
>-	wait_for_completion_interruptible(&ub->completion);
>+	if (wait_for_completion_interruptible(&ub->completion))
>+		return -EINTR;
>+
> 	pr_devel("%s: All new ubq_daemons(nr: %d) are ready, dev id %d\n",
> 			__func__, ub->dev_info.nr_hw_queues, header->dev_id);
>
>-- 
>2.40.1
>
diff mbox series

Patch

diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
index 7938221f4f7e..9fcba3834e8d 100644
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@ -2324,7 +2324,9 @@  static int ublk_ctrl_end_recovery(struct ublk_device *ub,
 	pr_devel("%s: Waiting for new ubq_daemons(nr: %d) are ready, dev id %d...\n",
 			__func__, ub->dev_info.nr_hw_queues, header->dev_id);
 	/* wait until new ubq_daemon sending all FETCH_REQ */
-	wait_for_completion_interruptible(&ub->completion);
+	if (wait_for_completion_interruptible(&ub->completion))
+		return -EINTR;
+
 	pr_devel("%s: All new ubq_daemons(nr: %d) are ready, dev id %d\n",
 			__func__, ub->dev_info.nr_hw_queues, header->dev_id);