diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index 5a4cd90ea73..b1aea455321 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -198,6 +198,7 @@ #include #include #include +#include #include "zfs_namecheck.h" #include "zfs_prop.h" @@ -6662,6 +6663,14 @@ zfsdev_ioctl(struct cdev *dev, u_long zcmd, caddr_t arg, int flag, #ifdef illumos minor_t minor = getminor(dev); #else +#ifdef COMPAT_FREEBSD32 + typedef struct zfs_iocparm32 { + uint32_t zfs_ioctl_version; + uint64_t zfs_cmd; + uint64_t zfs_cmd_size; + } __packed zfs_iocparm32_t; + zfs_iocparm_t zc_iocparm64; +#endif zfs_iocparm_t *zc_iocparm; int cflag, cmd, oldvecnum; boolean_t newioc, compat; @@ -6683,6 +6692,18 @@ zfsdev_ioctl(struct cdev *dev, u_long zcmd, caddr_t arg, int flag, * Check if we are talking to supported older binaries * and translate zfs_cmd if necessary */ +#ifdef COMPAT_FREEBSD32 + if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) { + if (len == sizeof(zfs_iocparm32_t)) { + zfs_iocparm32_t *zc_iocparm32 = (zfs_iocparm32_t*)arg; + zc_iocparm64.zfs_ioctl_version = zc_iocparm32->zfs_ioctl_version; + zc_iocparm64.zfs_cmd = zc_iocparm32->zfs_cmd; + zc_iocparm64.zfs_cmd_size = zc_iocparm32->zfs_cmd_size; + arg = (caddr_t)&zc_iocparm64; + len = sizeof(zc_iocparm64); + } + } +#endif if (len != sizeof(zfs_iocparm_t)) { newioc = B_FALSE; compat = B_TRUE;