summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2021-03-06 14:02:11 +0300
committerJens Axboe <axboe@kernel.dk>2021-03-08 00:12:43 +0300
commit2941267bd3dad018de1d51fe2cd996b7bc1e5a5d (patch)
treef2cb4fecfdaa7e869a1cc161eef04ac03961a16b /fs
parent003e8dccdb22712dae388e682182d5f08b32386f (diff)
downloadlinux-2941267bd3dad018de1d51fe2cd996b7bc1e5a5d.tar.xz
io_uring: make del_task_file more forgiving
Rework io_uring_del_task_file(), so it accepts an index to delete, and it's not necessarily have to be in the ->xa. Infer file from xa_erase() to maintain a single origin of truth. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r--fs/io_uring.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index d51c6ba9268b..00a736867b76 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -8785,15 +8785,18 @@ static int io_uring_add_task_file(struct io_ring_ctx *ctx, struct file *file)
/*
* Remove this io_uring_file -> task mapping.
*/
-static void io_uring_del_task_file(struct file *file)
+static void io_uring_del_task_file(unsigned long index)
{
struct io_uring_task *tctx = current->io_uring;
+ struct file *file;
+
+ file = xa_erase(&tctx->xa, index);
+ if (!file)
+ return;
if (tctx->last == file)
tctx->last = NULL;
- file = xa_erase(&tctx->xa, (unsigned long)file);
- if (file)
- fput(file);
+ fput(file);
}
static void io_uring_clean_tctx(struct io_uring_task *tctx)
@@ -8802,7 +8805,7 @@ static void io_uring_clean_tctx(struct io_uring_task *tctx)
unsigned long index;
xa_for_each(&tctx->xa, index, file)
- io_uring_del_task_file(file);
+ io_uring_del_task_file(index);
if (tctx->io_wq) {
io_wq_put_and_exit(tctx->io_wq);
tctx->io_wq = NULL;