]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
io_uring: make del_task_file more forgiving
authorPavel Begunkov <asml.silence@gmail.com>
Sat, 6 Mar 2021 11:02:11 +0000 (11:02 +0000)
committerJens Axboe <axboe@kernel.dk>
Sun, 7 Mar 2021 21:12:43 +0000 (14:12 -0700)
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>
fs/io_uring.c

index d51c6ba9268bdd442e0f4244722f9ed98c92b714..00a736867b764bc2bd035680a96c750c2cef09bc 100644 (file)
@@ -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;