From owner-svn-src-projects@FreeBSD.ORG Mon Mar 18 11:06:35 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 9C4FD824; Mon, 18 Mar 2013 11:06:35 +0000 (UTC) (envelope-from mm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 80D29A79; Mon, 18 Mar 2013 11:06:35 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r2I9WUIX081961; Mon, 18 Mar 2013 09:32:30 GMT (envelope-from mm@svn.freebsd.org) Received: (from mm@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r2I9WTb1081954; Mon, 18 Mar 2013 09:32:29 GMT (envelope-from mm@svn.freebsd.org) Message-Id: <201303180932.r2I9WTb1081954@svn.freebsd.org> From: Martin Matuska Date: Mon, 18 Mar 2013 09:32:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r248461 - in projects/libzfs_core: cddl/contrib/opensolaris/lib/libzfs/common cddl/contrib/opensolaris/lib/libzfs_core/common cddl/lib/libzfs cddl/lib/libzfs_core sys/cddl/contrib/opens... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 11:06:35 -0000 Author: mm Date: Mon Mar 18 09:32:29 2013 New Revision: 248461 URL: http://svnweb.freebsd.org/changeset/base/248461 Log: Move common zfs ioctl compatibility functions (userland) into libzfs_compat.c Introduce additional constants for zfs ioctl versions Added: projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.c Modified: projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c projects/libzfs_core/cddl/lib/libzfs/Makefile projects/libzfs_core/cddl/lib/libzfs_core/Makefile projects/libzfs_core/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h Added: projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.c Mon Mar 18 09:32:29 2013 (r248461) @@ -0,0 +1,103 @@ +/* + * CDDL HEADER SART + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2013 Martin Matuska . All rights reserved. + */ + +#include "libzfs_compat.h" + +int zfs_ioctl_version = ZFS_IOCVER_UNDEF; +static int zfs_spa_version = -1; + +/* + * Get zfs_ioctl_version + */ +int +get_zfs_ioctl_version(void) +{ + size_t ver_size; + int ver = ZFS_IOCVER_NONE; + + ver_size = sizeof(ver); + sysctlbyname("vfs.zfs.version.ioctl", &ver, &ver_size, NULL, 0); + + return (ver); +} + +/* + * Get the SPA version + */ +static int +get_zfs_spa_version(void) +{ + size_t ver_size; + int ver = 0; + + ver_size = sizeof(ver); + sysctlbyname("vfs.zfs.version.spa", &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. + */ +int +zcmd_ioctl(int fd, int request, zfs_cmd_t *zc) +{ + size_t oldsize; + int ret, cflag = ZFS_CMD_COMPAT_NONE; + + if (zfs_ioctl_version == ZFS_IOCVER_UNDEF) + 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; + + if (zfs_spa_version < 0) + zfs_spa_version = get_zfs_spa_version(); + + if (zfs_spa_version == SPA_VERSION_15 || + zfs_spa_version == SPA_VERSION_14 || + zfs_spa_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); +} Modified: projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h ============================================================================== --- projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h Mon Mar 18 08:22:35 2013 (r248460) +++ projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_compat.h Mon Mar 18 09:32:29 2013 (r248461) @@ -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 Modified: projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c ============================================================================== --- projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c Mon Mar 18 08:22:35 2013 (r248460) +++ projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c Mon Mar 18 09:32:29 2013 (r248461) @@ -88,7 +88,7 @@ #include "libzfs_compat.h" #ifdef __FreeBSD__ -int lzc_ioctl_version = -1; +extern int zfs_ioctl_version; #endif static int g_fd; @@ -140,10 +140,10 @@ lzc_ioctl(zfs_ioc_t ioc, const char *nam (void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name)); #ifdef __FreeBSD__ - if (lzc_ioctl_version == -1) - lzc_ioctl_version = get_zfs_ioctl_version(); + if (zfs_ioctl_version == ZFS_IOCVER_UNDEF) + zfs_ioctl_version = get_zfs_ioctl_version(); - if (lzc_ioctl_version < ZFS_IOCVER_LZC) { + if (zfs_ioctl_version < ZFS_IOCVER_LZC) { oldsource = source; error = lzc_compat_pre(&zc, &ioc, &source); if (error) @@ -190,7 +190,7 @@ lzc_ioctl(zfs_ioc_t ioc, const char *nam } #ifdef __FreeBSD__ - if (lzc_ioctl_version < ZFS_IOCVER_LZC) + if (zfs_ioctl_version < ZFS_IOCVER_LZC) lzc_compat_post(&zc, ioc); #endif if (zc.zc_nvlist_dst_filled) { @@ -200,12 +200,12 @@ lzc_ioctl(zfs_ioc_t ioc, const char *nam *resultp = NULL; } #ifdef __FreeBSD__ - if (lzc_ioctl_version < ZFS_IOCVER_LZC) + if (zfs_ioctl_version < ZFS_IOCVER_LZC) lzc_compat_outnvl(&zc, ioc, resultp); #endif out: #ifdef __FreeBSD__ - if (lzc_ioctl_version < ZFS_IOCVER_LZC) { + if (zfs_ioctl_version < ZFS_IOCVER_LZC) { if (source != oldsource) nvlist_free(source); source = oldsource; Modified: projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c ============================================================================== --- projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c Mon Mar 18 08:22:35 2013 (r248460) +++ projects/libzfs_core/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core_compat.c Mon Mar 18 09:32:29 2013 (r248461) @@ -27,7 +27,7 @@ #include #include "libzfs_core_compat.h" -extern int lzc_ioctl_version; +extern int zfs_ioctl_version; int lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t *ioc, nvlist_t **source) @@ -40,7 +40,7 @@ lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t int error = 0; int pos; - if (lzc_ioctl_version >= ZFS_IOCVER_LZC) + if (zfs_ioctl_version >= ZFS_IOCVER_LZC) return (0); vecnum = *ioc; @@ -99,7 +99,7 @@ lzc_compat_pre(zfs_cmd_t *zc, zfs_ioc_t void lzc_compat_post(zfs_cmd_t *zc, const zfs_ioc_t ioc) { - if (lzc_ioctl_version >= ZFS_IOCVER_LZC) + if (zfs_ioctl_version >= ZFS_IOCVER_LZC) return; switch (ioc) { @@ -118,7 +118,7 @@ lzc_compat_outnvl(zfs_cmd_t *zc, const z { nvlist_t *nvl; - if (lzc_ioctl_version >= ZFS_IOCVER_LZC) + if (zfs_ioctl_version >= ZFS_IOCVER_LZC) return (0); switch (ioc) { Modified: projects/libzfs_core/cddl/lib/libzfs/Makefile ============================================================================== --- projects/libzfs_core/cddl/lib/libzfs/Makefile Mon Mar 18 08:22:35 2013 (r248460) +++ projects/libzfs_core/cddl/lib/libzfs/Makefile Mon Mar 18 09:32:29 2013 (r248461) @@ -18,6 +18,7 @@ SRCS= deviceid.c \ zone.c SRCS+= libzfs_changelist.c \ + libzfs_compat.c \ libzfs_config.c \ libzfs_dataset.c \ libzfs_diff.c \ Modified: projects/libzfs_core/cddl/lib/libzfs_core/Makefile ============================================================================== --- projects/libzfs_core/cddl/lib/libzfs_core/Makefile Mon Mar 18 08:22:35 2013 (r248460) +++ projects/libzfs_core/cddl/lib/libzfs_core/Makefile Mon Mar 18 09:32:29 2013 (r248461) @@ -4,12 +4,16 @@ .PATH: ${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/zfs .PATH: ${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs .PATH: ${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzfs_core/common +.PATH: ${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzfs/common LIB= zfs_core DPADD= ${LIBNVPAIR} LDADD= -lnvpair -SRCS= libzfs_core.c libzfs_core_compat.c +SRCS= libzfs_core.c \ + libzfs_core_compat.c + +SRCS+= libzfs_compat.c WARNS?= 0 CSTD= c99 Modified: projects/libzfs_core/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h ============================================================================== --- projects/libzfs_core/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h Mon Mar 18 08:22:35 2013 (r248460) +++ projects/libzfs_core/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h Mon Mar 18 09:32:29 2013 (r248461) @@ -45,8 +45,10 @@ extern "C" { */ /* ioctl versions for vfs.zfs.version.ioctl */ -#define ZFS_IOCVER_LZC 2 +#define ZFS_IOCVER_UNDEF -1 +#define ZFS_IOCVER_NONE 0 #define ZFS_IOCVER_DEADMAN 1 +#define ZFS_IOCVER_LZC 2 #define ZFS_IOCVER_CURRENT ZFS_IOCVER_LZC /* compatibility conversion flag */