Skip to content

Commit

Permalink
init: flush async file closing
Browse files Browse the repository at this point in the history
When unpacking the initramfs or when mounting block devices we need to
ensure that any delayed fput() finished to prevent spurious errors.
The init process can be a proper kernel thread or a user mode helper.
In the latter case PF_KTHREAD isn't set. So we need to do both
flush_delayed_work() and task_work_run().

Since we'll port block device opening and closing to regular file open
and closing we need to ensure the same as for the initramfs. So just
make that a little helper.

Tested-by: Marek Szyprowski <[email protected]>
Tested-by: Srikanth Aithal <[email protected]>
Link: https://lore.kernel.org/r/CA+G9fYttTwsbFuVq10igbSvP5xC6bf_XijM=mpUqrJV=uvUirQ@mail.gmail.com
Signed-off-by: Christian Brauner <[email protected]>
  • Loading branch information
brauner committed Feb 8, 2024
1 parent 6613476 commit 386dc41
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 3 deletions.
3 changes: 3 additions & 0 deletions init/do_mounts.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,9 @@ void __init mount_root_generic(char *name, char *pretty_name, int flags)
goto out;
case -EACCES:
case -EINVAL:
#ifdef CONFIG_BLOCK
init_flush_fput();
#endif
continue;
}
/*
Expand Down
9 changes: 9 additions & 0 deletions init/do_mounts.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include <linux/major.h>
#include <linux/root_dev.h>
#include <linux/init_syscalls.h>
#include <linux/task_work.h>
#include <linux/file.h>

void mount_root_generic(char *name, char *pretty_name, int flags);
void mount_root(char *root_device_name);
Expand Down Expand Up @@ -41,3 +43,10 @@ static inline bool initrd_load(char *root_device_name)
}

#endif

/* Ensure that async file closing finished to prevent spurious errors. */
static inline void init_flush_fput(void)
{
flush_delayed_fput();
task_work_run();
}
6 changes: 3 additions & 3 deletions init/initramfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
#include <linux/mm.h>
#include <linux/namei.h>
#include <linux/init_syscalls.h>
#include <linux/task_work.h>
#include <linux/umh.h>

#include "do_mounts.h"

static __initdata bool csum_present;
static __initdata u32 io_csum;

Expand Down Expand Up @@ -736,8 +737,7 @@ static void __init do_populate_rootfs(void *unused, async_cookie_t cookie)
initrd_start = 0;
initrd_end = 0;

flush_delayed_fput();
task_work_run();
init_flush_fput();
}

static ASYNC_DOMAIN_EXCLUSIVE(initramfs_domain);
Expand Down

0 comments on commit 386dc41

Please sign in to comment.