Skip to content

Commit

Permalink
Don't use d_path() for automount mount point for chroot'd users
Browse files Browse the repository at this point in the history
Chroot'd users fail 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 users don't get
affected by their view of fs.

Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com>
  • Loading branch information
kusumi committed Jun 28, 2019
1 parent 679b0f2 commit 157f683
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 users don'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 157f683

Please sign in to comment.