aboutsummaryrefslogtreecommitdiff
path: root/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2013-03-18 09:32:29 +0000
committerMartin Matuska <mm@FreeBSD.org>2013-03-18 09:32:29 +0000
commit6f4accc2de2112c732da5eafed194fa3cbf9ce96 (patch)
tree9353f3579ab3c149b4b017b4be06fbe98b7a5f52 /cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
parentd97b41582d8f4603222358f33b73d378388c3778 (diff)
downloadsrc-6f4accc2de2112c732da5eafed194fa3cbf9ce96.tar.gz
src-6f4accc2de2112c732da5eafed194fa3cbf9ce96.zip
Move common zfs ioctl compatibility functions (userland) into libzfs_compat.c
Introduce additional constants for zfs ioctl versions
Notes
Notes: svn path=/projects/libzfs_core/; revision=248461
Diffstat (limited to 'cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h')
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h66
1 files changed, 2 insertions, 64 deletions
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
index 400c81443be9..37616683330a 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
@@ -32,71 +32,9 @@
extern "C" {
#endif
-static int zfs_ioctl_version = -1;
-static int zfs_kernel_version = 0;
+int get_zfs_ioctl_version(void);
+int zcmd_ioctl(int fd, int request, zfs_cmd_t *zc);
-/*
- * Get zfs_ioctl_version
- */
-static __inline int
-get_zfs_ioctl_version(void)
-{
- size_t ver_size;
- int ver = 0;
-
- ver_size = sizeof(ver);
- sysctlbyname("vfs.zfs.version.ioctl", &ver, &ver_size, NULL, 0);
-
- return (ver);
-}
-
-/*
- * This is FreeBSD version of ioctl, because Solaris' ioctl() updates
- * zc_nvlist_dst_size even if an error is returned, on FreeBSD if an
- * error is returned zc_nvlist_dst_size won't be updated.
- */
-static __inline int
-zcmd_ioctl(int fd, int request, zfs_cmd_t *zc)
-{
- size_t oldsize, zfs_kernel_version_size;
- int version, ret, cflag = ZFS_CMD_COMPAT_NONE;
-
- if (zfs_ioctl_version == -1)
- zfs_ioctl_version = get_zfs_ioctl_version();
-
- if (zfs_ioctl_version == ZFS_IOCVER_DEADMAN)
- cflag = ZFS_CMD_COMPAT_DEADMAN;
-
- /*
- * If vfs.zfs.version.ioctl is not defined, assume we have v28
- * compatible binaries and use vfs.zfs.version.spa to test for v15
- */
- if (zfs_ioctl_version < ZFS_IOCVER_DEADMAN) {
- cflag = ZFS_CMD_COMPAT_V28;
- zfs_kernel_version_size = sizeof(zfs_kernel_version);
-
- if (zfs_kernel_version == 0) {
- sysctlbyname("vfs.zfs.version.spa",
- &zfs_kernel_version,
- &zfs_kernel_version_size, NULL, 0);
- }
-
- if (zfs_kernel_version == SPA_VERSION_15 ||
- zfs_kernel_version == SPA_VERSION_14 ||
- zfs_kernel_version == SPA_VERSION_13)
- cflag = ZFS_CMD_COMPAT_V15;
- }
-
- oldsize = zc->zc_nvlist_dst_size;
- ret = zcmd_ioctl_compat(fd, request, zc, cflag);
-
- if (ret == 0 && oldsize < zc->zc_nvlist_dst_size) {
- ret = -1;
- errno = ENOMEM;
- }
-
- return (ret);
-}
#define ioctl(fd, ioc, zc) zcmd_ioctl((fd), (ioc), (zc))
#ifdef __cplusplus