Commit 13fe8e68 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe

ublk: add UBLK_CMD_DEL_DEV_ASYNC

The current command UBLK_CMD_DEL_DEV won't return until the device is
released, this way looks more reliable, but makes userspace more
difficult to implement, especially about orders: unmap command
buffer(which holds one ublkc reference), ublkc close,
io_uring_file_unregister, ublkb close.

Add UBLK_CMD_DEL_DEV_ASYNC so that device deletion won't wait release,
then userspace needn't worry about the above order. Actually both loop
and nbd is deleted in this async way.
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20240223075539.89945-3-ming.lei@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 1221b9e9
...@@ -2468,7 +2468,7 @@ static inline bool ublk_idr_freed(int id) ...@@ -2468,7 +2468,7 @@ static inline bool ublk_idr_freed(int id)
return ptr == NULL; return ptr == NULL;
} }
static int ublk_ctrl_del_dev(struct ublk_device **p_ub) static int ublk_ctrl_del_dev(struct ublk_device **p_ub, bool wait)
{ {
struct ublk_device *ub = *p_ub; struct ublk_device *ub = *p_ub;
int idx = ub->ub_number; int idx = ub->ub_number;
...@@ -2502,7 +2502,7 @@ static int ublk_ctrl_del_dev(struct ublk_device **p_ub) ...@@ -2502,7 +2502,7 @@ static int ublk_ctrl_del_dev(struct ublk_device **p_ub)
* - the device number is freed already, we will not find this * - the device number is freed already, we will not find this
* device via ublk_get_device_from_id() * device via ublk_get_device_from_id()
*/ */
if (wait_event_interruptible(ublk_idr_wq, ublk_idr_freed(idx))) if (wait && wait_event_interruptible(ublk_idr_wq, ublk_idr_freed(idx)))
return -EINTR; return -EINTR;
return 0; return 0;
} }
...@@ -2901,7 +2901,10 @@ static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd, ...@@ -2901,7 +2901,10 @@ static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd,
ret = ublk_ctrl_add_dev(cmd); ret = ublk_ctrl_add_dev(cmd);
break; break;
case UBLK_CMD_DEL_DEV: case UBLK_CMD_DEL_DEV:
ret = ublk_ctrl_del_dev(&ub); ret = ublk_ctrl_del_dev(&ub, true);
break;
case UBLK_U_CMD_DEL_DEV_ASYNC:
ret = ublk_ctrl_del_dev(&ub, false);
break; break;
case UBLK_CMD_GET_QUEUE_AFFINITY: case UBLK_CMD_GET_QUEUE_AFFINITY:
ret = ublk_ctrl_get_queue_affinity(ub, cmd); ret = ublk_ctrl_get_queue_affinity(ub, cmd);
......
...@@ -49,6 +49,8 @@ ...@@ -49,6 +49,8 @@
_IOR('u', UBLK_CMD_GET_DEV_INFO2, struct ublksrv_ctrl_cmd) _IOR('u', UBLK_CMD_GET_DEV_INFO2, struct ublksrv_ctrl_cmd)
#define UBLK_U_CMD_GET_FEATURES \ #define UBLK_U_CMD_GET_FEATURES \
_IOR('u', 0x13, struct ublksrv_ctrl_cmd) _IOR('u', 0x13, struct ublksrv_ctrl_cmd)
#define UBLK_U_CMD_DEL_DEV_ASYNC \
_IOR('u', 0x14, struct ublksrv_ctrl_cmd)
/* /*
* 64bits are enough now, and it should be easy to extend in case of * 64bits are enough now, and it should be easy to extend in case of
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment