FAILED: patch "[PATCH] io_uring: account io_uring internal files as REQ_F_INFLIGHT" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 02a13674fa0e8dd326de8b9f4514b41b03d99003 Mon Sep 17 00:00:00 2001
From: Jens Axboe <[email protected]>
Date: Sat, 23 Jan 2021 15:49:31 -0700
Subject: [PATCH] io_uring: account io_uring internal files as REQ_F_INFLIGHT
We need to actively cancel anything that introduces a potential circular loop, where io_uring holds a reference to itself. If the file in question is an io_uring file, then add the request to the inflight list.
Cc [email protected] # 5.9+
Signed-off-by Jens Axboe <[email protected]>
fs/io_uring.c +26 -10
@@ -1075,8 +1075,11 @@ static bool io_match_task(struct io_kiocb *head,return true;io_for_each_link (req, head) { -if ((req->flags &REQ_F_WORK_INITIALIZED ) && - (req->work.flags &IO_WQ_WORK_FILES ) && +if (!(req->flags &REQ_F_WORK_INITIALIZED )) +continue ; +if (req->file && req->file->f_op == &io_uring_fops) +return true; +if ((req->work.flags &IO_WQ_WORK_FILES ) && req->work.identity->files == files)return true; }
@@ -1505,11 +1508,14 @@ static bool io_grab_identity(struct io_kiocb *req)return false;atomic_inc (&id->files->count);get_nsproxy (id->nsproxy); - req->flags |=REQ_F_INFLIGHT ; -spin_lock_irq (&ctx->inflight_lock); -list_add (&req->inflight_entry, &ctx->inflight_list); -spin_unlock_irq (&ctx->inflight_lock); +if (!(req->flags &REQ_F_INFLIGHT )) { + req->flags |=REQ_F_INFLIGHT ; + +spin_lock_irq (&ctx->inflight_lock); +list_add (&req->inflight_entry, &ctx->inflight_list); +spin_unlock_irq (&ctx->inflight_lock); + } req->work.flags |=IO_WQ_WORK_FILES ; } if (!(req->work.flags & IO_WQ_WORK_MM) &&
@@ -6164,8 +6170,10 @@ static void io_req_drop_files(struct io_kiocb *req)struct io_uring_task *tctx = req->task->io_uring;unsigned long flags; -put_files_struct (req->work.identity->files); -put_nsproxy (req->work.identity->nsproxy); +if (req->work.flags &IO_WQ_WORK_FILES ) { +put_files_struct (req->work.identity->files); +put_nsproxy (req->work.identity->nsproxy); + }spin_lock_irqsave (&ctx->inflight_lock, flags);list_del (&req->inflight_entry);spin_unlock_irqrestore (&ctx->inflight_lock, flags);
@@ -6450,6 +6458,15 @@ static struct file *io_file_get(struct io_submit_state *state, file =__io_file_get (state, fd); } +if (file && file->f_op == &io_uring_fops) { +io_req_init_async (req); + req->flags |=REQ_F_INFLIGHT ; + +spin_lock_irq (&ctx->inflight_lock); +list_add (&req->inflight_entry, &ctx->inflight_list); +spin_unlock_irq (&ctx->inflight_lock); + } +return file; }
@@ -8860,8 +8877,7 @@ static void io_uring_cancel_files(struct io_ring_ctx *ctx,spin_lock_irq (&ctx->inflight_lock);list_for_each_entry (req, &ctx->inflight_list, inflight_entry) { -if (req->task != task || - req->work.identity->files != files) +if (!io_match_task (req, task, files))continue ; found = true;break ;