Skip to content

Commit

Permalink
io_uring: Fix use of XArray in __io_uring_files_cancel
Browse files Browse the repository at this point in the history
commit ce76537 upstream.

We have to drop the lock during each iteration, so there's no advantage
to using the advanced API.  Convert this to a standard xa_for_each() loop.

Reported-by: syzbot+27c12725d8ff0bfe1a13@syzkaller.appspotmail.com
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Matthew Wilcox (Oracle) authored and gregkh committed Nov 1, 2020
1 parent f048478 commit 4f0cc46
Showing 1 changed file with 5 additions and 14 deletions.
19 changes: 5 additions & 14 deletions fs/io_uring.c
Expand Up @@ -8415,28 +8415,19 @@ static void io_uring_attempt_task_drop(struct file *file, bool exiting)
void __io_uring_files_cancel(struct files_struct *files)
{
struct io_uring_task *tctx = current->io_uring;
XA_STATE(xas, &tctx->xa, 0);
struct file *file;
unsigned long index;

/* make sure overflow events are dropped */
tctx->in_idle = true;

do {
struct io_ring_ctx *ctx;
struct file *file;

xas_lock(&xas);
file = xas_next_entry(&xas, ULONG_MAX);
xas_unlock(&xas);

if (!file)
break;

ctx = file->private_data;
xa_for_each(&tctx->xa, index, file) {
struct io_ring_ctx *ctx = file->private_data;

io_uring_cancel_task_requests(ctx, files);
if (files)
io_uring_del_task_file(file);
} while (1);
}
}

static inline bool io_uring_task_idle(struct io_uring_task *tctx)
Expand Down

0 comments on commit 4f0cc46

Please sign in to comment.