Re: [PATCH 3/9] ublk: add ublk_force_abort_dev()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Apr 14, 2025 at 07:25:44PM +0800, Ming Lei wrote:
> Add ublk_force_abort_dev() for handling ublk_nosrv_dev_should_queue_io()
> in ublk_stop_dev(). Then queue quiesce and unquiesce can be paired in
> single function.
> 
> Meantime not change device state to QUIESCED any more, since the disk is
> going to be removed soon.
> 
> Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx>

Reviewed-by: Uday Shankar <ushankar@xxxxxxxxxxxxxxx>

> ---
>  drivers/block/ublk_drv.c | 21 ++++++++-------------
>  1 file changed, 8 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> index 79f42ed7339f..7e2c4084c243 100644
> --- a/drivers/block/ublk_drv.c
> +++ b/drivers/block/ublk_drv.c
> @@ -1743,22 +1743,20 @@ static void __ublk_quiesce_dev(struct ublk_device *ub)
>  	ub->dev_info.state = UBLK_S_DEV_QUIESCED;
>  }
>  
> -static void ublk_unquiesce_dev(struct ublk_device *ub)
> +static void ublk_force_abort_dev(struct ublk_device *ub)
>  {
>  	int i;
>  
> -	pr_devel("%s: unquiesce ub: dev_id %d state %s\n",
> +	pr_devel("%s: force abort ub: dev_id %d state %s\n",
>  			__func__, ub->dev_info.dev_id,
>  			ub->dev_info.state == UBLK_S_DEV_LIVE ?
>  			"LIVE" : "QUIESCED");
> -	/* quiesce_work has run. We let requeued rqs be aborted
> -	 * before running fallback_wq. "force_abort" must be seen
> -	 * after request queue is unqiuesced. Then del_gendisk()
> -	 * can move on.
> -	 */
> +	blk_mq_quiesce_queue(ub->ub_disk->queue);
> +	if (ub->dev_info.state == UBLK_S_DEV_LIVE)
> +		ublk_wait_tagset_rqs_idle(ub);
> +
>  	for (i = 0; i < ub->dev_info.nr_hw_queues; i++)
>  		ublk_get_queue(ub, i)->force_abort = true;
> -
>  	blk_mq_unquiesce_queue(ub->ub_disk->queue);
>  	/* We may have requeued some rqs in ublk_quiesce_queue() */
>  	blk_mq_kick_requeue_list(ub->ub_disk->queue);
> @@ -1786,11 +1784,8 @@ static void ublk_stop_dev(struct ublk_device *ub)
>  	mutex_lock(&ub->mutex);
>  	if (!ub->ub_disk)
>  		goto unlock;
> -	if (ublk_nosrv_dev_should_queue_io(ub)) {
> -		if (ub->dev_info.state == UBLK_S_DEV_LIVE)
> -			__ublk_quiesce_dev(ub);
> -		ublk_unquiesce_dev(ub);
> -	}
> +	if (ublk_nosrv_dev_should_queue_io(ub))
> +		ublk_force_abort_dev(ub);
>  	del_gendisk(ub->ub_disk);
>  	disk = ublk_detach_disk(ub);
>  	put_disk(disk);
> -- 
> 2.47.0
> 




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux