Commit c60166f0 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

init: add an init_mount helper



Like do_mount, but takes a kernel pointer for the destination path.
Switch over the mounts in the init code and devtmpfs to it, which
just happen to work due to the implicit set_fs(KERNEL_DS) during early
init right now.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 09cbcec0
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/kthread.h>
#include <linux/init_syscalls.h>
#include <uapi/linux/mount.h>
#include "base.h"

@@ -359,7 +360,7 @@ int __init devtmpfs_mount(void)
	if (!thread)
		return 0;

	err = do_mount("devtmpfs", "dev", "devtmpfs", MS_SILENT, NULL);
	err = init_mount("devtmpfs", "dev", "devtmpfs", MS_SILENT, NULL);
	if (err)
		printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
	else
@@ -408,7 +409,7 @@ static int __init devtmpfs_setup(void *p)
	err = ksys_unshare(CLONE_NEWNS);
	if (err)
		goto out;
	err = do_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
	err = init_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
	if (err)
		goto out;
	ksys_chdir("/.."); /* will traverse into overmounted root */
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ obj-y := open.o read_write.o file_table.o super.o \
		seq_file.o xattr.o libfs.o fs-writeback.o \
		pnode.o splice.o sync.o utimes.o d_path.o \
		stack.o fs_struct.o statfs.o fs_pin.o nsfs.o \
		fs_types.o fs_context.o fs_parser.o fsopen.o
		fs_types.o fs_context.o fs_parser.o fsopen.o init.o

ifeq ($(CONFIG_BLOCK),y)
obj-y +=	buffer.o block_dev.o direct-io.o mpage.o

fs/init.c

0 → 100644
+25 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Routines that mimic syscalls, but don't use the user address space or file
 * descriptors.  Only for init/ and related early init code.
 */
#include <linux/init.h>
#include <linux/mount.h>
#include <linux/namei.h>
#include <linux/fs.h>
#include <linux/init_syscalls.h>
#include "internal.h"

int __init init_mount(const char *dev_name, const char *dir_name,
		const char *type_page, unsigned long flags, void *data_page)
{
	struct path path;
	int ret;

	ret = kern_path(dir_name, LOOKUP_FOLLOW, &path);
	if (ret)
		return ret;
	ret = path_mount(dev_name, &path, type_page, flags, data_page);
	path_put(&path);
	return ret;
}
+4 −0
Original line number Diff line number Diff line
@@ -89,6 +89,10 @@ extern int __mnt_want_write_file(struct file *);
extern void __mnt_drop_write_file(struct file *);

extern void dissolve_on_fput(struct vfsmount *);

int path_mount(const char *dev_name, struct path *path,
		const char *type_page, unsigned long flags, void *data_page);

/*
 * fs_struct.c
 */
+1 −1
Original line number Diff line number Diff line
@@ -3111,7 +3111,7 @@ char *copy_mount_string(const void __user *data)
 * Therefore, if this magic number is present, it carries no information
 * and must be discarded.
 */
static int path_mount(const char *dev_name, struct path *path,
int path_mount(const char *dev_name, struct path *path,
		const char *type_page, unsigned long flags, void *data_page)
{
	unsigned int mnt_flags = 0, sb_flags;
Loading