]> granicus.if.org Git - zfs/commitdiff
Don't use d_path() for automount mount point for chroot'd process
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Tue, 2 Jul 2019 15:25:23 +0000 (00:25 +0900)
committerTony Hutter <hutter2@llnl.gov>
Wed, 25 Sep 2019 18:27:48 +0000 (11:27 -0700)
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

module/zfs/zfs_ctldir.c

index c8071a7c215f9960b1d31d10a3caa2766f3faa41..aa50646fef83115f320d72be92fbeca6648a54f2 100644 (file)
@@ -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.