Fix working with zfs_ioctl_version in libzfs_compat.h and include mirror
lzc_ioctl_version in libzfs_core
This commit is contained in:
parent
af2e40ccd1
commit
d97b41582d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/libzfs_core/; revision=248445
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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" {
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user