From: Christian Brauner <brauner@kernel.org>
To: linux-fsdevel@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
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 v3 16/26] pnfs/blocklayout: use scoped_with_init_fs() for SCSI device lookup
Date: Wed, 11 Mar 2026 22:43:59 +0100 [thread overview]
Message-ID: <20260311-work-kthread-nullfs-v3-16-3dd2cbe92ad0@kernel.org> (raw)
In-Reply-To: <20260311-work-kthread-nullfs-v3-0-3dd2cbe92ad0@kernel.org>
bl_open_path() resolves pNFS block device paths under /dev/disk/by-id/
via bdev_file_open_by_path() -> lookup_bdev() -> kern_path(). This
path resolution uses current->fs->root.
With kthreads now starting in nullfs, this fails when the call
originates from writeback kworker context because current->fs->root
points at the empty nullfs. The full callchain from kworker is:
wb_workfn [kworker writeback callback]
...
nfs_writepages [address_space_operations.writepages]
nfs_do_writepage
nfs_pageio_add_request
...
bl_pg_init_write [nfs_pageio_ops.pg_init]
pnfs_generic_pg_init_write
pnfs_update_layout
nfs4_proc_layoutget [synchronous RPC]
pnfs_layout_process
bl_alloc_lseg
bl_alloc_extent
bl_find_get_deviceid
bl_alloc_deviceid_node
bl_parse_deviceid
bl_parse_scsi
bl_open_path
bdev_file_open_by_path
lookup_bdev
kern_path <- current->fs->root
bl_open_path() can also be reached from userspace process context (e.g.
open, read, write syscalls via pnfs_update_layout). In that case
current->fs must not be overridden as the path should resolve against
the calling process's filesystem root.
Add a tsk_is_kthread() conditional in bl_open_path() to only apply
scoped_with_init_fs() in kthread context.
Signed-off-by: Christian Brauner <brauner@kernel.org>
---
fs/nfs/blocklayout/dev.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c
index cc6327d97a91..eed960839608 100644
--- a/fs/nfs/blocklayout/dev.c
+++ b/fs/nfs/blocklayout/dev.c
@@ -4,6 +4,7 @@
*/
#include <linux/sunrpc/svc.h>
#include <linux/blkdev.h>
+#include <linux/fs_struct.h>
#include <linux/nfs4.h>
#include <linux/nfs_fs.h>
#include <linux/nfs_xdr.h>
@@ -363,21 +364,27 @@ static struct file *
bl_open_path(struct pnfs_block_volume *v, const char *prefix)
{
struct file *bdev_file;
- const char *devname;
+ const char *devname __free(kfree) = NULL;
devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/%s%*phN",
prefix, v->scsi.designator_len, v->scsi.designator);
if (!devname)
return ERR_PTR(-ENOMEM);
- bdev_file = bdev_file_open_by_path(devname, BLK_OPEN_READ | BLK_OPEN_WRITE,
+ if (tsk_is_kthread(current)) {
+ scoped_with_init_fs()
+ bdev_file = bdev_file_open_by_path(devname,
+ BLK_OPEN_READ | BLK_OPEN_WRITE,
NULL, NULL);
+ } else {
+ bdev_file = bdev_file_open_by_path(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));
}
- kfree(devname);
return bdev_file;
}
--
2.47.3
next prev parent reply other threads:[~2026-03-11 21:56 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 21:43 [PATCH RFC v3 00/26] fs,kthread: start all kthreads in nullfs Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 01/26] fs: add switch_fs_struct() Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 02/26] fs: notice when init abandons fs sharing Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 03/26] fs: add scoped_with_init_fs() Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 04/26] fs: add real_fs to track task's actual fs_struct Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 05/26] fs: make userspace_init_fs a dynamically-initialized pointer Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 06/26] rnbd: use scoped_with_init_fs() for block device open Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 07/26] crypto: ccp: use scoped_with_init_fs() for SEV file access Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 08/26] scsi: target: use scoped_with_init_fs() for ALUA metadata Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 09/26] scsi: target: use scoped_with_init_fs() for APTPL metadata Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 10/26] btrfs: use scoped_with_init_fs() for update_dev_time() Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 11/26] coredump: use scoped_with_init_fs() for coredump path resolution Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 12/26] fs: use scoped_with_init_fs() for kernel_read_file_from_path_initns() Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 13/26] ksmbd: use scoped_with_init_fs() for share path resolution Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 14/26] ksmbd: use scoped_with_init_fs() for filesystem info path lookup Christian Brauner
2026-03-11 21:43 ` [PATCH RFC v3 15/26] ksmbd: use scoped_with_init_fs() for VFS path operations Christian Brauner
2026-03-11 21:43 ` Christian Brauner [this message]
2026-03-11 21:44 ` [PATCH RFC v3 17/26] initramfs: use scoped_with_init_fs() for rootfs unpacking Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 18/26] af_unix: use scoped_with_init_fs() for coredump socket lookup Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 19/26] fs: stop sharing fs_struct between init_task and pid 1 Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 20/26] fs: add umh argument to struct kernel_clone_args Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 21/26] fs: add kthread_mntns() Christian Brauner
2026-03-11 22:13 ` Thomas Weißschuh
2026-03-11 21:44 ` [PATCH RFC v3 22/26] devtmpfs: create private mount namespace Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 23/26] nullfs: make nullfs multi-instance Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 24/26] fs: start all kthreads in nullfs Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 25/26] fs: stop rewriting kthread fs structs Christian Brauner
2026-03-11 21:44 ` [PATCH RFC v3 26/26] fs: stop rewriting paths for PF_EXITING | PF_DUMPCORE Christian Brauner
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=20260311-work-kthread-nullfs-v3-16-3dd2cbe92ad0@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