Fix working with zfs_ioctl_version in libzfs_compat.h and include mirror

lzc_ioctl_version in libzfs_core
This commit is contained in:
Martin Matuska 2013-03-17 22:24:08 +00:00
parent af2e40ccd1
commit d97b41582d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/libzfs_core/; revision=248445
4 changed files with 36 additions and 21 deletions

View File

@ -32,8 +32,23 @@
extern "C" { extern "C" {
#endif #endif
static int zfs_ioctl_version = -1;
static int zfs_kernel_version = 0; 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 * This is FreeBSD version of ioctl, because Solaris' ioctl() updates
@ -43,14 +58,11 @@ static int zfs_ioctl_version = 0;
static __inline int static __inline int
zcmd_ioctl(int fd, int request, zfs_cmd_t *zc) 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; int version, ret, cflag = ZFS_CMD_COMPAT_NONE;
zfs_ioctl_version_size = sizeof(zfs_ioctl_version); if (zfs_ioctl_version == -1)
if (zfs_ioctl_version == 0) { zfs_ioctl_version = get_zfs_ioctl_version();
sysctlbyname("vfs.zfs.version.ioctl", &zfs_ioctl_version,
&zfs_ioctl_version_size, NULL, 0);
}
if (zfs_ioctl_version == ZFS_IOCVER_DEADMAN) if (zfs_ioctl_version == ZFS_IOCVER_DEADMAN)
cflag = ZFS_CMD_COMPAT_DEADMAN; cflag = ZFS_CMD_COMPAT_DEADMAN;

View File

@ -84,10 +84,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/zfs_ioctl.h> #include <sys/zfs_ioctl.h>
#include <libzfs_compat.h> #include "libzfs_core_compat.h"
#include "libzfs_compat.h"
#ifdef __FreeBSD__ #ifdef __FreeBSD__
extern int zfs_ioctl_version; int lzc_ioctl_version = -1;
#endif #endif
static int g_fd; static int g_fd;
@ -107,6 +108,7 @@ libzfs_core_init(void)
} }
g_refcount++; g_refcount++;
(void) pthread_mutex_unlock(&g_lock); (void) pthread_mutex_unlock(&g_lock);
return (0); 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)); (void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name));
#ifdef __FreeBSD__ #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; oldsource = source;
error = lzc_compat_pre(&zc, &ioc, &source); error = lzc_compat_pre(&zc, &ioc, &source);
if (error) if (error)
@ -185,7 +190,7 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name,
} }
#ifdef __FreeBSD__ #ifdef __FreeBSD__
if (zfs_ioctl_version < ZFS_IOCVER_LZC) if (lzc_ioctl_version < ZFS_IOCVER_LZC)
lzc_compat_post(&zc, ioc); lzc_compat_post(&zc, ioc);
#endif #endif
if (zc.zc_nvlist_dst_filled) { if (zc.zc_nvlist_dst_filled) {
@ -195,12 +200,12 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name,
*resultp = NULL; *resultp = NULL;
} }
#ifdef __FreeBSD__ #ifdef __FreeBSD__
if (zfs_ioctl_version < ZFS_IOCVER_LZC) if (lzc_ioctl_version < ZFS_IOCVER_LZC)
lzc_compat_outnvl(&zc, ioc, resultp); lzc_compat_outnvl(&zc, ioc, resultp);
#endif #endif
out: out:
#ifdef __FreeBSD__ #ifdef __FreeBSD__
if (zfs_ioctl_version < ZFS_IOCVER_LZC) { if (lzc_ioctl_version < ZFS_IOCVER_LZC) {
if (source != oldsource) if (source != oldsource)
nvlist_free(source); nvlist_free(source);
source = oldsource; source = oldsource;

View File

@ -31,9 +31,6 @@
#include <sys/param.h> #include <sys/param.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/fs/zfs.h> #include <sys/fs/zfs.h>
#ifdef __FreeBSD__
#include "libzfs_core_compat.h"
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -24,9 +24,10 @@
*/ */
#include <sys/zfs_ioctl.h> #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 int
lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t *ioc, nvlist_t **source) 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 error = 0;
int pos; int pos;
if (zfs_ioctl_version >= ZFS_IOCVER_LZC) if (lzc_ioctl_version >= ZFS_IOCVER_LZC)
return (0); return (0);
vecnum = *ioc; vecnum = *ioc;
@ -98,7 +99,7 @@ lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t *ioc, nvlist_t **source)
void void
lzc_compat_post(zfs_cmd_t *zc, const zfs_ioc_t ioc) 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; return;
switch (ioc) { switch (ioc) {
@ -117,7 +118,7 @@ lzc_compat_outnvl(zfs_cmd_t *zc, const zfs_ioc_t ioc, nvlist_t **outnvl)
{ {
nvlist_t *nvl; nvlist_t *nvl;
if (zfs_ioctl_version >= ZFS_IOCVER_LZC) if (lzc_ioctl_version >= ZFS_IOCVER_LZC)
return (0); return (0);
switch (ioc) { switch (ioc) {