Skip to content

Commit

Permalink
Don't use d_path() for automount mount point for chroot'd process
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Tomohiro Kusumi <[email protected]>
Closes #8903
Closes #8966
  • Loading branch information
kusumi authored and tonyhutter committed Sep 25, 2019
1 parent 7d2489c commit 093bb64
Showing 1 changed file with 7 additions and 34 deletions.
41 changes: 7 additions & 34 deletions module/zfs/zfs_ctldir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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/"
*/
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 093bb64

Please sign in to comment.