From: Christian Brauner <brauner@kernel.org>
To: linux-fsdevel@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org,
Alexander Viro <viro@zeniv.linux.org.uk>,
Jens Axboe <axboe@kernel.dk>, Jan Kara <jack@suse.cz>,
Tejun Heo <tj@kernel.org>, Jann Horn <jannh@google.com>,
Christian Brauner <brauner@kernel.org>
Subject: [PATCH RFC DRAFT POC 10/11] tree-wide: make all kthread path lookups to use LOOKUP_IN_INIT
Date: Tue, 03 Mar 2026 14:49:21 +0100 [thread overview]
Message-ID: <20260303-work-kthread-nullfs-v1-10-87e559b94375@kernel.org> (raw)
In-Reply-To: <20260303-work-kthread-nullfs-v1-0-87e559b94375@kernel.org>
In preparation to isolate all kthreads in nullfs convert all lookups
performed from kthread context to use LOOKUP_IN_INIT. This will make
them all perform the relevant lookup operation in init's filesystem
state.
This should be switched to individual commits for easy bisectability but
right now it serves to illustrate the idea without creating a massive
patchbomb.
Signed-off-by: Christian Brauner <brauner@kernel.org>
---
drivers/block/rnbd/rnbd-srv.c | 2 +-
drivers/char/misc_minor_kunit.c | 2 +-
drivers/crypto/ccp/sev-dev.c | 4 +---
drivers/target/target_core_alua.c | 2 +-
drivers/target/target_core_pr.c | 2 +-
fs/btrfs/volumes.c | 6 +++++-
fs/coredump.c | 6 ++----
fs/init.c | 23 ++++++++++++-----------
fs/kernel_read_file.c | 4 +---
fs/namei.c | 2 +-
fs/nfs/blocklayout/dev.c | 4 ++--
fs/smb/server/mgmt/share_config.c | 3 ++-
fs/smb/server/smb2pdu.c | 2 +-
fs/smb/server/vfs.c | 6 ++++--
init/initramfs.c | 4 ++--
init/initramfs_test.c | 4 ++--
net/unix/af_unix.c | 4 +---
17 files changed, 40 insertions(+), 40 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c
index 10e8c438bb43..6796aee9a2f0 100644
--- a/drivers/block/rnbd/rnbd-srv.c
+++ b/drivers/block/rnbd/rnbd-srv.c
@@ -734,7 +734,7 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess,
goto reject;
}
- bdev_file = bdev_file_open_by_path(full_path, open_flags, NULL, NULL);
+ bdev_file = bdev_file_open_init(full_path, open_flags, NULL, NULL);
if (IS_ERR(bdev_file)) {
ret = PTR_ERR(bdev_file);
pr_err("Opening device '%s' on session %s failed, failed to open the block device, err: %pe\n",
diff --git a/drivers/char/misc_minor_kunit.c b/drivers/char/misc_minor_kunit.c
index e930c78e1ef9..8af1377c42f9 100644
--- a/drivers/char/misc_minor_kunit.c
+++ b/drivers/char/misc_minor_kunit.c
@@ -165,7 +165,7 @@ static void __init miscdev_test_can_open(struct kunit *test, struct miscdevice *
if (ret != 0)
KUNIT_FAIL(test, "failed to create node\n");
- filp = filp_open(devname, O_RDONLY, 0);
+ filp = filp_open_init(devname, O_RDONLY, 0);
if (IS_ERR(filp))
KUNIT_FAIL(test, "failed to open misc device: %ld\n", PTR_ERR(filp));
else
diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c
index 096f993974d1..92971671fa9d 100644
--- a/drivers/crypto/ccp/sev-dev.c
+++ b/drivers/crypto/ccp/sev-dev.c
@@ -262,9 +262,7 @@ static struct file *open_file_as_root(const char *filename, int flags, umode_t m
{
struct path root __free(path_put) = {};
- task_lock(&init_task);
- get_fs_root(init_task.fs, &root);
- task_unlock(&init_task);
+ init_root(&root);
CLASS(prepare_creds, cred)();
if (!cred)
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index 10250aca5a81..d23390d1b6ab 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -856,7 +856,7 @@ static int core_alua_write_tpg_metadata(
unsigned char *md_buf,
u32 md_buf_len)
{
- struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
+ struct file *file = filp_open_init(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
loff_t pos = 0;
int ret;
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index f88e63aefcd8..7ad6b534ccc6 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -1969,7 +1969,7 @@ static int __core_scsi3_write_aptpl_to_file(
if (!path)
return -ENOMEM;
- file = filp_open(path, flags, 0600);
+ file = filp_open_init(path, flags, 0600);
if (IS_ERR(file)) {
pr_err("filp_open(%s) for APTPL metadata"
" failed\n", path);
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 6fb0c4cd50ff..8baeacca01da 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2119,8 +2119,12 @@ static int btrfs_add_dev_item(struct btrfs_trans_handle *trans,
static void update_dev_time(const char *device_path)
{
struct path path;
+ unsigned int flags = LOOKUP_FOLLOW;
- if (!kern_path(device_path, LOOKUP_FOLLOW, &path)) {
+ if (tsk_is_kthread(current))
+ flags |= LOOKUP_IN_INIT;
+
+ if (!kern_path(device_path, flags, &path)) {
vfs_utimes(&path, NULL);
path_put(&path);
}
diff --git a/fs/coredump.c b/fs/coredump.c
index 550a1553f6cb..1e631c5d2076 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -919,13 +919,11 @@ static bool coredump_file(struct core_name *cn, struct coredump_params *cprm,
* with a fully qualified path" rule is to control where
* coredumps may be placed using root privileges,
* current->fs->root must not be used. Instead, use the
- * root directory of init_task.
+ * root directory of PID 1.
*/
struct path root;
- task_lock(&init_task);
- get_fs_root(init_task.fs, &root);
- task_unlock(&init_task);
+ init_root(&root);
file = file_open_root(&root, cn->corename, open_flags, 0600);
path_put(&root);
} else {
diff --git a/fs/init.c b/fs/init.c
index a79872d5af3b..eb224e945328 100644
--- a/fs/init.c
+++ b/fs/init.c
@@ -12,6 +12,7 @@
#include <linux/init_syscalls.h>
#include <linux/security.h>
#include "internal.h"
+#include "mount.h"
int __init init_pivot_root(const char *new_root, const char *put_old)
{
@@ -102,7 +103,7 @@ int __init init_chown(const char *filename, uid_t user, gid_t group, int flags)
struct path path;
int error;
- error = kern_path(filename, lookup_flags, &path);
+ error = kern_path(filename, lookup_flags | LOOKUP_IN_INIT, &path);
if (error)
return error;
error = mnt_want_write(path.mnt);
@@ -119,7 +120,7 @@ int __init init_chmod(const char *filename, umode_t mode)
struct path path;
int error;
- error = kern_path(filename, LOOKUP_FOLLOW, &path);
+ error = kern_path(filename, LOOKUP_FOLLOW | LOOKUP_IN_INIT, &path);
if (error)
return error;
error = chmod_common(&path, mode);
@@ -132,7 +133,7 @@ int __init init_eaccess(const char *filename)
struct path path;
int error;
- error = kern_path(filename, LOOKUP_FOLLOW, &path);
+ error = kern_path(filename, LOOKUP_FOLLOW | LOOKUP_IN_INIT, &path);
if (error)
return error;
error = path_permission(&path, MAY_ACCESS);
@@ -146,7 +147,7 @@ int __init init_stat(const char *filename, struct kstat *stat, int flags)
struct path path;
int error;
- error = kern_path(filename, lookup_flags, &path);
+ error = kern_path(filename, lookup_flags | LOOKUP_IN_INIT, &path);
if (error)
return error;
error = vfs_getattr(&path, stat, STATX_BASIC_STATS,
@@ -158,39 +159,39 @@ int __init init_stat(const char *filename, struct kstat *stat, int flags)
int __init init_mknod(const char *filename, umode_t mode, unsigned int dev)
{
CLASS(filename_kernel, name)(filename);
- return filename_mknodat(AT_FDCWD, name, mode, dev, 0);
+ return filename_mknodat(AT_FDCWD, name, mode, dev, LOOKUP_IN_INIT);
}
int __init init_link(const char *oldname, const char *newname)
{
CLASS(filename_kernel, old)(oldname);
CLASS(filename_kernel, new)(newname);
- return filename_linkat(AT_FDCWD, old, AT_FDCWD, new, 0, 0);
+ return filename_linkat(AT_FDCWD, old, AT_FDCWD, new, 0, LOOKUP_IN_INIT);
}
int __init init_symlink(const char *oldname, const char *newname)
{
CLASS(filename_kernel, old)(oldname);
CLASS(filename_kernel, new)(newname);
- return filename_symlinkat(old, AT_FDCWD, new, 0);
+ return filename_symlinkat(old, AT_FDCWD, new, LOOKUP_IN_INIT);
}
int __init init_unlink(const char *pathname)
{
CLASS(filename_kernel, name)(pathname);
- return filename_unlinkat(AT_FDCWD, name, 0);
+ return filename_unlinkat(AT_FDCWD, name, LOOKUP_IN_INIT);
}
int __init init_mkdir(const char *pathname, umode_t mode)
{
CLASS(filename_kernel, name)(pathname);
- return filename_mkdirat(AT_FDCWD, name, mode, 0);
+ return filename_mkdirat(AT_FDCWD, name, mode, LOOKUP_IN_INIT);
}
int __init init_rmdir(const char *pathname)
{
CLASS(filename_kernel, name)(pathname);
- return filename_rmdir(AT_FDCWD, name, 0);
+ return filename_rmdir(AT_FDCWD, name, LOOKUP_IN_INIT);
}
int __init init_utimes(char *filename, struct timespec64 *ts)
@@ -198,7 +199,7 @@ int __init init_utimes(char *filename, struct timespec64 *ts)
struct path path;
int error;
- error = kern_path(filename, 0, &path);
+ error = kern_path(filename, LOOKUP_IN_INIT, &path);
if (error)
return error;
error = vfs_utimes(&path, ts);
diff --git a/fs/kernel_read_file.c b/fs/kernel_read_file.c
index de32c95d823d..00bbe0757ad3 100644
--- a/fs/kernel_read_file.c
+++ b/fs/kernel_read_file.c
@@ -156,9 +156,7 @@ ssize_t kernel_read_file_from_path_initns(const char *path, loff_t offset,
if (!path || !*path)
return -EINVAL;
- task_lock(&init_task);
- get_fs_root(init_task.fs, &root);
- task_unlock(&init_task);
+ init_root(&root);
file = file_open_root(&root, path, O_RDONLY, 0);
path_put(&root);
diff --git a/fs/namei.c b/fs/namei.c
index 5cf407aad5b3..976b1e9f7032 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -4906,7 +4906,7 @@ static struct dentry *filename_create(int dfd, struct filename *name,
struct dentry *dentry = ERR_PTR(-EEXIST);
struct qstr last;
bool want_dir = lookup_flags & LOOKUP_DIRECTORY;
- unsigned int reval_flag = lookup_flags & LOOKUP_REVAL;
+ unsigned int reval_flag = lookup_flags & (LOOKUP_REVAL | LOOKUP_IN_INIT);
unsigned int create_flags = LOOKUP_CREATE | LOOKUP_EXCL;
int type;
int error;
diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c
index cc6327d97a91..32dee716237a 100644
--- a/fs/nfs/blocklayout/dev.c
+++ b/fs/nfs/blocklayout/dev.c
@@ -370,8 +370,8 @@ bl_open_path(struct pnfs_block_volume *v, const char *prefix)
if (!devname)
return ERR_PTR(-ENOMEM);
- bdev_file = bdev_file_open_by_path(devname, BLK_OPEN_READ | BLK_OPEN_WRITE,
- NULL, NULL);
+ bdev_file = bdev_file_open_init(devname, BLK_OPEN_READ | BLK_OPEN_WRITE,
+ NULL, NULL);
if (IS_ERR(bdev_file)) {
dprintk("failed to open device %s (%ld)\n",
devname, PTR_ERR(bdev_file));
diff --git a/fs/smb/server/mgmt/share_config.c b/fs/smb/server/mgmt/share_config.c
index 53f44ff4d376..2deefdc242a8 100644
--- a/fs/smb/server/mgmt/share_config.c
+++ b/fs/smb/server/mgmt/share_config.c
@@ -189,7 +189,8 @@ static struct ksmbd_share_config *share_config_request(struct ksmbd_work *work,
goto out;
}
- ret = kern_path(share->path, 0, &share->vfs_path);
+ ret = kern_path(share->path, LOOKUP_IN_INIT,
+ &share->vfs_path);
ksmbd_revert_fsids(work);
if (ret) {
ksmbd_debug(SMB, "failed to access '%s'\n",
diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index 95901a78951c..8e89fb9a8c35 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -5462,7 +5462,7 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
if (!share->path)
return -EIO;
- rc = kern_path(share->path, LOOKUP_NO_SYMLINKS, &path);
+ rc = kern_path(share->path, LOOKUP_NO_SYMLINKS | LOOKUP_IN_INIT, &path);
if (rc) {
pr_err("cannot create vfs path\n");
return -EIO;
diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
index d08973b288e5..2e64ed65dcca 100644
--- a/fs/smb/server/vfs.c
+++ b/fs/smb/server/vfs.c
@@ -62,6 +62,7 @@ static int ksmbd_vfs_path_lookup(struct ksmbd_share_config *share_conf,
if (pathname[0] == '\0') {
pathname = share_conf->path;
root_share_path = NULL;
+ flags |= LOOKUP_IN_INIT;
} else {
flags |= LOOKUP_BENEATH;
}
@@ -622,7 +623,7 @@ int ksmbd_vfs_link(struct ksmbd_work *work, const char *oldname,
if (ksmbd_override_fsids(work))
return -ENOMEM;
- err = kern_path(oldname, LOOKUP_NO_SYMLINKS, &oldpath);
+ err = kern_path(oldname, LOOKUP_NO_SYMLINKS | LOOKUP_IN_INIT, &oldpath);
if (err) {
pr_err("cannot get linux path for %s, err = %d\n",
oldname, err);
@@ -1258,7 +1259,8 @@ struct dentry *ksmbd_vfs_kern_path_create(struct ksmbd_work *work,
if (!abs_name)
return ERR_PTR(-ENOMEM);
- dent = start_creating_path(AT_FDCWD, abs_name, path, flags);
+ dent = start_creating_path(AT_FDCWD, abs_name, path,
+ flags | LOOKUP_IN_INIT);
kfree(abs_name);
return dent;
}
diff --git a/init/initramfs.c b/init/initramfs.c
index 139baed06589..f44d772f960b 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -382,7 +382,7 @@ static int __init do_name(void)
int openflags = O_WRONLY|O_CREAT|O_LARGEFILE;
if (ml != 1)
openflags |= O_TRUNC;
- wfile = filp_open(collected, openflags, mode);
+ wfile = filp_open_init(collected, openflags, mode);
if (IS_ERR(wfile))
return 0;
wfile_pos = 0;
@@ -702,7 +702,7 @@ static void __init populate_initrd_image(char *err)
printk(KERN_INFO "rootfs image is not initramfs (%s); looks like an initrd\n",
err);
- file = filp_open("/initrd.image", O_WRONLY|O_CREAT|O_LARGEFILE, 0700);
+ file = filp_open_init("/initrd.image", O_WRONLY|O_CREAT|O_LARGEFILE, 0700);
if (IS_ERR(file))
return;
diff --git a/init/initramfs_test.c b/init/initramfs_test.c
index 2ce38d9a8fd0..9415b9cfb9d3 100644
--- a/init/initramfs_test.c
+++ b/init/initramfs_test.c
@@ -224,7 +224,7 @@ static void __init initramfs_test_data(struct kunit *test)
err = unpack_to_rootfs(cpio_srcbuf, len);
KUNIT_EXPECT_NULL(test, err);
- file = filp_open(c[0].fname, O_RDONLY, 0);
+ file = filp_open_init(c[0].fname, O_RDONLY, 0);
if (IS_ERR(file)) {
KUNIT_FAIL(test, "open failed");
goto out;
@@ -430,7 +430,7 @@ static void __init initramfs_test_fname_pad(struct kunit *test)
err = unpack_to_rootfs(tbufs->cpio_srcbuf, len);
KUNIT_EXPECT_NULL(test, err);
- file = filp_open(c[0].fname, O_RDONLY, 0);
+ file = filp_open_init(c[0].fname, O_RDONLY, 0);
if (IS_ERR(file)) {
KUNIT_FAIL(test, "open failed");
goto out;
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 3756a93dc63a..6f370cb44afe 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1200,9 +1200,7 @@ static struct sock *unix_find_bsd(struct sockaddr_un *sunaddr, int addr_len,
if (flags & SOCK_COREDUMP) {
struct path root;
- task_lock(&init_task);
- get_fs_root(init_task.fs, &root);
- task_unlock(&init_task);
+ init_root(&root);
scoped_with_kernel_creds()
err = vfs_path_lookup(root.dentry, root.mnt, sunaddr->sun_path,
--
2.47.3
next prev parent reply other threads:[~2026-03-03 13:49 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-03 13:49 [PATCH RFC DRAFT POC 00/11] fs,kthread: isolate all kthreads in nullfs Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 01/11] kthread: refactor __kthread_create_on_node() to take a struct argument Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 02/11] kthread: remove unused flags argument from kthread worker creation API Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 03/11] kthread: add extensible kthread_create()/kthread_run() pattern Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 04/11] fs: notice when init abandons fs sharing Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 05/11] fs: add LOOKUP_IN_INIT Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 06/11] fs: add file_open_init() Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 07/11] block: add bdev_file_open_init() Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 08/11] fs: allow to pass lookup flags to filename_*() Christian Brauner
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 09/11] fs: add init_root() Christian Brauner
2026-03-03 13:49 ` Christian Brauner [this message]
2026-03-03 15:03 ` [PATCH RFC DRAFT POC 10/11] tree-wide: make all kthread path lookups to use LOOKUP_IN_INIT Christoph Hellwig
2026-03-03 13:49 ` [PATCH RFC DRAFT POC 11/11] fs: isolate all kthreads in nullfs Christian Brauner
2026-03-06 7:26 ` [PATCH RFC DRAFT POC 00/11] fs,kthread: " Askar Safin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260303-work-kthread-nullfs-v1-10-87e559b94375@kernel.org \
--to=brauner@kernel.org \
--cc=axboe@kernel.dk \
--cc=jack@suse.cz \
--cc=jannh@google.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox