summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/common/zfs
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-10-12 11:41:26 -0300
committerRenato Botelho <renato@netgate.com>2016-10-12 11:41:26 -0300
commitcb642130dfc50717bb970a104c44aa7690930a38 (patch)
treec67f108534217a209198c6b201949ecc73acaba3 /sys/cddl/contrib/opensolaris/common/zfs
parent5dd7ab172435dc99e1abc1f7d73fd5e720050bbc (diff)
parentcd04fbc5e631c6b3e80a14eb7044c3be35fba2d2 (diff)
downloadFreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.zip
FreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.tar.gz
Merge remote-tracking branch 'origin/stable/11' into devel-11
Diffstat (limited to 'sys/cddl/contrib/opensolaris/common/zfs')
-rw-r--r--sys/cddl/contrib/opensolaris/common/zfs/zfs_deleg.c6
-rw-r--r--sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c96
-rw-r--r--sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h47
-rw-r--r--sys/cddl/contrib/opensolaris/common/zfs/zfs_namecheck.c18
4 files changed, 148 insertions, 19 deletions
diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_deleg.c b/sys/cddl/contrib/opensolaris/common/zfs/zfs_deleg.c
index 49540ea..b66fac8 100644
--- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_deleg.c
+++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_deleg.c
@@ -22,6 +22,7 @@
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2010 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
*/
#include <sys/zfs_context.h>
@@ -177,8 +178,9 @@ zfs_deleg_verify_nvlist(nvlist_t *nvp)
nvpair_name(perm_name));
if (error)
return (-1);
- } while (perm_name = nvlist_next_nvpair(perms, perm_name));
- } while (who = nvlist_next_nvpair(nvp, who));
+ } while ((perm_name = nvlist_next_nvpair(perms, perm_name))
+ != NULL);
+ } while ((who = nvlist_next_nvpair(nvp, who)) != NULL);
return (0);
}
diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c b/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
index 0d8971c..e5ac73f 100644
--- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
+++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
@@ -55,8 +55,52 @@ zfs_cmd_compat_get(zfs_cmd_t *zc, caddr_t addr, const int cflag)
zfs_cmd_zcmd_t *zcmd_c;
zfs_cmd_edbp_t *edbp_c;
zfs_cmd_resume_t *resume_c;
+ zfs_cmd_inlanes_t *inlanes_c;
switch (cflag) {
+ case ZFS_CMD_COMPAT_INLANES:
+ inlanes_c = (void *)addr;
+ /* zc */
+ strlcpy(zc->zc_name, inlanes_c->zc_name, MAXPATHLEN);
+ strlcpy(zc->zc_value, inlanes_c->zc_value, MAXPATHLEN * 2);
+ strlcpy(zc->zc_string, inlanes_c->zc_string, MAXPATHLEN);
+
+#define FIELD_COPY(field) zc->field = inlanes_c->field
+ FIELD_COPY(zc_nvlist_src);
+ FIELD_COPY(zc_nvlist_src_size);
+ FIELD_COPY(zc_nvlist_dst);
+ FIELD_COPY(zc_nvlist_dst_size);
+ FIELD_COPY(zc_nvlist_dst_filled);
+ FIELD_COPY(zc_pad2);
+ FIELD_COPY(zc_history);
+ FIELD_COPY(zc_guid);
+ FIELD_COPY(zc_nvlist_conf);
+ FIELD_COPY(zc_nvlist_conf_size);
+ FIELD_COPY(zc_cookie);
+ FIELD_COPY(zc_objset_type);
+ FIELD_COPY(zc_perm_action);
+ FIELD_COPY(zc_history_len);
+ FIELD_COPY(zc_history_offset);
+ FIELD_COPY(zc_obj);
+ FIELD_COPY(zc_iflags);
+ FIELD_COPY(zc_share);
+ FIELD_COPY(zc_jailid);
+ FIELD_COPY(zc_objset_stats);
+ FIELD_COPY(zc_begin_record);
+ FIELD_COPY(zc_inject_record);
+ FIELD_COPY(zc_defer_destroy);
+ FIELD_COPY(zc_flags);
+ FIELD_COPY(zc_action_handle);
+ FIELD_COPY(zc_cleanup_fd);
+ FIELD_COPY(zc_simple);
+ FIELD_COPY(zc_resumable);
+ FIELD_COPY(zc_sendobj);
+ FIELD_COPY(zc_fromobj);
+ FIELD_COPY(zc_createtxg);
+ FIELD_COPY(zc_stat);
+#undef FIELD_COPY
+ break;
+
case ZFS_CMD_COMPAT_RESUME:
resume_c = (void *)addr;
/* zc */
@@ -434,8 +478,50 @@ zfs_cmd_compat_put(zfs_cmd_t *zc, caddr_t addr, const int request,
zfs_cmd_zcmd_t *zcmd_c;
zfs_cmd_edbp_t *edbp_c;
zfs_cmd_resume_t *resume_c;
+ zfs_cmd_inlanes_t *inlanes_c;
switch (cflag) {
+ case ZFS_CMD_COMPAT_INLANES:
+ inlanes_c = (void *)addr;
+ strlcpy(inlanes_c->zc_name, zc->zc_name, MAXPATHLEN);
+ strlcpy(inlanes_c->zc_value, zc->zc_value, MAXPATHLEN * 2);
+ strlcpy(inlanes_c->zc_string, zc->zc_string, MAXPATHLEN);
+
+#define FIELD_COPY(field) inlanes_c->field = zc->field
+ FIELD_COPY(zc_nvlist_src);
+ FIELD_COPY(zc_nvlist_src_size);
+ FIELD_COPY(zc_nvlist_dst);
+ FIELD_COPY(zc_nvlist_dst_size);
+ FIELD_COPY(zc_nvlist_dst_filled);
+ FIELD_COPY(zc_pad2);
+ FIELD_COPY(zc_history);
+ FIELD_COPY(zc_guid);
+ FIELD_COPY(zc_nvlist_conf);
+ FIELD_COPY(zc_nvlist_conf_size);
+ FIELD_COPY(zc_cookie);
+ FIELD_COPY(zc_objset_type);
+ FIELD_COPY(zc_perm_action);
+ FIELD_COPY(zc_history_len);
+ FIELD_COPY(zc_history_offset);
+ FIELD_COPY(zc_obj);
+ FIELD_COPY(zc_iflags);
+ FIELD_COPY(zc_share);
+ FIELD_COPY(zc_jailid);
+ FIELD_COPY(zc_objset_stats);
+ FIELD_COPY(zc_begin_record);
+ FIELD_COPY(zc_inject_record);
+ FIELD_COPY(zc_defer_destroy);
+ FIELD_COPY(zc_flags);
+ FIELD_COPY(zc_action_handle);
+ FIELD_COPY(zc_cleanup_fd);
+ FIELD_COPY(zc_simple);
+ FIELD_COPY(zc_sendobj);
+ FIELD_COPY(zc_fromobj);
+ FIELD_COPY(zc_createtxg);
+ FIELD_COPY(zc_stat);
+#undef FIELD_COPY
+ break;
+
case ZFS_CMD_COMPAT_RESUME:
resume_c = (void *)addr;
strlcpy(resume_c->zc_name, zc->zc_name, MAXPATHLEN);
@@ -987,6 +1073,12 @@ zcmd_ioctl_compat(int fd, int request, zfs_cmd_t *zc, const int cflag)
zp.zfs_cmd_size = sizeof(zfs_cmd_t);
zp.zfs_ioctl_version = ZFS_IOCVER_CURRENT;
return (ioctl(fd, ncmd, &zp));
+ case ZFS_CMD_COMPAT_INLANES:
+ ncmd = _IOWR('Z', request, struct zfs_iocparm);
+ zp.zfs_cmd = (uint64_t)zc;
+ zp.zfs_cmd_size = sizeof(zfs_cmd_inlanes_t);
+ zp.zfs_ioctl_version = ZFS_IOCVER_INLANES;
+ return (ioctl(fd, ncmd, &zp));
case ZFS_CMD_COMPAT_RESUME:
ncmd = _IOWR('Z', request, struct zfs_iocparm);
zp.zfs_cmd = (uint64_t)zc;
@@ -1104,7 +1196,7 @@ zfs_ioctl_compat_innvl(zfs_cmd_t *zc, nvlist_t * innvl, const int vec,
if (cflag == ZFS_CMD_COMPAT_NONE || cflag == ZFS_CMD_COMPAT_LZC ||
cflag == ZFS_CMD_COMPAT_ZCMD || cflag == ZFS_CMD_COMPAT_EDBP ||
- cflag == ZFS_CMD_COMPAT_RESUME)
+ cflag == ZFS_CMD_COMPAT_RESUME || cflag == ZFS_CMD_COMPAT_INLANES)
goto out;
switch (vec) {
@@ -1257,7 +1349,7 @@ zfs_ioctl_compat_outnvl(zfs_cmd_t *zc, nvlist_t * outnvl, const int vec,
if (cflag == ZFS_CMD_COMPAT_NONE || cflag == ZFS_CMD_COMPAT_LZC ||
cflag == ZFS_CMD_COMPAT_ZCMD || cflag == ZFS_CMD_COMPAT_EDBP ||
- cflag == ZFS_CMD_COMPAT_RESUME)
+ cflag == ZFS_CMD_COMPAT_RESUME || cflag == ZFS_CMD_COMPAT_INLANES)
return (outnvl);
switch (vec) {
diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h b/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h
index 6f24380..61f1514 100644
--- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h
+++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h
@@ -54,7 +54,8 @@ extern "C" {
#define ZFS_IOCVER_EDBP 4
#define ZFS_IOCVER_RESUME 5
#define ZFS_IOCVER_INLANES 6
-#define ZFS_IOCVER_CURRENT ZFS_IOCVER_INLANES
+#define ZFS_IOCVER_PAD 7
+#define ZFS_IOCVER_CURRENT ZFS_IOCVER_PAD
/* compatibility conversion flag */
#define ZFS_CMD_COMPAT_NONE 0
@@ -65,6 +66,7 @@ extern "C" {
#define ZFS_CMD_COMPAT_ZCMD 5
#define ZFS_CMD_COMPAT_EDBP 6
#define ZFS_CMD_COMPAT_RESUME 7
+#define ZFS_CMD_COMPAT_INLANES 8
#define ZFS_IOC_COMPAT_PASS 254
#define ZFS_IOC_COMPAT_FAIL 255
@@ -355,6 +357,49 @@ typedef struct zfs_cmd_resume {
zfs_stat_t zc_stat;
} zfs_cmd_resume_t;
+typedef struct zfs_cmd_inlanes {
+ char zc_name[MAXPATHLEN]; /* name of pool or dataset */
+ uint64_t zc_nvlist_src; /* really (char *) */
+ uint64_t zc_nvlist_src_size;
+ uint64_t zc_nvlist_dst; /* really (char *) */
+ uint64_t zc_nvlist_dst_size;
+ boolean_t zc_nvlist_dst_filled; /* put an nvlist in dst? */
+ int zc_pad2;
+
+ /*
+ * The following members are for legacy ioctls which haven't been
+ * converted to the new method.
+ */
+ uint64_t zc_history; /* really (char *) */
+ char zc_value[MAXPATHLEN * 2];
+ char zc_string[MAXNAMELEN];
+ uint64_t zc_guid;
+ uint64_t zc_nvlist_conf; /* really (char *) */
+ uint64_t zc_nvlist_conf_size;
+ uint64_t zc_cookie;
+ uint64_t zc_objset_type;
+ uint64_t zc_perm_action;
+ uint64_t zc_history_len;
+ uint64_t zc_history_offset;
+ uint64_t zc_obj;
+ uint64_t zc_iflags; /* internal to zfs(7fs) */
+ zfs_share_t zc_share;
+ uint64_t zc_jailid;
+ dmu_objset_stats_t zc_objset_stats;
+ dmu_replay_record_t zc_begin_record;
+ zinject_record_t zc_inject_record;
+ uint32_t zc_defer_destroy;
+ uint32_t zc_flags;
+ uint64_t zc_action_handle;
+ int zc_cleanup_fd;
+ uint8_t zc_simple;
+ boolean_t zc_resumable;
+ uint64_t zc_sendobj;
+ uint64_t zc_fromobj;
+ uint64_t zc_createtxg;
+ zfs_stat_t zc_stat;
+} zfs_cmd_inlanes_t;
+
#ifdef _KERNEL
unsigned static long zfs_ioctl_v15_to_v28[] = {
0, /* 0 ZFS_IOC_POOL_CREATE */
diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_namecheck.c b/sys/cddl/contrib/opensolaris/common/zfs/zfs_namecheck.c
index a32955f..439d449 100644
--- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_namecheck.c
+++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_namecheck.c
@@ -69,7 +69,7 @@ zfs_component_namecheck(const char *path, namecheck_err_t *why, char *what)
{
const char *loc;
- if (strlen(path) >= MAXNAMELEN) {
+ if (strlen(path) >= ZFS_MAX_DATASET_NAME_LEN) {
if (why)
*why = NAME_ERR_TOOLONG;
return (-1);
@@ -140,14 +140,9 @@ dataset_namecheck(const char *path, namecheck_err_t *why, char *what)
/*
* Make sure the name is not too long.
- *
- * ZFS_MAXNAMELEN is the maximum dataset length used in the userland
- * which is the same as MAXNAMELEN used in the kernel.
- * If ZFS_MAXNAMELEN value is changed, make sure to cleanup all
- * places using MAXNAMELEN.
*/
- if (strlen(path) >= MAXNAMELEN) {
+ if (strlen(path) >= ZFS_MAX_DATASET_NAME_LEN) {
if (why)
*why = NAME_ERR_TOOLONG;
return (-1);
@@ -276,7 +271,7 @@ mountpoint_namecheck(const char *path, namecheck_err_t *why)
while (*end != '/' && *end != '\0')
end++;
- if (end - start >= MAXNAMELEN) {
+ if (end - start >= ZFS_MAX_DATASET_NAME_LEN) {
if (why)
*why = NAME_ERR_TOOLONG;
return (-1);
@@ -301,13 +296,8 @@ pool_namecheck(const char *pool, namecheck_err_t *why, char *what)
/*
* Make sure the name is not too long.
- *
- * ZPOOL_MAXNAMELEN is the maximum pool length used in the userland
- * which is the same as MAXNAMELEN used in the kernel.
- * If ZPOOL_MAXNAMELEN value is changed, make sure to cleanup all
- * places using MAXNAMELEN.
*/
- if (strlen(pool) >= MAXNAMELEN) {
+ if (strlen(pool) >= ZFS_MAX_DATASET_NAME_LEN) {
if (why)
*why = NAME_ERR_TOOLONG;
return (-1);
OpenPOWER on IntegriCloud