summaryrefslogtreecommitdiff
path: root/cddl
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2013-03-17 22:24:08 +0000
committerMartin Matuska <mm@FreeBSD.org>2013-03-17 22:24:08 +0000
commitd97b41582d8f4603222358f33b73d378388c3778 (patch)
tree7397a0f6925bc157850a1a7a5db99ce98102bdc1 /cddl
parentaf2e40ccd1ca76b646750f248ef7d05f221c9d02 (diff)
downloadsrc-test2-d97b41582d8f4603222358f33b73d378388c3778.tar.gz
src-test2-d97b41582d8f4603222358f33b73d378388c3778.zip
Notes
Diffstat (limited to 'cddl')
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h26
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c17
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h3
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c11
4 files changed, 36 insertions, 21 deletions
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
index 881737d898a1..400c81443be9 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h
@@ -32,8 +32,23 @@
extern "C" {
#endif
+static int zfs_ioctl_version = -1;
static int zfs_kernel_version = 0;
-static int zfs_ioctl_version = 0;
+
+/*
+ * 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
@@ -43,14 +58,11 @@ static int zfs_ioctl_version = 0;
static __inline int
zcmd_ioctl(int fd, int request, zfs_cmd_t *zc)
{
- size_t oldsize, zfs_kernel_version_size, zfs_ioctl_version_size;
+ size_t oldsize, zfs_kernel_version_size;
int version, ret, cflag = ZFS_CMD_COMPAT_NONE;
- zfs_ioctl_version_size = sizeof(zfs_ioctl_version);
- if (zfs_ioctl_version == 0) {
- sysctlbyname("vfs.zfs.version.ioctl", &zfs_ioctl_version,
- &zfs_ioctl_version_size, NULL, 0);
- }
+ if (zfs_ioctl_version == -1)
+ zfs_ioctl_version = get_zfs_ioctl_version();
if (zfs_ioctl_version == ZFS_IOCVER_DEADMAN)
cflag = ZFS_CMD_COMPAT_DEADMAN;
diff --git a/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c b/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
index c8b401e2f612..3319d20e7c72 100644
--- a/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
+++ b/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
@@ -84,10 +84,11 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/zfs_ioctl.h>
-#include <libzfs_compat.h>
+#include "libzfs_core_compat.h"
+#include "libzfs_compat.h"
#ifdef __FreeBSD__
-extern int zfs_ioctl_version;
+int lzc_ioctl_version = -1;
#endif
static int g_fd;
@@ -107,6 +108,7 @@ libzfs_core_init(void)
}
g_refcount++;
(void) pthread_mutex_unlock(&g_lock);
+
return (0);
}
@@ -138,7 +140,10 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name,
(void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name));
#ifdef __FreeBSD__
- if (zfs_ioctl_version < ZFS_IOCVER_LZC) {
+ if (lzc_ioctl_version == -1)
+ lzc_ioctl_version = get_zfs_ioctl_version();
+
+ if (lzc_ioctl_version < ZFS_IOCVER_LZC) {
oldsource = source;
error = lzc_compat_pre(&zc, &ioc, &source);
if (error)
@@ -185,7 +190,7 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name,
}
#ifdef __FreeBSD__
- if (zfs_ioctl_version < ZFS_IOCVER_LZC)
+ if (lzc_ioctl_version < ZFS_IOCVER_LZC)
lzc_compat_post(&zc, ioc);
#endif
if (zc.zc_nvlist_dst_filled) {
@@ -195,12 +200,12 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name,
*resultp = NULL;
}
#ifdef __FreeBSD__
- if (zfs_ioctl_version < ZFS_IOCVER_LZC)
+ if (lzc_ioctl_version < ZFS_IOCVER_LZC)
lzc_compat_outnvl(&zc, ioc, resultp);
#endif
out:
#ifdef __FreeBSD__
- if (zfs_ioctl_version < ZFS_IOCVER_LZC) {
+ if (lzc_ioctl_version < ZFS_IOCVER_LZC) {
if (source != oldsource)
nvlist_free(source);
source = oldsource;
diff --git a/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h b/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
index ee19d17af24f..c8bfbefbdaf5 100644
--- a/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
+++ b/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
@@ -31,9 +31,6 @@
#include <sys/param.h>
#include <sys/types.h>
#include <sys/fs/zfs.h>
-#ifdef __FreeBSD__
-#include "libzfs_core_compat.h"
-#endif
#ifdef __cplusplus
extern "C" {
diff --git a/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c b/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c
index e5eb7aeacc6f..0ab12b627f78 100644
--- a/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c
+++ b/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c
@@ -24,9 +24,10 @@
*/
#include <sys/zfs_ioctl.h>
-#include <libzfs_compat.h>
+#include <zfs_ioctl_compat.h>
+#include "libzfs_core_compat.h"
-extern int zfs_ioctl_version;
+extern int lzc_ioctl_version;
int
lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t *ioc, nvlist_t **source)
@@ -39,7 +40,7 @@ lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t *ioc, nvlist_t **source)
int error = 0;
int pos;
- if (zfs_ioctl_version >= ZFS_IOCVER_LZC)
+ if (lzc_ioctl_version >= ZFS_IOCVER_LZC)
return (0);
vecnum = *ioc;
@@ -98,7 +99,7 @@ lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t *ioc, nvlist_t **source)
void
lzc_compat_post(zfs_cmd_t *zc, const zfs_ioc_t ioc)
{
- if (zfs_ioctl_version >= ZFS_IOCVER_LZC)
+ if (lzc_ioctl_version >= ZFS_IOCVER_LZC)
return;
switch (ioc) {
@@ -117,7 +118,7 @@ lzc_compat_outnvl(zfs_cmd_t *zc, const zfs_ioc_t ioc, nvlist_t **outnvl)
{
nvlist_t *nvl;
- if (zfs_ioctl_version >= ZFS_IOCVER_LZC)
+ if (lzc_ioctl_version >= ZFS_IOCVER_LZC)
return (0);
switch (ioc) {