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:
		
							parent
							
								
									c60166f042
								
							
						
					
					
						commit
						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); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user