Move zfs_cmd_t copyin/copyout to platform code

FreeBSD needs to cope with multiple version of the zfs_cmd_t
structure. Allowing the platform code to pre and post
process the cmd structure makes it possible to work with
legacy tooling.

Reviewed-by: Jorgen Lundman <lundman@lundman.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
Closes #9624
This commit is contained in:
Matthew Macy
2019-12-02 10:08:27 -08:00
committed by Brian Behlendorf
parent 42a826eed3
commit 5142032106
3 changed files with 25 additions and 22 deletions
+17 -1
View File
@@ -168,9 +168,25 @@ static long
zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg)
{
uint_t vecnum;
zfs_cmd_t *zc;
int error, rc;
vecnum = cmd - ZFS_IOC_FIRST;
return (zfsdev_ioctl_common(vecnum, arg));
zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP);
if (ddi_copyin((void *)(uintptr_t)arg, zc, sizeof (zfs_cmd_t), 0)) {
error = -SET_ERROR(EFAULT);
goto out;
}
error = -zfsdev_ioctl_common(vecnum, zc);
rc = ddi_copyout(zc, (void *)(uintptr_t)arg, sizeof (zfs_cmd_t), 0);
if (error == 0 && rc != 0)
error = -SET_ERROR(EFAULT);
out:
kmem_free(zc, sizeof (zfs_cmd_t));
return (error);
}
int