io-wq: add support for inheriting ->fs
authorJens Axboe <axboe@kernel.dk>
Fri, 7 Feb 2020 04:42:51 +0000 (21:42 -0700)
committerJens Axboe <axboe@kernel.dk>
Sat, 8 Feb 2020 20:06:58 +0000 (13:06 -0700)
Some work items need this for relative path lookup, make it available
like the other inherited credentials/mm/etc.

Cc: stable@vger.kernel.org # 5.3+
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.c
fs/io-wq.h

index cb60a42b9fdfa5bb1aa1832e3d0277051d821c69..7ac4a8876a50af0f1be765ec3f3abcce9e8d125c 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/slab.h>
 #include <linux/kthread.h>
 #include <linux/rculist_nulls.h>
+#include <linux/fs_struct.h>
 
 #include "io-wq.h"
 
@@ -59,6 +60,7 @@ struct io_worker {
        const struct cred *cur_creds;
        const struct cred *saved_creds;
        struct files_struct *restore_files;
+       struct fs_struct *restore_fs;
 };
 
 #if BITS_PER_LONG == 64
@@ -151,6 +153,9 @@ static bool __io_worker_unuse(struct io_wqe *wqe, struct io_worker *worker)
                task_unlock(current);
        }
 
+       if (current->fs != worker->restore_fs)
+               current->fs = worker->restore_fs;
+
        /*
         * If we have an active mm, we need to drop the wq lock before unusing
         * it. If we do, return true and let the caller retry the idle loop.
@@ -311,6 +316,7 @@ static void io_worker_start(struct io_wqe *wqe, struct io_worker *worker)
 
        worker->flags |= (IO_WORKER_F_UP | IO_WORKER_F_RUNNING);
        worker->restore_files = current->files;
+       worker->restore_fs = current->fs;
        io_wqe_inc_running(wqe, worker);
 }
 
@@ -481,6 +487,8 @@ next:
                        current->files = work->files;
                        task_unlock(current);
                }
+               if (work->fs && current->fs != work->fs)
+                       current->fs = work->fs;
                if (work->mm != worker->mm)
                        io_wq_switch_mm(worker, work);
                if (worker->cur_creds != work->creds)
index 50b3378febf2f3bb01d9b9cf0a8f582d0a72a50e..f152ba677d8f570796b1959df9fd42eb9f6bcc25 100644 (file)
@@ -74,6 +74,7 @@ struct io_wq_work {
        struct files_struct *files;
        struct mm_struct *mm;
        const struct cred *creds;
+       struct fs_struct *fs;
        unsigned flags;
 };
 
@@ -81,10 +82,11 @@ struct io_wq_work {
        do {                                            \
                (work)->list.next = NULL;               \
                (work)->func = _func;                   \
-               (work)->flags = 0;                      \
                (work)->files = NULL;                   \
                (work)->mm = NULL;                      \
                (work)->creds = NULL;                   \
+               (work)->fs = NULL;                      \
+               (work)->flags = 0;                      \
        } while (0)                                     \
 
 typedef void (get_work_fn)(struct io_wq_work *);