usr/src/lib/libzfs/common/libzfs_util.c
author Jim Dunham <James.Dunham@Sun.COM>
Tue, 09 Mar 2010 15:50:06 -0500
changeset 11876 5fce03ad05c6
parent 11807 73a3c0d27389
child 12296 7cf402a7f374
permissions -rw-r--r--
PSARC/2010/006 EOF of iSCSI Target Daemon 6914623 Remove iSCSI Target Daemon from ON Consolidation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1162
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1162
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11022
diff changeset
    22
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
 * Internal utility routines for the ZFS library.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <errno.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <fcntl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <libintl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <stdarg.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <stdio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <stdlib.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <strings.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <unistd.h>
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
    38
#include <ctype.h>
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
    39
#include <math.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include <sys/mnttab.h>
3635
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
    41
#include <sys/mntent.h>
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
    42
#include <sys/types.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#include <libzfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
#include "libzfs_impl.h"
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4715
diff changeset
    47
#include "zfs_prop.h"
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    49
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    50
libzfs_errno(libzfs_handle_t *hdl)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    51
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    52
	return (hdl->libzfs_error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    53
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    55
const char *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    56
libzfs_error_action(libzfs_handle_t *hdl)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    57
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    58
	return (hdl->libzfs_action);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    59
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    60
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    61
const char *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    62
libzfs_error_description(libzfs_handle_t *hdl)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    63
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    64
	if (hdl->libzfs_desc[0] != '\0')
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    65
		return (hdl->libzfs_desc);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    67
	switch (hdl->libzfs_error) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    68
	case EZFS_NOMEM:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    69
		return (dgettext(TEXT_DOMAIN, "out of memory"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    70
	case EZFS_BADPROP:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    71
		return (dgettext(TEXT_DOMAIN, "invalid property value"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    72
	case EZFS_PROPREADONLY:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    73
		return (dgettext(TEXT_DOMAIN, "read only property"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    74
	case EZFS_PROPTYPE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    75
		return (dgettext(TEXT_DOMAIN, "property doesn't apply to "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    76
		    "datasets of this type"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    77
	case EZFS_PROPNONINHERIT:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    78
		return (dgettext(TEXT_DOMAIN, "property cannot be inherited"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    79
	case EZFS_PROPSPACE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    80
		return (dgettext(TEXT_DOMAIN, "invalid quota or reservation"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    81
	case EZFS_BADTYPE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    82
		return (dgettext(TEXT_DOMAIN, "operation not applicable to "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    83
		    "datasets of this type"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    84
	case EZFS_BUSY:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    85
		return (dgettext(TEXT_DOMAIN, "pool or dataset is busy"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    86
	case EZFS_EXISTS:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    87
		return (dgettext(TEXT_DOMAIN, "pool or dataset exists"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    88
	case EZFS_NOENT:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    89
		return (dgettext(TEXT_DOMAIN, "no such pool or dataset"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    90
	case EZFS_BADSTREAM:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    91
		return (dgettext(TEXT_DOMAIN, "invalid backup stream"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    92
	case EZFS_DSREADONLY:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    93
		return (dgettext(TEXT_DOMAIN, "dataset is read only"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    94
	case EZFS_VOLTOOBIG:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    95
		return (dgettext(TEXT_DOMAIN, "volume size exceeds limit for "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    96
		    "this system"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    97
	case EZFS_INVALIDNAME:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    98
		return (dgettext(TEXT_DOMAIN, "invalid name"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    99
	case EZFS_BADRESTORE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   100
		return (dgettext(TEXT_DOMAIN, "unable to restore to "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   101
		    "destination"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   102
	case EZFS_BADBACKUP:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   103
		return (dgettext(TEXT_DOMAIN, "backup failed"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   104
	case EZFS_BADTARGET:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   105
		return (dgettext(TEXT_DOMAIN, "invalid target vdev"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   106
	case EZFS_NODEVICE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   107
		return (dgettext(TEXT_DOMAIN, "no such device in pool"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   108
	case EZFS_BADDEV:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   109
		return (dgettext(TEXT_DOMAIN, "invalid device"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   110
	case EZFS_NOREPLICAS:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   111
		return (dgettext(TEXT_DOMAIN, "no valid replicas"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   112
	case EZFS_RESILVERING:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   113
		return (dgettext(TEXT_DOMAIN, "currently resilvering"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   114
	case EZFS_BADVERSION:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   115
		return (dgettext(TEXT_DOMAIN, "unsupported version"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   116
	case EZFS_POOLUNAVAIL:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   117
		return (dgettext(TEXT_DOMAIN, "pool is unavailable"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   118
	case EZFS_DEVOVERFLOW:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   119
		return (dgettext(TEXT_DOMAIN, "too many devices in one vdev"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   120
	case EZFS_BADPATH:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   121
		return (dgettext(TEXT_DOMAIN, "must be an absolute path"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   122
	case EZFS_CROSSTARGET:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   123
		return (dgettext(TEXT_DOMAIN, "operation crosses datasets or "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   124
		    "pools"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   125
	case EZFS_ZONED:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   126
		return (dgettext(TEXT_DOMAIN, "dataset in use by local zone"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   127
	case EZFS_MOUNTFAILED:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   128
		return (dgettext(TEXT_DOMAIN, "mount failed"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   129
	case EZFS_UMOUNTFAILED:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   130
		return (dgettext(TEXT_DOMAIN, "umount failed"));
3126
4f4fb617fdd0 PSARC 2006/622 iSCSI/ZFS Integration
ahl
parents: 2926
diff changeset
   131
	case EZFS_UNSHARENFSFAILED:
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   132
		return (dgettext(TEXT_DOMAIN, "unshare(1M) failed"));
3126
4f4fb617fdd0 PSARC 2006/622 iSCSI/ZFS Integration
ahl
parents: 2926
diff changeset
   133
	case EZFS_SHARENFSFAILED:
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   134
		return (dgettext(TEXT_DOMAIN, "share(1M) failed"));
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   135
	case EZFS_UNSHARESMBFAILED:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   136
		return (dgettext(TEXT_DOMAIN, "smb remove share failed"));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   137
	case EZFS_SHARESMBFAILED:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   138
		return (dgettext(TEXT_DOMAIN, "smb add share failed"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   139
	case EZFS_PERM:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   140
		return (dgettext(TEXT_DOMAIN, "permission denied"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   141
	case EZFS_NOSPC:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   142
		return (dgettext(TEXT_DOMAIN, "out of space"));
11807
73a3c0d27389 6911541 'zfs mount' coredump
Sam Falkner <Sam.Falkner@Sun.COM>
parents: 11422
diff changeset
   143
	case EZFS_FAULT:
73a3c0d27389 6911541 'zfs mount' coredump
Sam Falkner <Sam.Falkner@Sun.COM>
parents: 11422
diff changeset
   144
		return (dgettext(TEXT_DOMAIN, "bad address"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   145
	case EZFS_IO:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   146
		return (dgettext(TEXT_DOMAIN, "I/O error"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   147
	case EZFS_INTR:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   148
		return (dgettext(TEXT_DOMAIN, "signal received"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   149
	case EZFS_ISSPARE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   150
		return (dgettext(TEXT_DOMAIN, "device is reserved as a hot "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   151
		    "spare"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   152
	case EZFS_INVALCONFIG:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   153
		return (dgettext(TEXT_DOMAIN, "invalid vdev configuration"));
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2082
diff changeset
   154
	case EZFS_RECURSIVE:
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2082
diff changeset
   155
		return (dgettext(TEXT_DOMAIN, "recursive dataset dependency"));
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
   156
	case EZFS_NOHISTORY:
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
   157
		return (dgettext(TEXT_DOMAIN, "no history available"));
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   158
	case EZFS_POOLPROPS:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   159
		return (dgettext(TEXT_DOMAIN, "failed to retrieve "
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   160
		    "pool properties"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   161
	case EZFS_POOL_NOTSUP:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   162
		return (dgettext(TEXT_DOMAIN, "operation not supported "
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   163
		    "on this type of pool"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   164
	case EZFS_POOL_INVALARG:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   165
		return (dgettext(TEXT_DOMAIN, "invalid argument for "
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   166
		    "this pool operation"));
3978
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
   167
	case EZFS_NAMETOOLONG:
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
   168
		return (dgettext(TEXT_DOMAIN, "dataset name is too long"));
4276
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   169
	case EZFS_OPENFAILED:
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   170
		return (dgettext(TEXT_DOMAIN, "open failed"));
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   171
	case EZFS_NOCAP:
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   172
		return (dgettext(TEXT_DOMAIN,
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   173
		    "disk capacity information could not be retrieved"));
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   174
	case EZFS_LABELFAILED:
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4180
diff changeset
   175
		return (dgettext(TEXT_DOMAIN, "write of label failed"));
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   176
	case EZFS_BADWHO:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   177
		return (dgettext(TEXT_DOMAIN, "invalid user/group"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   178
	case EZFS_BADPERM:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   179
		return (dgettext(TEXT_DOMAIN, "invalid permission"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   180
	case EZFS_BADPERMSET:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   181
		return (dgettext(TEXT_DOMAIN, "invalid permission set name"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   182
	case EZFS_NODELEGATION:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   183
		return (dgettext(TEXT_DOMAIN, "delegated administration is "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   184
		    "disabled on pool"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   185
	case EZFS_PERMRDONLY:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   186
		return (dgettext(TEXT_DOMAIN, "snapshot permissions cannot be"
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   187
		    " modified"));
5363
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5345
diff changeset
   188
	case EZFS_BADCACHE:
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5345
diff changeset
   189
		return (dgettext(TEXT_DOMAIN, "invalid or missing cache file"));
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5378
diff changeset
   190
	case EZFS_ISL2CACHE:
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5378
diff changeset
   191
		return (dgettext(TEXT_DOMAIN, "device is in use as a cache"));
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5860
diff changeset
   192
	case EZFS_VDEVNOTSUP:
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5860
diff changeset
   193
		return (dgettext(TEXT_DOMAIN, "vdev specification is not "
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5860
diff changeset
   194
		    "supported"));
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6865
diff changeset
   195
	case EZFS_NOTSUP:
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6865
diff changeset
   196
		return (dgettext(TEXT_DOMAIN, "operation not supported "
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6865
diff changeset
   197
		    "on this dataset"));
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7042
diff changeset
   198
	case EZFS_ACTIVE_SPARE:
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7042
diff changeset
   199
		return (dgettext(TEXT_DOMAIN, "pool has active shared spare "
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7042
diff changeset
   200
		    "device"));
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9396
diff changeset
   201
	case EZFS_UNPLAYED_LOGS:
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9396
diff changeset
   202
		return (dgettext(TEXT_DOMAIN, "log device has unplayed intent "
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9396
diff changeset
   203
		    "logs"));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 9701
diff changeset
   204
	case EZFS_REFTAG_RELE:
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 9701
diff changeset
   205
		return (dgettext(TEXT_DOMAIN, "no such tag on this dataset"));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 9701
diff changeset
   206
	case EZFS_REFTAG_HOLD:
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 9701
diff changeset
   207
		return (dgettext(TEXT_DOMAIN, "tag already exists on this "
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 9701
diff changeset
   208
		    "dataset"));
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
   209
	case EZFS_TAGTOOLONG:
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
   210
		return (dgettext(TEXT_DOMAIN, "tag too long"));
11007
216d8396182e PSARC/2009/557 ZFS send dedup
Lori Alt <Lori.Alt@Sun.COM>
parents: 10817
diff changeset
   211
	case EZFS_PIPEFAILED:
216d8396182e PSARC/2009/557 ZFS send dedup
Lori Alt <Lori.Alt@Sun.COM>
parents: 10817
diff changeset
   212
		return (dgettext(TEXT_DOMAIN, "pipe create failed"));
216d8396182e PSARC/2009/557 ZFS send dedup
Lori Alt <Lori.Alt@Sun.COM>
parents: 10817
diff changeset
   213
	case EZFS_THREADCREATEFAILED:
216d8396182e PSARC/2009/557 ZFS send dedup
Lori Alt <Lori.Alt@Sun.COM>
parents: 10817
diff changeset
   214
		return (dgettext(TEXT_DOMAIN, "thread create failed"));
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11022
diff changeset
   215
	case EZFS_POSTSPLIT_ONLINE:
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11022
diff changeset
   216
		return (dgettext(TEXT_DOMAIN, "disk was split from this pool "
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11022
diff changeset
   217
		    "into a new one"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   218
	case EZFS_UNKNOWN:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   219
		return (dgettext(TEXT_DOMAIN, "unknown error"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   220
	default:
2500
12e683f74751 6455228 zpool_mount_datasets() should take an additional flag
eschrock
parents: 2474
diff changeset
   221
		assert(hdl->libzfs_error == 0);
12e683f74751 6455228 zpool_mount_datasets() should take an additional flag
eschrock
parents: 2474
diff changeset
   222
		return (dgettext(TEXT_DOMAIN, "no error"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   223
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   224
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   225
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   226
/*PRINTFLIKE2*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
void
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   228
zfs_error_aux(libzfs_handle_t *hdl, const char *fmt, ...)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
	va_list ap;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
	va_start(ap, fmt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   234
	(void) vsnprintf(hdl->libzfs_desc, sizeof (hdl->libzfs_desc),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   235
	    fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   236
	hdl->libzfs_desc_active = 1;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
	va_end(ap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   241
static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   242
zfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   243
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   244
	(void) vsnprintf(hdl->libzfs_action, sizeof (hdl->libzfs_action),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   245
	    fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   246
	hdl->libzfs_error = error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   247
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   248
	if (hdl->libzfs_desc_active)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   249
		hdl->libzfs_desc_active = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   250
	else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   251
		hdl->libzfs_desc[0] = '\0';
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   252
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   253
	if (hdl->libzfs_printerr) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   254
		if (error == EZFS_UNKNOWN) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   255
			(void) fprintf(stderr, dgettext(TEXT_DOMAIN, "internal "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   256
			    "error: %s\n"), libzfs_error_description(hdl));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   257
			abort();
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   258
		}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   259
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   260
		(void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   261
		    libzfs_error_description(hdl));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   262
		if (error == EZFS_NOMEM)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   263
			exit(1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   264
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   265
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   266
3237
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   267
int
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   268
zfs_error(libzfs_handle_t *hdl, int error, const char *msg)
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   269
{
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   270
	return (zfs_error_fmt(hdl, error, "%s", msg));
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   271
}
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   272
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   273
/*PRINTFLIKE3*/
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   274
int
3237
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   275
zfs_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   276
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   277
	va_list ap;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   278
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   279
	va_start(ap, fmt);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   280
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   281
	zfs_verror(hdl, error, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   282
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   283
	va_end(ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   284
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   285
	return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   286
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   287
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   288
static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   289
zfs_common_error(libzfs_handle_t *hdl, int error, const char *fmt,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   290
    va_list ap)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   291
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   292
	switch (error) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   293
	case EPERM:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   294
	case EACCES:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   295
		zfs_verror(hdl, EZFS_PERM, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   296
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   297
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   298
	case ECANCELED:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   299
		zfs_verror(hdl, EZFS_NODELEGATION, fmt, ap);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   300
		return (-1);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   301
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   302
	case EIO:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   303
		zfs_verror(hdl, EZFS_IO, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   304
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   305
11807
73a3c0d27389 6911541 'zfs mount' coredump
Sam Falkner <Sam.Falkner@Sun.COM>
parents: 11422
diff changeset
   306
	case EFAULT:
73a3c0d27389 6911541 'zfs mount' coredump
Sam Falkner <Sam.Falkner@Sun.COM>
parents: 11422
diff changeset
   307
		zfs_verror(hdl, EZFS_FAULT, fmt, ap);
73a3c0d27389 6911541 'zfs mount' coredump
Sam Falkner <Sam.Falkner@Sun.COM>
parents: 11422
diff changeset
   308
		return (-1);
73a3c0d27389 6911541 'zfs mount' coredump
Sam Falkner <Sam.Falkner@Sun.COM>
parents: 11422
diff changeset
   309
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   310
	case EINTR:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   311
		zfs_verror(hdl, EZFS_INTR, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   312
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   313
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   314
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   315
	return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   316
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   317
3237
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   318
int
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   319
zfs_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   320
{
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   321
	return (zfs_standard_error_fmt(hdl, error, "%s", msg));
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   322
}
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   323
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   324
/*PRINTFLIKE3*/
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   325
int
3237
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   326
zfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
	va_list ap;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
	va_start(ap, fmt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   332
	if (zfs_common_error(hdl, error, fmt, ap) != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   333
		va_end(ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   334
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   335
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   336
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   337
	switch (error) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   338
	case ENXIO:
5807
8b40dde8cc40 6609780 zpool dump core when trying to destroy pool
ck153898
parents: 5450
diff changeset
   339
	case ENODEV:
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   340
		zfs_verror(hdl, EZFS_IO, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   341
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   342
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   343
	case ENOENT:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   344
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   345
		    "dataset does not exist"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   346
		zfs_verror(hdl, EZFS_NOENT, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   347
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   348
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   349
	case ENOSPC:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   350
	case EDQUOT:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   351
		zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   352
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   353
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   354
	case EEXIST:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   355
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   356
		    "dataset already exists"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   357
		zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   358
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   359
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   360
	case EBUSY:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   361
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   362
		    "dataset is busy"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   363
		zfs_verror(hdl, EZFS_BUSY, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   364
		break;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   365
	case EROFS:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   366
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   367
		    "snapshot permissions cannot be modified"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   368
		zfs_verror(hdl, EZFS_PERMRDONLY, fmt, ap);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   369
		break;
3978
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
   370
	case ENAMETOOLONG:
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
   371
		zfs_verror(hdl, EZFS_NAMETOOLONG, fmt, ap);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
   372
		break;
5860
4e1dc300d1d7 6580259 onnv ZFS panic with zfs_purgedir in zfs_dir.c
ck153898
parents: 5807
diff changeset
   373
	case ENOTSUP:
4e1dc300d1d7 6580259 onnv ZFS panic with zfs_purgedir in zfs_dir.c
ck153898
parents: 5807
diff changeset
   374
		zfs_verror(hdl, EZFS_BADVERSION, fmt, ap);
4e1dc300d1d7 6580259 onnv ZFS panic with zfs_purgedir in zfs_dir.c
ck153898
parents: 5807
diff changeset
   375
		break;
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   376
	case EAGAIN:
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   377
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   378
		    "pool I/O is currently suspended"));
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   379
		zfs_verror(hdl, EZFS_POOLUNAVAIL, fmt, ap);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   380
		break;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   381
	default:
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   382
		zfs_error_aux(hdl, strerror(error));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   383
		zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   384
		break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   386
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   387
	va_end(ap);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   388
	return (-1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   389
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
3237
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   391
int
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   392
zpool_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   393
{
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   394
	return (zpool_standard_error_fmt(hdl, error, "%s", msg));
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   395
}
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   396
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   397
/*PRINTFLIKE3*/
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   398
int
3237
98d0c28f2f5e 6480245 renaming a dataset to something with '%s' will cause segfault
lling
parents: 3126
diff changeset
   399
zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   401
	va_list ap;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   402
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   403
	va_start(ap, fmt);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   404
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   405
	if (zfs_common_error(hdl, error, fmt, ap) != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   406
		va_end(ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   407
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   408
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   409
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   410
	switch (error) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   411
	case ENODEV:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   412
		zfs_verror(hdl, EZFS_NODEVICE, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   413
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   414
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   415
	case ENOENT:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   416
		zfs_error_aux(hdl,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   417
		    dgettext(TEXT_DOMAIN, "no such pool or dataset"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   418
		zfs_verror(hdl, EZFS_NOENT, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   419
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   420
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   421
	case EEXIST:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   422
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   423
		    "pool already exists"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   424
		zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   425
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   426
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   427
	case EBUSY:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   428
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool is busy"));
7341
938f611658fc 6736545 cut and paste error in zpool_standard_error_fmt() trashes error
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 7214
diff changeset
   429
		zfs_verror(hdl, EZFS_BUSY, fmt, ap);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   430
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   431
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   432
	case ENXIO:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   433
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   434
		    "one or more devices is currently unavailable"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   435
		zfs_verror(hdl, EZFS_BADDEV, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   436
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   437
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   438
	case ENAMETOOLONG:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   439
		zfs_verror(hdl, EZFS_DEVOVERFLOW, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   440
		break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   441
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   442
	case ENOTSUP:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   443
		zfs_verror(hdl, EZFS_POOL_NOTSUP, fmt, ap);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   444
		break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   445
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   446
	case EINVAL:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   447
		zfs_verror(hdl, EZFS_POOL_INVALARG, fmt, ap);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   448
		break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   449
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   450
	case ENOSPC:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   451
	case EDQUOT:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   452
		zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   453
		return (-1);
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   454
	case EAGAIN:
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   455
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   456
		    "pool I/O is currently suspended"));
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   457
		zfs_verror(hdl, EZFS_POOLUNAVAIL, fmt, ap);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 8811
diff changeset
   458
		break;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   459
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   460
	default:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   461
		zfs_error_aux(hdl, strerror(error));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   462
		zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   463
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   464
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   465
	va_end(ap);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   466
	return (-1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   467
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
 * Display an out of memory error message and abort the current program.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   472
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   473
no_memory(libzfs_handle_t *hdl)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   475
	return (zfs_error(hdl, EZFS_NOMEM, "internal error"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   477
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
 * A safe form of malloc() which will die if the allocation fails.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   481
void *
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   482
zfs_alloc(libzfs_handle_t *hdl, size_t size)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
	void *data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
	if ((data = calloc(1, size)) == NULL)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   487
		(void) no_memory(hdl);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   488
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   489
	return (data);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   490
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   492
/*
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   493
 * A safe form of realloc(), which also zeroes newly allocated space.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   494
 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   495
void *
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   496
zfs_realloc(libzfs_handle_t *hdl, void *ptr, size_t oldsize, size_t newsize)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   497
{
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   498
	void *ret;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   499
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   500
	if ((ret = realloc(ptr, newsize)) == NULL) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   501
		(void) no_memory(hdl);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   502
		return (NULL);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   503
	}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   504
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   505
	bzero((char *)ret + oldsize, (newsize - oldsize));
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   506
	return (ret);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   507
}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   508
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   509
/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
 * A safe form of strdup() which will die if the allocation fails.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
char *
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   513
zfs_strdup(libzfs_handle_t *hdl, const char *str)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   515
	char *ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
	if ((ret = strdup(str)) == NULL)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   518
		(void) no_memory(hdl);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   522
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   524
 * Convert a number to an appropriately human-readable output.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   525
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
zfs_nicenum(uint64_t num, char *buf, size_t buflen)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
	uint64_t n = num;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
	int index = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
	char u;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
	while (n >= 1024) {
1162
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   534
		n /= 1024;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
		index++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
	u = " KMGTPE"[index];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
1162
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   540
	if (index == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
		(void) snprintf(buf, buflen, "%llu", n);
1162
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   542
	} else if ((num & ((1ULL << 10 * index) - 1)) == 0) {
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   543
		/*
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   544
		 * If this is an even multiple of the base, always display
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   545
		 * without any decimal precision.
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   546
		 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
		(void) snprintf(buf, buflen, "%llu%c", n, u);
1162
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   548
	} else {
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   549
		/*
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   550
		 * We want to choose a precision that reflects the best choice
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   551
		 * for fitting in 5 characters.  This can get rather tricky when
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   552
		 * we have numbers that are very close to an order of magnitude.
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   553
		 * For example, when displaying 10239 (which is really 9.999K),
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   554
		 * we want only a single place of precision for 10.0K.  We could
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   555
		 * develop some complex heuristics for this, but it's much
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   556
		 * easier just to try each combination in turn.
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   557
		 */
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   558
		int i;
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   559
		for (i = 2; i >= 0; i--) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   560
			if (snprintf(buf, buflen, "%.*f%c", i,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   561
			    (double)num / (1ULL << 10 * index), u) <= 5)
1162
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   562
				break;
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   563
		}
38b998160113 6353528 'Short' property name should be lowercase
eschrock
parents: 789
diff changeset
   564
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   566
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   567
void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   568
libzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   569
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   570
	hdl->libzfs_printerr = printerr;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   571
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   572
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   573
libzfs_handle_t *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   574
libzfs_init(void)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   575
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   576
	libzfs_handle_t *hdl;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   577
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   578
	if ((hdl = calloc(sizeof (libzfs_handle_t), 1)) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   579
		return (NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   580
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   581
2500
12e683f74751 6455228 zpool_mount_datasets() should take an additional flag
eschrock
parents: 2474
diff changeset
   582
	if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   583
		free(hdl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   584
		return (NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   585
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   586
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   587
	if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   588
		(void) close(hdl->libzfs_fd);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   589
		free(hdl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   590
		return (NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   591
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   592
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   593
	hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r");
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   594
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4715
diff changeset
   595
	zfs_prop_init();
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   596
	zpool_prop_init();
8811
f8deccf701cf 6790687 libzfs mnttab caching ignores external changes
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 8343
diff changeset
   597
	libzfs_mnttab_init(hdl);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4715
diff changeset
   598
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   599
	return (hdl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   600
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   601
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   602
void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   603
libzfs_fini(libzfs_handle_t *hdl)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   604
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   605
	(void) close(hdl->libzfs_fd);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   606
	if (hdl->libzfs_mnttab)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   607
		(void) fclose(hdl->libzfs_mnttab);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   608
	if (hdl->libzfs_sharetab)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   609
		(void) fclose(hdl->libzfs_sharetab);
4180
30b15f0bd3c9 6491973 sharemgr: zfs set sharenfs=on is slow with lots of zfs filesystems
dougm
parents: 3978
diff changeset
   610
	zfs_uninit_libshare(hdl);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   611
	if (hdl->libzfs_log_str)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
   612
		(void) free(hdl->libzfs_log_str);
6865
176d18c623cc 6539380 zfs list uses too much memory
rm160521
parents: 6423
diff changeset
   613
	zpool_free_handles(hdl);
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10588
diff changeset
   614
	libzfs_fru_clear(hdl, B_TRUE);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   615
	namespace_clear(hdl);
8811
f8deccf701cf 6790687 libzfs mnttab caching ignores external changes
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 8343
diff changeset
   616
	libzfs_mnttab_fini(hdl);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   617
	free(hdl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   618
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   619
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   620
libzfs_handle_t *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   621
zpool_get_handle(zpool_handle_t *zhp)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   622
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   623
	return (zhp->zpool_hdl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   624
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   625
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   626
libzfs_handle_t *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   627
zfs_get_handle(zfs_handle_t *zhp)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   628
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   629
	return (zhp->zfs_hdl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   630
}
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   631
7538
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7390
diff changeset
   632
zpool_handle_t *
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7390
diff changeset
   633
zfs_get_pool_handle(const zfs_handle_t *zhp)
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7390
diff changeset
   634
{
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7390
diff changeset
   635
	return (zhp->zpool_hdl);
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7390
diff changeset
   636
}
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7390
diff changeset
   637
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   638
/*
3635
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   639
 * Given a name, determine whether or not it's a valid path
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   640
 * (starts with '/' or "./").  If so, walk the mnttab trying
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   641
 * to match the device number.  If not, treat the path as an
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   642
 * fs/vol/snap name.
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   643
 */
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   644
zfs_handle_t *
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   645
zfs_path_to_zhandle(libzfs_handle_t *hdl, char *path, zfs_type_t argtype)
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   646
{
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   647
	struct stat64 statbuf;
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   648
	struct extmnttab entry;
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   649
	int ret;
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   650
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   651
	if (path[0] != '/' && strncmp(path, "./", strlen("./")) != 0) {
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   652
		/*
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   653
		 * It's not a valid path, assume it's a name of type 'argtype'.
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   654
		 */
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   655
		return (zfs_open(hdl, path, argtype));
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   656
	}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   657
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   658
	if (stat64(path, &statbuf) != 0) {
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   659
		(void) fprintf(stderr, "%s: %s\n", path, strerror(errno));
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   660
		return (NULL);
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   661
	}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   662
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   663
	rewind(hdl->libzfs_mnttab);
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   664
	while ((ret = getextmntent(hdl->libzfs_mnttab, &entry, 0)) == 0) {
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   665
		if (makedevice(entry.mnt_major, entry.mnt_minor) ==
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   666
		    statbuf.st_dev) {
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   667
			break;
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   668
		}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   669
	}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   670
	if (ret != 0) {
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   671
		return (NULL);
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   672
	}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   673
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   674
	if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   675
		(void) fprintf(stderr, gettext("'%s': not a ZFS filesystem\n"),
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   676
		    path);
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   677
		return (NULL);
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   678
	}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   679
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   680
	return (zfs_open(hdl, entry.mnt_special, ZFS_TYPE_FILESYSTEM));
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   681
}
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   682
63e2169c1249 PSARC 2007/050 zfs list -d
ck153898
parents: 3237
diff changeset
   683
/*
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   684
 * Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   685
 * an ioctl().
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   686
 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   687
int
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   688
zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   689
{
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   690
	if (len == 0)
10407
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   691
		len = 4*1024;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   692
	zc->zc_nvlist_dst_size = len;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   693
	if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   694
	    zfs_alloc(hdl, zc->zc_nvlist_dst_size)) == NULL)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   695
		return (-1);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   696
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   697
	return (0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   698
}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   699
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   700
/*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   701
 * Called when an ioctl() which returns an nvlist fails with ENOMEM.  This will
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   702
 * expand the nvlist to the size specified in 'zc_nvlist_dst_size', which was
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   703
 * filled in by the kernel to indicate the actual required size.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   704
 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   705
int
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   706
zcmd_expand_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   707
{
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   708
	free((void *)(uintptr_t)zc->zc_nvlist_dst);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   709
	if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   710
	    zfs_alloc(hdl, zc->zc_nvlist_dst_size))
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   711
	    == NULL)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   712
		return (-1);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   713
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   714
	return (0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   715
}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   716
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   717
/*
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   718
 * Called to free the src and dst nvlists stored in the command structure.
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   719
 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   720
void
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   721
zcmd_free_nvlists(zfs_cmd_t *zc)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   722
{
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   723
	free((void *)(uintptr_t)zc->zc_nvlist_conf);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   724
	free((void *)(uintptr_t)zc->zc_nvlist_src);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   725
	free((void *)(uintptr_t)zc->zc_nvlist_dst);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   726
}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   727
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   728
static int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   729
zcmd_write_nvlist_com(libzfs_handle_t *hdl, uint64_t *outnv, uint64_t *outlen,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   730
    nvlist_t *nvl)
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   731
{
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   732
	char *packed;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   733
	size_t len;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   734
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   735
	verify(nvlist_size(nvl, &len, NV_ENCODE_NATIVE) == 0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   736
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   737
	if ((packed = zfs_alloc(hdl, len)) == NULL)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   738
		return (-1);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   739
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   740
	verify(nvlist_pack(nvl, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   741
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   742
	*outnv = (uint64_t)(uintptr_t)packed;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   743
	*outlen = len;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   744
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   745
	return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   746
}
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   747
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   748
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   749
zcmd_write_conf_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   750
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   751
	return (zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_conf,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   752
	    &zc->zc_nvlist_conf_size, nvl));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   753
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   754
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   755
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   756
zcmd_write_src_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   757
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   758
	return (zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_src,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   759
	    &zc->zc_nvlist_src_size, nvl));
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   760
}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   761
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   762
/*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   763
 * Unpacks an nvlist from the ZFS ioctl command structure.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   764
 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   765
int
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   766
zcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   767
{
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   768
	if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   769
	    zc->zc_nvlist_dst_size, nvlp, 0) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   770
		return (no_memory(hdl));
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   771
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   772
	return (0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   773
}
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   774
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   775
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   776
zfs_ioctl(libzfs_handle_t *hdl, int request, zfs_cmd_t *zc)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   777
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   778
	int error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   779
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   780
	zc->zc_history = (uint64_t)(uintptr_t)hdl->libzfs_log_str;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   781
	error = ioctl(hdl->libzfs_fd, request, zc);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   782
	if (hdl->libzfs_log_str) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   783
		free(hdl->libzfs_log_str);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   784
		hdl->libzfs_log_str = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   785
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   786
	zc->zc_history = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   787
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   788
	return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   789
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   790
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   791
/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   792
 * ================================================================
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   793
 * API shared by zfs and zpool property management
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   794
 * ================================================================
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   795
 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   796
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   797
static void
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   798
zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   799
{
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   800
	zprop_list_t *pl = cbp->cb_proplist;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   801
	int i;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   802
	char *title;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   803
	size_t len;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   804
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   805
	cbp->cb_first = B_FALSE;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   806
	if (cbp->cb_scripted)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   807
		return;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   808
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   809
	/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   810
	 * Start with the length of the column headers.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   811
	 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   812
	cbp->cb_colwidths[GET_COL_NAME] = strlen(dgettext(TEXT_DOMAIN, "NAME"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   813
	cbp->cb_colwidths[GET_COL_PROPERTY] = strlen(dgettext(TEXT_DOMAIN,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   814
	    "PROPERTY"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   815
	cbp->cb_colwidths[GET_COL_VALUE] = strlen(dgettext(TEXT_DOMAIN,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   816
	    "VALUE"));
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   817
	cbp->cb_colwidths[GET_COL_RECVD] = strlen(dgettext(TEXT_DOMAIN,
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   818
	    "RECEIVED"));
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   819
	cbp->cb_colwidths[GET_COL_SOURCE] = strlen(dgettext(TEXT_DOMAIN,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   820
	    "SOURCE"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   821
8269
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   822
	/* first property is always NAME */
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   823
	assert(cbp->cb_proplist->pl_prop ==
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   824
	    ((type == ZFS_TYPE_POOL) ?  ZPOOL_PROP_NAME : ZFS_PROP_NAME));
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   825
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   826
	/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   827
	 * Go through and calculate the widths for each column.  For the
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   828
	 * 'source' column, we kludge it up by taking the worst-case scenario of
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   829
	 * inheriting from the longest name.  This is acceptable because in the
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   830
	 * majority of cases 'SOURCE' is the last column displayed, and we don't
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   831
	 * use the width anyway.  Note that the 'VALUE' column can be oversized,
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   832
	 * if the name of the property is much longer than any values we find.
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   833
	 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   834
	for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   835
		/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   836
		 * 'PROPERTY' column
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   837
		 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   838
		if (pl->pl_prop != ZPROP_INVAL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   839
			const char *propname = (type == ZFS_TYPE_POOL) ?
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   840
			    zpool_prop_to_name(pl->pl_prop) :
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   841
			    zfs_prop_to_name(pl->pl_prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   842
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   843
			len = strlen(propname);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   844
			if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   845
				cbp->cb_colwidths[GET_COL_PROPERTY] = len;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   846
		} else {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   847
			len = strlen(pl->pl_user_prop);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   848
			if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   849
				cbp->cb_colwidths[GET_COL_PROPERTY] = len;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   850
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   851
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   852
		/*
8269
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   853
		 * 'VALUE' column.  The first property is always the 'name'
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   854
		 * property that was tacked on either by /sbin/zfs's
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   855
		 * zfs_do_get() or when calling zprop_expand_list(), so we
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   856
		 * ignore its width.  If the user specified the name property
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   857
		 * to display, then it will be later in the list in any case.
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   858
		 */
8269
03a7e9050cfd 6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents: 7538
diff changeset
   859
		if (pl != cbp->cb_proplist &&
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   860
		    pl->pl_width > cbp->cb_colwidths[GET_COL_VALUE])
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   861
			cbp->cb_colwidths[GET_COL_VALUE] = pl->pl_width;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   862
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   863
		/* 'RECEIVED' column. */
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   864
		if (pl != cbp->cb_proplist &&
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   865
		    pl->pl_recvd_width > cbp->cb_colwidths[GET_COL_RECVD])
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   866
			cbp->cb_colwidths[GET_COL_RECVD] = pl->pl_recvd_width;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   867
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   868
		/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   869
		 * 'NAME' and 'SOURCE' columns
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   870
		 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   871
		if (pl->pl_prop == (type == ZFS_TYPE_POOL ? ZPOOL_PROP_NAME :
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   872
		    ZFS_PROP_NAME) &&
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   873
		    pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   874
			cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   875
			cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   876
			    strlen(dgettext(TEXT_DOMAIN, "inherited from"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   877
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   878
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   879
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   880
	/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   881
	 * Now go through and print the headers.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   882
	 */
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   883
	for (i = 0; i < ZFS_GET_NCOLS; i++) {
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   884
		switch (cbp->cb_columns[i]) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   885
		case GET_COL_NAME:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   886
			title = dgettext(TEXT_DOMAIN, "NAME");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   887
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   888
		case GET_COL_PROPERTY:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   889
			title = dgettext(TEXT_DOMAIN, "PROPERTY");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   890
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   891
		case GET_COL_VALUE:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   892
			title = dgettext(TEXT_DOMAIN, "VALUE");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   893
			break;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   894
		case GET_COL_RECVD:
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   895
			title = dgettext(TEXT_DOMAIN, "RECEIVED");
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   896
			break;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   897
		case GET_COL_SOURCE:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   898
			title = dgettext(TEXT_DOMAIN, "SOURCE");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   899
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   900
		default:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   901
			title = NULL;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   902
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   903
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   904
		if (title != NULL) {
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   905
			if (i == (ZFS_GET_NCOLS - 1) ||
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   906
			    cbp->cb_columns[i + 1] == GET_COL_NONE)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   907
				(void) printf("%s", title);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   908
			else
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   909
				(void) printf("%-*s  ",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   910
				    cbp->cb_colwidths[cbp->cb_columns[i]],
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   911
				    title);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   912
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   913
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   914
	(void) printf("\n");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   915
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   916
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   917
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   918
 * Display a single line of output, according to the settings in the callback
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   919
 * structure.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   920
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   921
void
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   922
zprop_print_one_property(const char *name, zprop_get_cbdata_t *cbp,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   923
    const char *propname, const char *value, zprop_source_t sourcetype,
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   924
    const char *source, const char *recvd_value)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   925
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   926
	int i;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   927
	const char *str;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   928
	char buf[128];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   929
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   930
	/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   931
	 * Ignore those source types that the user has chosen to ignore.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   932
	 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   933
	if ((sourcetype & cbp->cb_sources) == 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   934
		return;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   935
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   936
	if (cbp->cb_first)
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   937
		zprop_print_headers(cbp, cbp->cb_type);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   938
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   939
	for (i = 0; i < ZFS_GET_NCOLS; i++) {
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   940
		switch (cbp->cb_columns[i]) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   941
		case GET_COL_NAME:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   942
			str = name;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   943
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   944
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   945
		case GET_COL_PROPERTY:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   946
			str = propname;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   947
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   948
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   949
		case GET_COL_VALUE:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   950
			str = value;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   951
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   952
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   953
		case GET_COL_SOURCE:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   954
			switch (sourcetype) {
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   955
			case ZPROP_SRC_NONE:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   956
				str = "-";
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   957
				break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   958
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   959
			case ZPROP_SRC_DEFAULT:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   960
				str = "default";
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   961
				break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   962
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   963
			case ZPROP_SRC_LOCAL:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   964
				str = "local";
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   965
				break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   966
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   967
			case ZPROP_SRC_TEMPORARY:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   968
				str = "temporary";
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   969
				break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   970
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   971
			case ZPROP_SRC_INHERITED:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   972
				(void) snprintf(buf, sizeof (buf),
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   973
				    "inherited from %s", source);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   974
				str = buf;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   975
				break;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   976
			case ZPROP_SRC_RECEIVED:
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   977
				str = "received";
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   978
				break;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   979
			}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   980
			break;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   981
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   982
		case GET_COL_RECVD:
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   983
			str = (recvd_value == NULL ? "-" : recvd_value);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   984
			break;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   985
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   986
		default:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   987
			continue;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   988
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   989
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 11007
diff changeset
   990
		if (cbp->cb_columns[i + 1] == GET_COL_NONE)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   991
			(void) printf("%s", str);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   992
		else if (cbp->cb_scripted)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   993
			(void) printf("%s\t", str);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   994
		else
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   995
			(void) printf("%-*s  ",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   996
			    cbp->cb_colwidths[cbp->cb_columns[i]],
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   997
			    str);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   998
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
   999
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
  1000
	(void) printf("\n");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3635
diff changeset
  1001
}
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1002
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1003
/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1004
 * Given a numeric suffix, convert the value into a number of bits that the
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1005
 * resulting value must be shifted.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1006
 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1007
static int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1008
str2shift(libzfs_handle_t *hdl, const char *buf)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1009
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1010
	const char *ends = "BKMGTPEZ";
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1011
	int i;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1012
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1013
	if (buf[0] == '\0')
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1014
		return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1015
	for (i = 0; i < strlen(ends); i++) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1016
		if (toupper(buf[0]) == ends[i])
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1017
			break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1018
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1019
	if (i == strlen(ends)) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1020
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1021
		    "invalid numeric suffix '%s'"), buf);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1022
		return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1023
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1024
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1025
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1026
	 * We want to allow trailing 'b' characters for 'GB' or 'Mb'.  But don't
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1027
	 * allow 'BB' - that's just weird.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1028
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1029
	if (buf[1] == '\0' || (toupper(buf[1]) == 'B' && buf[2] == '\0' &&
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1030
	    toupper(buf[0]) != 'B'))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1031
		return (10*i);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1032
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1033
	zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1034
	    "invalid numeric suffix '%s'"), buf);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1035
	return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1036
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1037
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1038
/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1039
 * Convert a string of the form '100G' into a real number.  Used when setting
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1040
 * properties or creating a volume.  'buf' is used to place an extended error
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1041
 * message for the caller to use.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1042
 */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1043
int
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1044
zfs_nicestrtonum(libzfs_handle_t *hdl, const char *value, uint64_t *num)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1045
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1046
	char *end;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1047
	int shift;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1048
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1049
	*num = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1050
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1051
	/* Check to see if this looks like a number.  */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1052
	if ((value[0] < '0' || value[0] > '9') && value[0] != '.') {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1053
		if (hdl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1054
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1055
			    "bad numeric value '%s'"), value);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1056
		return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1057
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1058
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10588
diff changeset
  1059
	/* Rely on strtoull() to process the numeric portion.  */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1060
	errno = 0;
8343
655db2375fed 6739553 libzfs_status msgid table is out of sync
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8269
diff changeset
  1061
	*num = strtoull(value, &end, 10);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1062
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1063
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1064
	 * Check for ERANGE, which indicates that the value is too large to fit
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1065
	 * in a 64-bit value.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1066
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1067
	if (errno == ERANGE) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1068
		if (hdl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1069
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1070
			    "numeric value is too large"));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1071
		return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1072
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1073
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1074
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1075
	 * If we have a decimal value, then do the computation with floating
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1076
	 * point arithmetic.  Otherwise, use standard arithmetic.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1077
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1078
	if (*end == '.') {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1079
		double fval = strtod(value, &end);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1080
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1081
		if ((shift = str2shift(hdl, end)) == -1)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1082
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1083
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1084
		fval *= pow(2, shift);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1085
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1086
		if (fval > UINT64_MAX) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1087
			if (hdl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1088
				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1089
				    "numeric value is too large"));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1090
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1091
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1092
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1093
		*num = (uint64_t)fval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1094
	} else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1095
		if ((shift = str2shift(hdl, end)) == -1)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1096
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1097
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1098
		/* Check for overflow */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1099
		if (shift >= 64 || (*num << shift) >> shift != *num) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1100
			if (hdl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1101
				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1102
				    "numeric value is too large"));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1103
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1104
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1105
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1106
		*num <<= shift;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1107
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1108
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1109
	return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1110
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1111
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1112
/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1113
 * Given a propname=value nvpair to set, parse any numeric properties
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1114
 * (index, boolean, etc) if they are specified as strings and add the
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1115
 * resulting nvpair to the returned nvlist.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1116
 *
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1117
 * At the DSL layer, all properties are either 64-bit numbers or strings.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1118
 * We want the user to be able to ignore this fact and specify properties
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1119
 * as native values (numbers, for example) or as strings (to simplify
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1120
 * command line utilities).  This also handles converting index types
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1121
 * (compression, checksum, etc) from strings to their on-disk index.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1122
 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1123
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1124
zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1125
    zfs_type_t type, nvlist_t *ret, char **svalp, uint64_t *ivalp,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1126
    const char *errbuf)
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1127
{
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1128
	data_type_t datatype = nvpair_type(elem);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1129
	zprop_type_t proptype;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1130
	const char *propname;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1131
	char *value;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1132
	boolean_t isnone = B_FALSE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1133
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1134
	if (type == ZFS_TYPE_POOL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1135
		proptype = zpool_prop_get_type(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1136
		propname = zpool_prop_to_name(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1137
	} else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1138
		proptype = zfs_prop_get_type(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1139
		propname = zfs_prop_to_name(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1140
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1141
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1142
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1143
	 * Convert any properties to the internal DSL value types.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1144
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1145
	*svalp = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1146
	*ivalp = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1147
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1148
	switch (proptype) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1149
	case PROP_TYPE_STRING:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1150
		if (datatype != DATA_TYPE_STRING) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1151
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1152
			    "'%s' must be a string"), nvpair_name(elem));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1153
			goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1154
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1155
		(void) nvpair_value_string(elem, svalp);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1156
		if (strlen(*svalp) >= ZFS_MAXPROPLEN) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1157
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1158
			    "'%s' is too long"), nvpair_name(elem));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1159
			goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1160
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1161
		break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1162
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1163
	case PROP_TYPE_NUMBER:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1164
		if (datatype == DATA_TYPE_STRING) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1165
			(void) nvpair_value_string(elem, &value);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1166
			if (strcmp(value, "none") == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1167
				isnone = B_TRUE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1168
			} else if (zfs_nicestrtonum(hdl, value, ivalp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1169
			    != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1170
				goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1171
			}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1172
		} else if (datatype == DATA_TYPE_UINT64) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1173
			(void) nvpair_value_uint64(elem, ivalp);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1174
		} else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1175
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1176
			    "'%s' must be a number"), nvpair_name(elem));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1177
			goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1178
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1179
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1180
		/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1181
		 * Quota special: force 'none' and don't allow 0.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1182
		 */
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5363
diff changeset
  1183
		if ((type & ZFS_TYPE_DATASET) && *ivalp == 0 && !isnone &&
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5363
diff changeset
  1184
		    (prop == ZFS_PROP_QUOTA || prop == ZFS_PROP_REFQUOTA)) {
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1185
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5363
diff changeset
  1186
			    "use 'none' to disable quota/refquota"));
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1187
			goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1188
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1189
		break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1190
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1191
	case PROP_TYPE_INDEX:
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5363
diff changeset
  1192
		if (datatype != DATA_TYPE_STRING) {
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1193
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1194
			    "'%s' must be a string"), nvpair_name(elem));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1195
			goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1196
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1197
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5363
diff changeset
  1198
		(void) nvpair_value_string(elem, &value);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5363
diff changeset
  1199
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1200
		if (zprop_string_to_index(prop, value, ivalp, type) != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1201
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1202
			    "'%s' must be one of '%s'"), propname,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1203
			    zprop_values(prop, type));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1204
			goto error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1205
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1206
		break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1207
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1208
	default:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1209
		abort();
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1210
	}
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1211
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1212
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1213
	 * Add the result to our return set of properties.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1214
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1215
	if (*svalp != NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1216
		if (nvlist_add_string(ret, propname, *svalp) != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1217
			(void) no_memory(hdl);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1218
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1219
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1220
	} else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1221
		if (nvlist_add_uint64(ret, propname, *ivalp) != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1222
			(void) no_memory(hdl);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1223
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1224
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1225
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1226
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1227
	return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1228
error:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1229
	(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1230
	return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1231
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1232
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1233
static int
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1234
addlist(libzfs_handle_t *hdl, char *propname, zprop_list_t **listp,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1235
    zfs_type_t type)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1236
{
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1237
	int prop;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1238
	zprop_list_t *entry;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1239
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1240
	prop = zprop_name_to_prop(propname, type);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1241
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1242
	if (prop != ZPROP_INVAL && !zprop_valid_for_type(prop, type))
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1243
		prop = ZPROP_INVAL;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1244
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1245
	/*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1246
	 * When no property table entry can be found, return failure if
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1247
	 * this is a pool property or if this isn't a user-defined
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1248
	 * dataset property,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1249
	 */
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1250
	if (prop == ZPROP_INVAL && (type == ZFS_TYPE_POOL ||
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9234
diff changeset
  1251
	    (!zfs_prop_user(propname) && !zfs_prop_userquota(propname)))) {
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1252
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1253
		    "invalid property '%s'"), propname);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1254
		return (zfs_error(hdl, EZFS_BADPROP,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1255
		    dgettext(TEXT_DOMAIN, "bad property list")));
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1256
	}
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1257
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1258
	if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1259
		return (-1);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1260
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1261
	entry->pl_prop = prop;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1262
	if (prop == ZPROP_INVAL) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1263
		if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) == NULL) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1264
			free(entry);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1265
			return (-1);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1266
		}
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1267
		entry->pl_width = strlen(propname);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1268
	} else {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1269
		entry->pl_width = zprop_width(prop, &entry->pl_fixed,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1270
		    type);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1271
	}
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1272
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1273
	*listp = entry;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1274
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1275
	return (0);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1276
}
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1277
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1278
/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1279
 * Given a comma-separated list of properties, construct a property list
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1280
 * containing both user-defined and native properties.  This function will
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1281
 * return a NULL list if 'all' is specified, which can later be expanded
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1282
 * by zprop_expand_list().
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1283
 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1284
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1285
zprop_get_list(libzfs_handle_t *hdl, char *props, zprop_list_t **listp,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1286
    zfs_type_t type)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1287
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1288
	*listp = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1289
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1290
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1291
	 * If 'all' is specified, return a NULL list.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1292
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1293
	if (strcmp(props, "all") == 0)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1294
		return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1295
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1296
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1297
	 * If no props were specified, return an error.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1298
	 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1299
	if (props[0] == '\0') {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1300
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1301
		    "no properties specified"));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1302
		return (zfs_error(hdl, EZFS_BADPROP, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1303
		    "bad property list")));
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1304
	}
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1305
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1306
	/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1307
	 * It would be nice to use getsubopt() here, but the inclusion of column
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1308
	 * aliases makes this more effort than it's worth.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1309
	 */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1310
	while (*props != '\0') {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1311
		size_t len;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1312
		char *p;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1313
		char c;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1314
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1315
		if ((p = strchr(props, ',')) == NULL) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1316
			len = strlen(props);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1317
			p = props + len;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1318
		} else {
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1319
			len = p - props;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1320
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1321
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1322
		/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1323
		 * Check for empty options.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1324
		 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1325
		if (len == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1326
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1327
			    "empty property name"));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1328
			return (zfs_error(hdl, EZFS_BADPROP,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1329
			    dgettext(TEXT_DOMAIN, "bad property list")));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1330
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1331
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1332
		/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1333
		 * Check all regular property names.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1334
		 */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1335
		c = props[len];
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1336
		props[len] = '\0';
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1337
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1338
		if (strcmp(props, "space") == 0) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1339
			static char *spaceprops[] = {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1340
				"name", "avail", "used", "usedbysnapshots",
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1341
				"usedbydataset", "usedbyrefreservation",
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1342
				"usedbychildren", NULL
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1343
			};
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1344
			int i;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1345
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1346
			for (i = 0; spaceprops[i]; i++) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1347
				if (addlist(hdl, spaceprops[i], listp, type))
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1348
					return (-1);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1349
				listp = &(*listp)->pl_next;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1350
			}
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1351
		} else {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1352
			if (addlist(hdl, props, listp, type))
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1353
				return (-1);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1354
			listp = &(*listp)->pl_next;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1355
		}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1356
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1357
		props = p;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1358
		if (c == ',')
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7341
diff changeset
  1359
			props++;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1360
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1361
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1362
	return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1363
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1364
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1365
void
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1366
zprop_free_list(zprop_list_t *pl)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1367
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1368
	zprop_list_t *next;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1369
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1370
	while (pl != NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1371
		next = pl->pl_next;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1372
		free(pl->pl_user_prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1373
		free(pl);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1374
		pl = next;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1375
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1376
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1377
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1378
typedef struct expand_data {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1379
	zprop_list_t	**last;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1380
	libzfs_handle_t	*hdl;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1381
	zfs_type_t type;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1382
} expand_data_t;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1383
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1384
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1385
zprop_expand_list_cb(int prop, void *cb)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1386
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1387
	zprop_list_t *entry;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1388
	expand_data_t *edp = cb;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1389
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1390
	if ((entry = zfs_alloc(edp->hdl, sizeof (zprop_list_t))) == NULL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1391
		return (ZPROP_INVAL);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1392
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1393
	entry->pl_prop = prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1394
	entry->pl_width = zprop_width(prop, &entry->pl_fixed, edp->type);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1395
	entry->pl_all = B_TRUE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1396
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1397
	*(edp->last) = entry;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1398
	edp->last = &entry->pl_next;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1399
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1400
	return (ZPROP_CONT);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4451
diff changeset
  1401
}
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1402
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1403
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1404
zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, zfs_type_t type)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1405
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1406
	zprop_list_t *entry;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1407
	zprop_list_t **last;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1408
	expand_data_t exp;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1409
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1410
	if (*plp == NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1411
		/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1412
		 * If this is the very first time we've been called for an 'all'
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1413
		 * specification, expand the list to include all native
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1414
		 * properties.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1415
		 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1416
		last = plp;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1417
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1418
		exp.last = last;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1419
		exp.hdl = hdl;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1420
		exp.type = type;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1421
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1422
		if (zprop_iter_common(zprop_expand_list_cb, &exp, B_FALSE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1423
		    B_FALSE, type) == ZPROP_INVAL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1424
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1425
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1426
		/*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1427
		 * Add 'name' to the beginning of the list, which is handled
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1428
		 * specially.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1429
		 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1430
		if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1431
			return (-1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1432
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1433
		entry->pl_prop = (type == ZFS_TYPE_POOL) ?  ZPOOL_PROP_NAME :
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1434
		    ZFS_PROP_NAME;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1435
		entry->pl_width = zprop_width(entry->pl_prop,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1436
		    &entry->pl_fixed, type);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1437
		entry->pl_all = B_TRUE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1438
		entry->pl_next = *plp;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1439
		*plp = entry;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1440
	}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1441
	return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1442
}
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1443
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1444
int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1445
zprop_iter(zprop_func func, void *cb, boolean_t show_all, boolean_t ordered,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1446
    zfs_type_t type)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1447
{
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1448
	return (zprop_iter_common(func, cb, show_all, ordered, type));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
  1449
}