summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--module/zfs/zfs_ctldir.c41
1 files changed, 7 insertions, 34 deletions
diff --git a/module/zfs/zfs_ctldir.c b/module/zfs/zfs_ctldir.c
index c8071a7c2..aa50646fe 100644
--- a/module/zfs/zfs_ctldir.c
+++ b/module/zfs/zfs_ctldir.c
@@ -707,37 +707,6 @@ zfsctl_snapshot_name(zfsvfs_t *zfsvfs, const char *snap_name, int len,
* 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/"
- */
-static int
zfsctl_snapshot_path_objset(zfsvfs_t *zfsvfs, uint64_t objsetid,
int path_len, char *full_path)
{
@@ -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.