summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>2019-07-03 00:25:23 +0900
committerBrian Behlendorf <behlendorf1@llnl.gov>2019-07-02 08:25:23 -0700
commitdf358db7c3a39f8a13f16fd99d87c08ca2f2e2a5 (patch)
tree4ff09f2cafe4a0ac54d2098d112be79e71ae8546
parentac6d54160ad016a199101a074db50345daea4c59 (diff)
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
-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.