]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
io_uring/ublk: report error when unregister operation fails
authorCaleb Sander Mateos <csander@purestorage.com>
Fri, 28 Feb 2025 23:14:31 +0000 (16:14 -0700)
committerJens Axboe <axboe@kernel.dk>
Sat, 1 Mar 2025 02:15:05 +0000 (19:15 -0700)
Indicate to userspace applications if a UBLK_IO_UNREGISTER_IO_BUF
command specifies an invalid buffer index by returning an error code.
Return -EINVAL if no buffer is registered with the given index, and
-EBUSY if the registered buffer is not a kernel bvec.

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Link: https://lore.kernel.org/r/20250228231432.642417-1-csander@purestorage.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/ublk_drv.c
include/linux/io_uring/cmd.h
io_uring/rsrc.c

index b5cf92baaf0f0396a148cbfb97675cf1fb749057..512cbd456817b097ece48d4ba089e6f0fda1b315 100644 (file)
@@ -1787,8 +1787,7 @@ static int ublk_unregister_io_buf(struct io_uring_cmd *cmd,
                                  const struct ublksrv_io_cmd *ub_cmd,
                                  unsigned int issue_flags)
 {
-       io_buffer_unregister_bvec(cmd, ub_cmd->addr, issue_flags);
-       return 0;
+       return io_buffer_unregister_bvec(cmd, ub_cmd->addr, issue_flags);
 }
 
 static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd,
index 5bc4f0d58506db7ab8790649a8a7cab59276dacc..598cacda4aa36e33763f69ec773cbb8aaff5e02e 100644 (file)
@@ -131,7 +131,7 @@ static inline struct io_uring_cmd_data *io_uring_cmd_get_async_data(struct io_ur
 int io_buffer_register_bvec(struct io_uring_cmd *cmd, struct request *rq,
                            void (*release)(void *), unsigned int index,
                            unsigned int issue_flags);
-void io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
-                              unsigned int issue_flags);
+int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
+                             unsigned int issue_flags);
 
 #endif /* _LINUX_IO_URING_CMD_H */
index 3107a03d56b832ef725cfe3e82accddf360e8c2c..c9105030f0e37361783604c6aa82b5b10de83474 100644 (file)
@@ -973,26 +973,36 @@ unlock:
 }
 EXPORT_SYMBOL_GPL(io_buffer_register_bvec);
 
-void io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
-                              unsigned int issue_flags)
+int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
+                             unsigned int issue_flags)
 {
        struct io_ring_ctx *ctx = cmd_to_io_kiocb(cmd)->ctx;
        struct io_rsrc_data *data = &ctx->buf_table;
        struct io_rsrc_node *node;
+       int ret = 0;
 
        io_ring_submit_lock(ctx, issue_flags);
-       if (index >= data->nr)
+       if (index >= data->nr) {
+               ret = -EINVAL;
                goto unlock;
+       }
        index = array_index_nospec(index, data->nr);
 
        node = data->nodes[index];
-       if (!node || !node->buf->is_kbuf)
+       if (!node) {
+               ret = -EINVAL;
                goto unlock;
+       }
+       if (!node->buf->is_kbuf) {
+               ret = -EBUSY;
+               goto unlock;
+       }
 
        io_put_rsrc_node(ctx, node);
        data->nodes[index] = NULL;
 unlock:
        io_ring_submit_unlock(ctx, issue_flags);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(io_buffer_unregister_bvec);