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:
Родитель
c60166f042
Коммит
09267defa3
14
fs/init.c
14
fs/init.c
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче