@@ -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
@@ -141,13 +143,17 @@ static bool __io_worker_unuse(struct io_wqe *wqe, struct io_worker *worker)
worker->cur_creds = worker->saved_creds = NULL;
}
- if (current->files != worker->restore_files) {
+ if ((current->files != worker->restore_files) ||
+ (current->fs != worker->restore_fs)) {
__acquire(&wqe->lock);
spin_unlock_irq(&wqe->lock);
dropped_lock = true;
task_lock(current);
- current->files = worker->restore_files;
+ if (current->files != worker->restore_files)
+ current->files = worker->restore_files;
+ if (current->fs != worker->restore_fs)
+ current->fs = worker->restore_fs;
task_unlock(current);
}
@@ -311,6 +317,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);
}
@@ -476,9 +483,13 @@ static void io_worker_handle_work(struct io_worker *worker)
if (work->flags & IO_WQ_WORK_CB)
work->func(&work);
- if (work->files && current->files != work->files) {
+ if ((work->files && current->files != work->files) ||
+ (work->fs && current->fs != work->fs)) {
task_lock(current);
- current->files = work->files;
+ if (work->files && current->files != work->files)
+ current->files = work->files;
+ if (work->fs && current->fs != work->fs)
+ current->fs = work->fs;
task_unlock(current);
}
if (work->mm != worker->mm)
@@ -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 *);
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 | 19 +++++++++++++++---- fs/io-wq.h | 4 +++- 2 files changed, 18 insertions(+), 5 deletions(-)