btrfs: use scoped_with_init_fs() for update_dev_time()

update_dev_time() can be called from both kthread and process context.
Use scoped_with_init_fs() to temporarily override current->fs for
the kern_path() call when running in kthread context so the path
lookup happens in init's filesystem context.

update_dev_time() ← btrfs_scratch_superblocks() ←
btrfs_dev_replace_finishing() ← btrfs_dev_replace_kthread()
← kthread (kthread_run)

Also called from ioctl (user process).

Link: https://patch.msgid.link/20260601-work-kthread-nullfs-v4-10-77ee053060e0@kernel.org
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
This commit is contained in:
Christian Brauner 2026-06-01 15:56:43 +02:00
parent c3f4513c78
commit f565f3b064
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2

View File

@ -12,6 +12,7 @@
#include <linux/uuid.h>
#include <linux/list_sort.h>
#include <linux/namei.h>
#include <linux/fs_struct.h>
#include "misc.h"
#include "disk-io.h"
#include "extent-tree.h"
@ -2125,8 +2126,16 @@ static int btrfs_add_dev_item(struct btrfs_trans_handle *trans,
static void update_dev_time(const char *device_path)
{
struct path path;
int err;
if (!kern_path(device_path, LOOKUP_FOLLOW, &path)) {
if (tsk_is_kthread(current)) {
scoped_with_init_fs()
err = kern_path(device_path, LOOKUP_FOLLOW, &path);
} else {
err = kern_path(device_path, LOOKUP_FOLLOW, &path);
}
if (!err) {
vfs_utimes(&path, NULL);
path_put(&path);
}