init: add an init_umount helper

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

Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Christoph Hellwig 2020-07-23 08:23:08 +02:00
Родитель c60166f042
Коммит 09267defa3
6 изменённых файлов: 19 добавлений и 4 удалений

Просмотреть файл

@ -23,3 +23,17 @@ int __init init_mount(const char *dev_name, const char *dir_name,
path_put(&path);
return ret;
}
int __init init_umount(const char *name, int flags)
{
int lookup_flags = LOOKUP_MOUNTPOINT;
struct path path;
int ret;
if (!(flags & UMOUNT_NOFOLLOW))
lookup_flags |= LOOKUP_FOLLOW;
ret = kern_path(name, lookup_flags, &path);
if (ret)
return ret;
return path_umount(&path, flags);
}

Просмотреть файл

@ -92,6 +92,7 @@ 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);
int path_umount(struct path *path, int flags);
/*
* fs_struct.c

Просмотреть файл

@ -1706,7 +1706,7 @@ static inline bool may_mandlock(void)
}
#endif
static int path_umount(struct path *path, int flags)
int path_umount(struct path *path, int flags)
{
struct mount *mnt;
int retval;
@ -1736,7 +1736,7 @@ dput_and_out:
return retval;
}
int ksys_umount(char __user *name, int flags)
static int ksys_umount(char __user *name, int flags)
{
int lookup_flags = LOOKUP_MOUNTPOINT;
struct path path;

Просмотреть файл

@ -2,3 +2,4 @@
int __init init_mount(const char *dev_name, const char *dir_name,
const char *type_page, unsigned long flags, void *data_page);
int __init init_umount(const char *name, int flags);

Просмотреть файл

@ -1236,7 +1236,6 @@ asmlinkage long sys_ni_syscall(void);
* the ksys_xyzyyz() functions prototyped below.
*/
int ksys_umount(char __user *name, int flags);
int ksys_chroot(const char __user *filename);
ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count);
int ksys_chdir(const char __user *filename);

Просмотреть файл

@ -122,7 +122,7 @@ static void __init handle_initrd(void)
else
printk("failed\n");
printk(KERN_NOTICE "Unmounting old root\n");
ksys_umount("/old", MNT_DETACH);
init_umount("/old", MNT_DETACH);
}
}