mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Don't use d_path() for automount mount point for chroot'd process
Chroot'd process fails to automount snapshots due to realpath(3) failure in mount.zfs(8). Construct a mount point path from sb of the ctldir inode and dirent name, instead of from d_path(), so that chroot'd process doesn't get affected by its view of fs. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com> Closes #8903 Closes #8966
This commit is contained in:
		
							parent
							
								
									7d2489cfad
								
							
						
					
					
						commit
						093bb64461
					
				| @ -703,37 +703,6 @@ zfsctl_snapshot_name(zfsvfs_t *zfsvfs, const char *snap_name, int len, | ||||
| 	return (0); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Returns full path in full_path: "/pool/dataset/.zfs/snapshot/snap_name/" | ||||
|  */ | ||||
| static int | ||||
| zfsctl_snapshot_path(struct path *path, int len, char *full_path) | ||||
| { | ||||
| 	char *path_buffer, *path_ptr; | ||||
| 	int path_len, error = 0; | ||||
| 
 | ||||
| 	path_buffer = kmem_alloc(len, KM_SLEEP); | ||||
| 
 | ||||
| 	path_ptr = d_path(path, path_buffer, len); | ||||
| 	if (IS_ERR(path_ptr)) { | ||||
| 		error = -PTR_ERR(path_ptr); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	path_len = path_buffer + len - 1 - path_ptr; | ||||
| 	if (path_len > len) { | ||||
| 		error = SET_ERROR(EFAULT); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	memcpy(full_path, path_ptr, path_len); | ||||
| 	full_path[path_len] = '\0'; | ||||
| out: | ||||
| 	kmem_free(path_buffer, len); | ||||
| 
 | ||||
| 	return (error); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Returns full path in full_path: "/pool/dataset/.zfs/snapshot/snap_name/" | ||||
|  */ | ||||
| @ -1077,9 +1046,13 @@ zfsctl_snapshot_mount(struct path *path, int flags) | ||||
| 	if (error) | ||||
| 		goto error; | ||||
| 
 | ||||
| 	error = zfsctl_snapshot_path(path, MAXPATHLEN, full_path); | ||||
| 	if (error) | ||||
| 		goto error; | ||||
| 	/*
 | ||||
| 	 * Construct a mount point path from sb of the ctldir inode and dirent | ||||
| 	 * name, instead of from d_path(), so that chroot'd process doesn't fail | ||||
| 	 * on mount.zfs(8). | ||||
| 	 */ | ||||
| 	snprintf(full_path, MAXPATHLEN, "%s/.zfs/snapshot/%s", | ||||
| 	    zfsvfs->z_vfs->vfs_mntpoint, dname(dentry)); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Multiple concurrent automounts of a snapshot are never allowed. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tomohiro Kusumi
						Tomohiro Kusumi