1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #include <alloca.h>
28 #include <assert.h>
29 #include <ctype.h>
30 #include <errno.h>
31 #include <devid.h>
32 #include <dirent.h>
33 #include <fcntl.h>
34 #include <libintl.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <strings.h>
38 #include <unistd.h>
39 #include <zone.h>
40 #include <sys/efi_partition.h>
41 #include <sys/vtoc.h>
42 #include <sys/zfs_ioctl.h>
43 #include <sys/zio.h>
44 #include <strings.h>
45 
46 #include "zfs_namecheck.h"
47 #include "zfs_prop.h"
48 #include "libzfs_impl.h"
49 
50 static int read_efi_label(nvlist_t *config, diskaddr_t *sb);
51 
52 #if defined(__i386) || defined(__amd64)
53 #define	BOOTCMD	"installgrub(1M)"
54 #else
55 #define	BOOTCMD	"installboot(1M)"
56 #endif
57 
58 /*
59  * ====================================================================
60  *   zpool property functions
61  * ====================================================================
62  */
63 
64 static int
65 zpool_get_all_props(zpool_handle_t *zhp)
66 {
67 	zfs_cmd_t zc = { 0 };
68 	libzfs_handle_t *hdl = zhp->zpool_hdl;
69 
70 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
71 
72 	if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0)
73 		return (-1);
74 
75 	while (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_GET_PROPS, &zc) != 0) {
76 		if (errno == ENOMEM) {
77 			if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) {
78 				zcmd_free_nvlists(&zc);
79 				return (-1);
80 			}
81 		} else {
82 			zcmd_free_nvlists(&zc);
83 			return (-1);
84 		}
85 	}
86 
87 	if (zcmd_read_dst_nvlist(hdl, &zc, &zhp->zpool_props) != 0) {
88 		zcmd_free_nvlists(&zc);
89 		return (-1);
90 	}
91 
92 	zcmd_free_nvlists(&zc);
93 
94 	return (0);
95 }
96 
97 static int
98 zpool_props_refresh(zpool_handle_t *zhp)
99 {
100 	nvlist_t *old_props;
101 
102 	old_props = zhp->zpool_props;
103 
104 	if (zpool_get_all_props(zhp) != 0)
105 		return (-1);
106 
107 	nvlist_free(old_props);
108 	return (0);
109 }
110 
111 static char *
112 zpool_get_prop_string(zpool_handle_t *zhp, zpool_prop_t prop,
113     zprop_source_t *src)
114 {
115 	nvlist_t *nv, *nvl;
116 	uint64_t ival;
117 	char *value;
118 	zprop_source_t source;
119 
120 	nvl = zhp->zpool_props;
121 	if (nvlist_lookup_nvlist(nvl, zpool_prop_to_name(prop), &nv) == 0) {
122 		verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE, &ival) == 0);
123 		source = ival;
124 		verify(nvlist_lookup_string(nv, ZPROP_VALUE, &value) == 0);
125 	} else {
126 		source = ZPROP_SRC_DEFAULT;
127 		if ((value = (char *)zpool_prop_default_string(prop)) == NULL)
128 			value = "-";
129 	}
130 
131 	if (src)
132 		*src = source;
133 
134 	return (value);
135 }
136 
137 uint64_t
138 zpool_get_prop_int(zpool_handle_t *zhp, zpool_prop_t prop, zprop_source_t *src)
139 {
140 	nvlist_t *nv, *nvl;
141 	uint64_t value;
142 	zprop_source_t source;
143 
144 	if (zhp->zpool_props == NULL && zpool_get_all_props(zhp)) {
145 		/*
146 		 * zpool_get_all_props() has most likely failed because
147 		 * the pool is faulted, but if all we need is the top level
148 		 * vdev's guid then get it from the zhp config nvlist.
149 		 */
150 		if ((prop == ZPOOL_PROP_GUID) &&
151 		    (nvlist_lookup_nvlist(zhp->zpool_config,
152 		    ZPOOL_CONFIG_VDEV_TREE, &nv) == 0) &&
153 		    (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &value)
154 		    == 0)) {
155 			return (value);
156 		}
157 		return (zpool_prop_default_numeric(prop));
158 	}
159 
160 	nvl = zhp->zpool_props;
161 	if (nvlist_lookup_nvlist(nvl, zpool_prop_to_name(prop), &nv) == 0) {
162 		verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE, &value) == 0);
163 		source = value;
164 		verify(nvlist_lookup_uint64(nv, ZPROP_VALUE, &value) == 0);
165 	} else {
166 		source = ZPROP_SRC_DEFAULT;
167 		value = zpool_prop_default_numeric(prop);
168 	}
169 
170 	if (src)
171 		*src = source;
172 
173 	return (value);
174 }
175 
176 /*
177  * Map VDEV STATE to printed strings.
178  */
179 char *
180 zpool_state_to_name(vdev_state_t state, vdev_aux_t aux)
181 {
182 	switch (state) {
183 	case VDEV_STATE_CLOSED:
184 	case VDEV_STATE_OFFLINE:
185 		return (gettext("OFFLINE"));
186 	case VDEV_STATE_REMOVED:
187 		return (gettext("REMOVED"));
188 	case VDEV_STATE_CANT_OPEN:
189 		if (aux == VDEV_AUX_CORRUPT_DATA || aux == VDEV_AUX_BAD_LOG)
190 			return (gettext("FAULTED"));
191 		else
192 			return (gettext("UNAVAIL"));
193 	case VDEV_STATE_FAULTED:
194 		return (gettext("FAULTED"));
195 	case VDEV_STATE_DEGRADED:
196 		return (gettext("DEGRADED"));
197 	case VDEV_STATE_HEALTHY:
198 		return (gettext("ONLINE"));
199 	}
200 
201 	return (gettext("UNKNOWN"));
202 }
203 
204 /*
205  * Get a zpool property value for 'prop' and return the value in
206  * a pre-allocated buffer.
207  */
208 int
209 zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len,
210     zprop_source_t *srctype)
211 {
212 	uint64_t intval;
213 	const char *strval;
214 	zprop_source_t src = ZPROP_SRC_NONE;
215 	nvlist_t *nvroot;
216 	vdev_stat_t *vs;
217 	uint_t vsc;
218 
219 	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
220 		if (prop == ZPOOL_PROP_NAME)
221 			(void) strlcpy(buf, zpool_get_name(zhp), len);
222 		else if (prop == ZPOOL_PROP_HEALTH)
223 			(void) strlcpy(buf, "FAULTED", len);
224 		else
225 			(void) strlcpy(buf, "-", len);
226 		return (0);
227 	}
228 
229 	if (zhp->zpool_props == NULL && zpool_get_all_props(zhp) &&
230 	    prop != ZPOOL_PROP_NAME)
231 		return (-1);
232 
233 	switch (zpool_prop_get_type(prop)) {
234 	case PROP_TYPE_STRING:
235 		(void) strlcpy(buf, zpool_get_prop_string(zhp, prop, &src),
236 		    len);
237 		break;
238 
239 	case PROP_TYPE_NUMBER:
240 		intval = zpool_get_prop_int(zhp, prop, &src);
241 
242 		switch (prop) {
243 		case ZPOOL_PROP_SIZE:
244 		case ZPOOL_PROP_USED:
245 		case ZPOOL_PROP_AVAILABLE:
246 			(void) zfs_nicenum(intval, buf, len);
247 			break;
248 
249 		case ZPOOL_PROP_CAPACITY:
250 			(void) snprintf(buf, len, "%llu%%",
251 			    (u_longlong_t)intval);
252 			break;
253 
254 		case ZPOOL_PROP_HEALTH:
255 			verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
256 			    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
257 			verify(nvlist_lookup_uint64_array(nvroot,
258 			    ZPOOL_CONFIG_STATS, (uint64_t **)&vs, &vsc) == 0);
259 
260 			(void) strlcpy(buf, zpool_state_to_name(intval,
261 			    vs->vs_aux), len);
262 			break;
263 		default:
264 			(void) snprintf(buf, len, "%llu", intval);
265 		}
266 		break;
267 
268 	case PROP_TYPE_INDEX:
269 		intval = zpool_get_prop_int(zhp, prop, &src);
270 		if (zpool_prop_index_to_string(prop, intval, &strval)
271 		    != 0)
272 			return (-1);
273 		(void) strlcpy(buf, strval, len);
274 		break;
275 
276 	default:
277 		abort();
278 	}
279 
280 	if (srctype)
281 		*srctype = src;
282 
283 	return (0);
284 }
285 
286 /*
287  * Check if the bootfs name has the same pool name as it is set to.
288  * Assuming bootfs is a valid dataset name.
289  */
290 static boolean_t
291 bootfs_name_valid(const char *pool, char *bootfs)
292 {
293 	int len = strlen(pool);
294 
295 	if (!zfs_name_valid(bootfs, ZFS_TYPE_FILESYSTEM|ZFS_TYPE_SNAPSHOT))
296 		return (B_FALSE);
297 
298 	if (strncmp(pool, bootfs, len) == 0 &&
299 	    (bootfs[len] == '/' || bootfs[len] == '\0'))
300 		return (B_TRUE);
301 
302 	return (B_FALSE);
303 }
304 
305 /*
306  * Inspect the configuration to determine if any of the devices contain
307  * an EFI label.
308  */
309 static boolean_t
310 pool_uses_efi(nvlist_t *config)
311 {
312 	nvlist_t **child;
313 	uint_t c, children;
314 
315 	if (nvlist_lookup_nvlist_array(config, ZPOOL_CONFIG_CHILDREN,
316 	    &child, &children) != 0)
317 		return (read_efi_label(config, NULL) >= 0);
318 
319 	for (c = 0; c < children; c++) {
320 		if (pool_uses_efi(child[c]))
321 			return (B_TRUE);
322 	}
323 	return (B_FALSE);
324 }
325 
326 static boolean_t
327 pool_is_bootable(zpool_handle_t *zhp)
328 {
329 	char bootfs[ZPOOL_MAXNAMELEN];
330 
331 	return (zpool_get_prop(zhp, ZPOOL_PROP_BOOTFS, bootfs,
332 	    sizeof (bootfs), NULL) == 0 && strncmp(bootfs, "-",
333 	    sizeof (bootfs)) != 0);
334 }
335 
336 
337 /*
338  * Given an nvlist of zpool properties to be set, validate that they are
339  * correct, and parse any numeric properties (index, boolean, etc) if they are
340  * specified as strings.
341  */
342 static nvlist_t *
343 zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname,
344     nvlist_t *props, uint64_t version, boolean_t create_or_import, char *errbuf)
345 {
346 	nvpair_t *elem;
347 	nvlist_t *retprops;
348 	zpool_prop_t prop;
349 	char *strval;
350 	uint64_t intval;
351 	char *slash;
352 	struct stat64 statbuf;
353 	zpool_handle_t *zhp;
354 	nvlist_t *nvroot;
355 
356 	if (nvlist_alloc(&retprops, NV_UNIQUE_NAME, 0) != 0) {
357 		(void) no_memory(hdl);
358 		return (NULL);
359 	}
360 
361 	elem = NULL;
362 	while ((elem = nvlist_next_nvpair(props, elem)) != NULL) {
363 		const char *propname = nvpair_name(elem);
364 
365 		/*
366 		 * Make sure this property is valid and applies to this type.
367 		 */
368 		if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) {
369 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
370 			    "invalid property '%s'"), propname);
371 			(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
372 			goto error;
373 		}
374 
375 		if (zpool_prop_readonly(prop)) {
376 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' "
377 			    "is readonly"), propname);
378 			(void) zfs_error(hdl, EZFS_PROPREADONLY, errbuf);
379 			goto error;
380 		}
381 
382 		if (zprop_parse_value(hdl, elem, prop, ZFS_TYPE_POOL, retprops,
383 		    &strval, &intval, errbuf) != 0)
384 			goto error;
385 
386 		/*
387 		 * Perform additional checking for specific properties.
388 		 */
389 		switch (prop) {
390 		case ZPOOL_PROP_VERSION:
391 			if (intval < version || intval > SPA_VERSION) {
392 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
393 				    "property '%s' number %d is invalid."),
394 				    propname, intval);
395 				(void) zfs_error(hdl, EZFS_BADVERSION, errbuf);
396 				goto error;
397 			}
398 			break;
399 
400 		case ZPOOL_PROP_BOOTFS:
401 			if (create_or_import) {
402 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
403 				    "property '%s' cannot be set at creation "
404 				    "or import time"), propname);
405 				(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
406 				goto error;
407 			}
408 
409 			if (version < SPA_VERSION_BOOTFS) {
410 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
411 				    "pool must be upgraded to support "
412 				    "'%s' property"), propname);
413 				(void) zfs_error(hdl, EZFS_BADVERSION, errbuf);
414 				goto error;
415 			}
416 
417 			/*
418 			 * bootfs property value has to be a dataset name and
419 			 * the dataset has to be in the same pool as it sets to.
420 			 */
421 			if (strval[0] != '\0' && !bootfs_name_valid(poolname,
422 			    strval)) {
423 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' "
424 				    "is an invalid name"), strval);
425 				(void) zfs_error(hdl, EZFS_INVALIDNAME, errbuf);
426 				goto error;
427 			}
428 
429 			if ((zhp = zpool_open_canfail(hdl, poolname)) == NULL) {
430 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
431 				    "could not open pool '%s'"), poolname);
432 				(void) zfs_error(hdl, EZFS_OPENFAILED, errbuf);
433 				goto error;
434 			}
435 			verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
436 			    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
437 
438 			/*
439 			 * bootfs property cannot be set on a disk which has
440 			 * been EFI labeled.
441 			 */
442 			if (pool_uses_efi(nvroot)) {
443 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
444 				    "property '%s' not supported on "
445 				    "EFI labeled devices"), propname);
446 				(void) zfs_error(hdl, EZFS_POOL_NOTSUP, errbuf);
447 				zpool_close(zhp);
448 				goto error;
449 			}
450 			zpool_close(zhp);
451 			break;
452 
453 		case ZPOOL_PROP_ALTROOT:
454 			if (!create_or_import) {
455 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
456 				    "property '%s' can only be set during pool "
457 				    "creation or import"), propname);
458 				(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
459 				goto error;
460 			}
461 
462 			if (strval[0] != '/') {
463 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
464 				    "bad alternate root '%s'"), strval);
465 				(void) zfs_error(hdl, EZFS_BADPATH, errbuf);
466 				goto error;
467 			}
468 			break;
469 
470 		case ZPOOL_PROP_CACHEFILE:
471 			if (strval[0] == '\0')
472 				break;
473 
474 			if (strcmp(strval, "none") == 0)
475 				break;
476 
477 			if (strval[0] != '/') {
478 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
479 				    "property '%s' must be empty, an "
480 				    "absolute path, or 'none'"), propname);
481 				(void) zfs_error(hdl, EZFS_BADPATH, errbuf);
482 				goto error;
483 			}
484 
485 			slash = strrchr(strval, '/');
486 
487 			if (slash[1] == '\0' || strcmp(slash, "/.") == 0 ||
488 			    strcmp(slash, "/..") == 0) {
489 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
490 				    "'%s' is not a valid file"), strval);
491 				(void) zfs_error(hdl, EZFS_BADPATH, errbuf);
492 				goto error;
493 			}
494 
495 			*slash = '\0';
496 
497 			if (strval[0] != '\0' &&
498 			    (stat64(strval, &statbuf) != 0 ||
499 			    !S_ISDIR(statbuf.st_mode))) {
500 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
501 				    "'%s' is not a valid directory"),
502 				    strval);
503 				(void) zfs_error(hdl, EZFS_BADPATH, errbuf);
504 				goto error;
505 			}
506 
507 			*slash = '/';
508 			break;
509 		}
510 	}
511 
512 	return (retprops);
513 error:
514 	nvlist_free(retprops);
515 	return (NULL);
516 }
517 
518 /*
519  * Set zpool property : propname=propval.
520  */
521 int
522 zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval)
523 {
524 	zfs_cmd_t zc = { 0 };
525 	int ret = -1;
526 	char errbuf[1024];
527 	nvlist_t *nvl = NULL;
528 	nvlist_t *realprops;
529 	uint64_t version;
530 
531 	(void) snprintf(errbuf, sizeof (errbuf),
532 	    dgettext(TEXT_DOMAIN, "cannot set property for '%s'"),
533 	    zhp->zpool_name);
534 
535 	if (zhp->zpool_props == NULL && zpool_get_all_props(zhp))
536 		return (zfs_error(zhp->zpool_hdl, EZFS_POOLPROPS, errbuf));
537 
538 	if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0)
539 		return (no_memory(zhp->zpool_hdl));
540 
541 	if (nvlist_add_string(nvl, propname, propval) != 0) {
542 		nvlist_free(nvl);
543 		return (no_memory(zhp->zpool_hdl));
544 	}
545 
546 	version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL);
547 	if ((realprops = zpool_valid_proplist(zhp->zpool_hdl,
548 	    zhp->zpool_name, nvl, version, B_FALSE, errbuf)) == NULL) {
549 		nvlist_free(nvl);
550 		return (-1);
551 	}
552 
553 	nvlist_free(nvl);
554 	nvl = realprops;
555 
556 	/*
557 	 * Execute the corresponding ioctl() to set this property.
558 	 */
559 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
560 
561 	if (zcmd_write_src_nvlist(zhp->zpool_hdl, &zc, nvl) != 0) {
562 		nvlist_free(nvl);
563 		return (-1);
564 	}
565 
566 	ret = zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_SET_PROPS, &zc);
567 
568 	zcmd_free_nvlists(&zc);
569 	nvlist_free(nvl);
570 
571 	if (ret)
572 		(void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf);
573 	else
574 		(void) zpool_props_refresh(zhp);
575 
576 	return (ret);
577 }
578 
579 int
580 zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp)
581 {
582 	libzfs_handle_t *hdl = zhp->zpool_hdl;
583 	zprop_list_t *entry;
584 	char buf[ZFS_MAXPROPLEN];
585 
586 	if (zprop_expand_list(hdl, plp, ZFS_TYPE_POOL) != 0)
587 		return (-1);
588 
589 	for (entry = *plp; entry != NULL; entry = entry->pl_next) {
590 
591 		if (entry->pl_fixed)
592 			continue;
593 
594 		if (entry->pl_prop != ZPROP_INVAL &&
595 		    zpool_get_prop(zhp, entry->pl_prop, buf, sizeof (buf),
596 		    NULL) == 0) {
597 			if (strlen(buf) > entry->pl_width)
598 				entry->pl_width = strlen(buf);
599 		}
600 	}
601 
602 	return (0);
603 }
604 
605 
606 /*
607  * Validate the given pool name, optionally putting an extended error message in
608  * 'buf'.
609  */
610 boolean_t
611 zpool_name_valid(libzfs_handle_t *hdl, boolean_t isopen, const char *pool)
612 {
613 	namecheck_err_t why;
614 	char what;
615 	int ret;
616 
617 	ret = pool_namecheck(pool, &why, &what);
618 
619 	/*
620 	 * The rules for reserved pool names were extended at a later point.
621 	 * But we need to support users with existing pools that may now be
622 	 * invalid.  So we only check for this expanded set of names during a
623 	 * create (or import), and only in userland.
624 	 */
625 	if (ret == 0 && !isopen &&
626 	    (strncmp(pool, "mirror", 6) == 0 ||
627 	    strncmp(pool, "raidz", 5) == 0 ||
628 	    strncmp(pool, "spare", 5) == 0 ||
629 	    strcmp(pool, "log") == 0)) {
630 		if (hdl != NULL)
631 			zfs_error_aux(hdl,
632 			    dgettext(TEXT_DOMAIN, "name is reserved"));
633 		return (B_FALSE);
634 	}
635 
636 
637 	if (ret != 0) {
638 		if (hdl != NULL) {
639 			switch (why) {
640 			case NAME_ERR_TOOLONG:
641 				zfs_error_aux(hdl,
642 				    dgettext(TEXT_DOMAIN, "name is too long"));
643 				break;
644 
645 			case NAME_ERR_INVALCHAR:
646 				zfs_error_aux(hdl,
647 				    dgettext(TEXT_DOMAIN, "invalid character "
648 				    "'%c' in pool name"), what);
649 				break;
650 
651 			case NAME_ERR_NOLETTER:
652 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
653 				    "name must begin with a letter"));
654 				break;
655 
656 			case NAME_ERR_RESERVED:
657 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
658 				    "name is reserved"));
659 				break;
660 
661 			case NAME_ERR_DISKLIKE:
662 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
663 				    "pool name is reserved"));
664 				break;
665 
666 			case NAME_ERR_LEADING_SLASH:
667 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
668 				    "leading slash in name"));
669 				break;
670 
671 			case NAME_ERR_EMPTY_COMPONENT:
672 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
673 				    "empty component in name"));
674 				break;
675 
676 			case NAME_ERR_TRAILING_SLASH:
677 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
678 				    "trailing slash in name"));
679 				break;
680 
681 			case NAME_ERR_MULTIPLE_AT:
682 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
683 				    "multiple '@' delimiters in name"));
684 				break;
685 
686 			}
687 		}
688 		return (B_FALSE);
689 	}
690 
691 	return (B_TRUE);
692 }
693 
694 /*
695  * Open a handle to the given pool, even if the pool is currently in the FAULTED
696  * state.
697  */
698 zpool_handle_t *
699 zpool_open_canfail(libzfs_handle_t *hdl, const char *pool)
700 {
701 	zpool_handle_t *zhp;
702 	boolean_t missing;
703 
704 	/*
705 	 * Make sure the pool name is valid.
706 	 */
707 	if (!zpool_name_valid(hdl, B_TRUE, pool)) {
708 		(void) zfs_error_fmt(hdl, EZFS_INVALIDNAME,
709 		    dgettext(TEXT_DOMAIN, "cannot open '%s'"),
710 		    pool);
711 		return (NULL);
712 	}
713 
714 	if ((zhp = zfs_alloc(hdl, sizeof (zpool_handle_t))) == NULL)
715 		return (NULL);
716 
717 	zhp->zpool_hdl = hdl;
718 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
719 
720 	if (zpool_refresh_stats(zhp, &missing) != 0) {
721 		zpool_close(zhp);
722 		return (NULL);
723 	}
724 
725 	if (missing) {
726 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "no such pool"));
727 		(void) zfs_error_fmt(hdl, EZFS_NOENT,
728 		    dgettext(TEXT_DOMAIN, "cannot open '%s'"), pool);
729 		zpool_close(zhp);
730 		return (NULL);
731 	}
732 
733 	return (zhp);
734 }
735 
736 /*
737  * Like the above, but silent on error.  Used when iterating over pools (because
738  * the configuration cache may be out of date).
739  */
740 int
741 zpool_open_silent(libzfs_handle_t *hdl, const char *pool, zpool_handle_t **ret)
742 {
743 	zpool_handle_t *zhp;
744 	boolean_t missing;
745 
746 	if ((zhp = zfs_alloc(hdl, sizeof (zpool_handle_t))) == NULL)
747 		return (-1);
748 
749 	zhp->zpool_hdl = hdl;
750 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
751 
752 	if (zpool_refresh_stats(zhp, &missing) != 0) {
753 		zpool_close(zhp);
754 		return (-1);
755 	}
756 
757 	if (missing) {
758 		zpool_close(zhp);
759 		*ret = NULL;
760 		return (0);
761 	}
762 
763 	*ret = zhp;
764 	return (0);
765 }
766 
767 /*
768  * Similar to zpool_open_canfail(), but refuses to open pools in the faulted
769  * state.
770  */
771 zpool_handle_t *
772 zpool_open(libzfs_handle_t *hdl, const char *pool)
773 {
774 	zpool_handle_t *zhp;
775 
776 	if ((zhp = zpool_open_canfail(hdl, pool)) == NULL)
777 		return (NULL);
778 
779 	if (zhp->zpool_state == POOL_STATE_UNAVAIL) {
780 		(void) zfs_error_fmt(hdl, EZFS_POOLUNAVAIL,
781 		    dgettext(TEXT_DOMAIN, "cannot open '%s'"), zhp->zpool_name);
782 		zpool_close(zhp);
783 		return (NULL);
784 	}
785 
786 	return (zhp);
787 }
788 
789 /*
790  * Close the handle.  Simply frees the memory associated with the handle.
791  */
792 void
793 zpool_close(zpool_handle_t *zhp)
794 {
795 	if (zhp->zpool_config)
796 		nvlist_free(zhp->zpool_config);
797 	if (zhp->zpool_old_config)
798 		nvlist_free(zhp->zpool_old_config);
799 	if (zhp->zpool_props)
800 		nvlist_free(zhp->zpool_props);
801 	free(zhp);
802 }
803 
804 /*
805  * Return the name of the pool.
806  */
807 const char *
808 zpool_get_name(zpool_handle_t *zhp)
809 {
810 	return (zhp->zpool_name);
811 }
812 
813 
814 /*
815  * Return the state of the pool (ACTIVE or UNAVAILABLE)
816  */
817 int
818 zpool_get_state(zpool_handle_t *zhp)
819 {
820 	return (zhp->zpool_state);
821 }
822 
823 /*
824  * Create the named pool, using the provided vdev list.  It is assumed
825  * that the consumer has already validated the contents of the nvlist, so we
826  * don't have to worry about error semantics.
827  */
828 int
829 zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot,
830     nvlist_t *props, nvlist_t *fsprops)
831 {
832 	zfs_cmd_t zc = { 0 };
833 	nvlist_t *zc_fsprops = NULL;
834 	nvlist_t *zc_props = NULL;
835 	char msg[1024];
836 	char *altroot;
837 	int ret = -1;
838 
839 	(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
840 	    "cannot create '%s'"), pool);
841 
842 	if (!zpool_name_valid(hdl, B_FALSE, pool))
843 		return (zfs_error(hdl, EZFS_INVALIDNAME, msg));
844 
845 	if (zcmd_write_conf_nvlist(hdl, &zc, nvroot) != 0)
846 		return (-1);
847 
848 	if (props) {
849 		if ((zc_props = zpool_valid_proplist(hdl, pool, props,
850 		    SPA_VERSION_1, B_TRUE, msg)) == NULL) {
851 			goto create_failed;
852 		}
853 	}
854 
855 	if (fsprops) {
856 		uint64_t zoned;
857 		char *zonestr;
858 
859 		zoned = ((nvlist_lookup_string(fsprops,
860 		    zfs_prop_to_name(ZFS_PROP_ZONED), &zonestr) == 0) &&
861 		    strcmp(zonestr, "on") == 0);
862 
863 		if ((zc_fsprops = zfs_valid_proplist(hdl,
864 		    ZFS_TYPE_FILESYSTEM, fsprops, zoned, NULL, msg)) == NULL) {
865 			goto create_failed;
866 		}
867 		if (!zc_props &&
868 		    (nvlist_alloc(&zc_props, NV_UNIQUE_NAME, 0) != 0)) {
869 			goto create_failed;
870 		}
871 		if (nvlist_add_nvlist(zc_props,
872 		    ZPOOL_ROOTFS_PROPS, zc_fsprops) != 0) {
873 			goto create_failed;
874 		}
875 	}
876 
877 	if (zc_props && zcmd_write_src_nvlist(hdl, &zc, zc_props) != 0)
878 		goto create_failed;
879 
880 	(void) strlcpy(zc.zc_name, pool, sizeof (zc.zc_name));
881 
882 	if ((ret = zfs_ioctl(hdl, ZFS_IOC_POOL_CREATE, &zc)) != 0) {
883 
884 		zcmd_free_nvlists(&zc);
885 		nvlist_free(zc_props);
886 		nvlist_free(zc_fsprops);
887 
888 		switch (errno) {
889 		case EBUSY:
890 			/*
891 			 * This can happen if the user has specified the same
892 			 * device multiple times.  We can't reliably detect this
893 			 * until we try to add it and see we already have a
894 			 * label.
895 			 */
896 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
897 			    "one or more vdevs refer to the same device"));
898 			return (zfs_error(hdl, EZFS_BADDEV, msg));
899 
900 		case EOVERFLOW:
901 			/*
902 			 * This occurs when one of the devices is below
903 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
904 			 * device was the problem device since there's no
905 			 * reliable way to determine device size from userland.
906 			 */
907 			{
908 				char buf[64];
909 
910 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
911 
912 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
913 				    "one or more devices is less than the "
914 				    "minimum size (%s)"), buf);
915 			}
916 			return (zfs_error(hdl, EZFS_BADDEV, msg));
917 
918 		case ENOSPC:
919 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
920 			    "one or more devices is out of space"));
921 			return (zfs_error(hdl, EZFS_BADDEV, msg));
922 
923 		case ENOTBLK:
924 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
925 			    "cache device must be a disk or disk slice"));
926 			return (zfs_error(hdl, EZFS_BADDEV, msg));
927 
928 		default:
929 			return (zpool_standard_error(hdl, errno, msg));
930 		}
931 	}
932 
933 	/*
934 	 * If this is an alternate root pool, then we automatically set the
935 	 * mountpoint of the root dataset to be '/'.
936 	 */
937 	if (nvlist_lookup_string(props, zpool_prop_to_name(ZPOOL_PROP_ALTROOT),
938 	    &altroot) == 0) {
939 		zfs_handle_t *zhp;
940 
941 		verify((zhp = zfs_open(hdl, pool, ZFS_TYPE_DATASET)) != NULL);
942 		verify(zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
943 		    "/") == 0);
944 
945 		zfs_close(zhp);
946 	}
947 
948 create_failed:
949 	zcmd_free_nvlists(&zc);
950 	nvlist_free(zc_props);
951 	nvlist_free(zc_fsprops);
952 	return (ret);
953 }
954 
955 /*
956  * Destroy the given pool.  It is up to the caller to ensure that there are no
957  * datasets left in the pool.
958  */
959 int
960 zpool_destroy(zpool_handle_t *zhp)
961 {
962 	zfs_cmd_t zc = { 0 };
963 	zfs_handle_t *zfp = NULL;
964 	libzfs_handle_t *hdl = zhp->zpool_hdl;
965 	char msg[1024];
966 
967 	if (zhp->zpool_state == POOL_STATE_ACTIVE &&
968 	    (zfp = zfs_open(zhp->zpool_hdl, zhp->zpool_name,
969 	    ZFS_TYPE_FILESYSTEM)) == NULL)
970 		return (-1);
971 
972 	if (zpool_remove_zvol_links(zhp) != 0)
973 		return (-1);
974 
975 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
976 
977 	if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_DESTROY, &zc) != 0) {
978 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
979 		    "cannot destroy '%s'"), zhp->zpool_name);
980 
981 		if (errno == EROFS) {
982 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
983 			    "one or more devices is read only"));
984 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
985 		} else {
986 			(void) zpool_standard_error(hdl, errno, msg);
987 		}
988 
989 		if (zfp)
990 			zfs_close(zfp);
991 		return (-1);
992 	}
993 
994 	if (zfp) {
995 		remove_mountpoint(zfp);
996 		zfs_close(zfp);
997 	}
998 
999 	return (0);
1000 }
1001 
1002 /*
1003  * Add the given vdevs to the pool.  The caller must have already performed the
1004  * necessary verification to ensure that the vdev specification is well-formed.
1005  */
1006 int
1007 zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot)
1008 {
1009 	zfs_cmd_t zc = { 0 };
1010 	int ret;
1011 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1012 	char msg[1024];
1013 	nvlist_t **spares, **l2cache;
1014 	uint_t nspares, nl2cache;
1015 
1016 	(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
1017 	    "cannot add to '%s'"), zhp->zpool_name);
1018 
1019 	if (zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL) <
1020 	    SPA_VERSION_SPARES &&
1021 	    nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
1022 	    &spares, &nspares) == 0) {
1023 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be "
1024 		    "upgraded to add hot spares"));
1025 		return (zfs_error(hdl, EZFS_BADVERSION, msg));
1026 	}
1027 
1028 	if (pool_is_bootable(zhp) && nvlist_lookup_nvlist_array(nvroot,
1029 	    ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0) {
1030 		uint64_t s;
1031 
1032 		for (s = 0; s < nspares; s++) {
1033 			char *path;
1034 
1035 			if (nvlist_lookup_string(spares[s], ZPOOL_CONFIG_PATH,
1036 			    &path) == 0 && pool_uses_efi(spares[s])) {
1037 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1038 				    "device '%s' contains an EFI label and "
1039 				    "cannot be used on root pools."),
1040 				    zpool_vdev_name(hdl, NULL, spares[s]));
1041 				return (zfs_error(hdl, EZFS_POOL_NOTSUP, msg));
1042 			}
1043 		}
1044 	}
1045 
1046 	if (zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL) <
1047 	    SPA_VERSION_L2CACHE &&
1048 	    nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
1049 	    &l2cache, &nl2cache) == 0) {
1050 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be "
1051 		    "upgraded to add cache devices"));
1052 		return (zfs_error(hdl, EZFS_BADVERSION, msg));
1053 	}
1054 
1055 	if (zcmd_write_conf_nvlist(hdl, &zc, nvroot) != 0)
1056 		return (-1);
1057 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1058 
1059 	if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_VDEV_ADD, &zc) != 0) {
1060 		switch (errno) {
1061 		case EBUSY:
1062 			/*
1063 			 * This can happen if the user has specified the same
1064 			 * device multiple times.  We can't reliably detect this
1065 			 * until we try to add it and see we already have a
1066 			 * label.
1067 			 */
1068 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1069 			    "one or more vdevs refer to the same device"));
1070 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
1071 			break;
1072 
1073 		case EOVERFLOW:
1074 			/*
1075 			 * This occurrs when one of the devices is below
1076 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
1077 			 * device was the problem device since there's no
1078 			 * reliable way to determine device size from userland.
1079 			 */
1080 			{
1081 				char buf[64];
1082 
1083 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
1084 
1085 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1086 				    "device is less than the minimum "
1087 				    "size (%s)"), buf);
1088 			}
1089 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
1090 			break;
1091 
1092 		case ENOTSUP:
1093 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1094 			    "pool must be upgraded to add these vdevs"));
1095 			(void) zfs_error(hdl, EZFS_BADVERSION, msg);
1096 			break;
1097 
1098 		case EDOM:
1099 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1100 			    "root pool can not have multiple vdevs"
1101 			    " or separate logs"));
1102 			(void) zfs_error(hdl, EZFS_POOL_NOTSUP, msg);
1103 			break;
1104 
1105 		case ENOTBLK:
1106 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1107 			    "cache device must be a disk or disk slice"));
1108 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
1109 			break;
1110 
1111 		default:
1112 			(void) zpool_standard_error(hdl, errno, msg);
1113 		}
1114 
1115 		ret = -1;
1116 	} else {
1117 		ret = 0;
1118 	}
1119 
1120 	zcmd_free_nvlists(&zc);
1121 
1122 	return (ret);
1123 }
1124 
1125 /*
1126  * Exports the pool from the system.  The caller must ensure that there are no
1127  * mounted datasets in the pool.
1128  */
1129 int
1130 zpool_export_common(zpool_handle_t *zhp, boolean_t force, boolean_t hardforce)
1131 {
1132 	zfs_cmd_t zc = { 0 };
1133 	char msg[1024];
1134 
1135 	if (zpool_remove_zvol_links(zhp) != 0)
1136 		return (-1);
1137 
1138 	(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
1139 	    "cannot export '%s'"), zhp->zpool_name);
1140 
1141 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1142 	zc.zc_cookie = force;
1143 	zc.zc_guid = hardforce;
1144 
1145 	if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_EXPORT, &zc) != 0) {
1146 		switch (errno) {
1147 		case EXDEV:
1148 			zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN,
1149 			    "use '-f' to override the following errors:\n"
1150 			    "'%s' has an active shared spare which could be"
1151 			    " used by other pools once '%s' is exported."),
1152 			    zhp->zpool_name, zhp->zpool_name);
1153 			return (zfs_error(zhp->zpool_hdl, EZFS_ACTIVE_SPARE,
1154 			    msg));
1155 		default:
1156 			return (zpool_standard_error_fmt(zhp->zpool_hdl, errno,
1157 			    msg));
1158 		}
1159 	}
1160 
1161 	return (0);
1162 }
1163 
1164 int
1165 zpool_export(zpool_handle_t *zhp, boolean_t force)
1166 {
1167 	return (zpool_export_common(zhp, force, B_FALSE));
1168 }
1169 
1170 int
1171 zpool_export_force(zpool_handle_t *zhp)
1172 {
1173 	return (zpool_export_common(zhp, B_TRUE, B_TRUE));
1174 }
1175 
1176 /*
1177  * zpool_import() is a contracted interface. Should be kept the same
1178  * if possible.
1179  *
1180  * Applications should use zpool_import_props() to import a pool with
1181  * new properties value to be set.
1182  */
1183 int
1184 zpool_import(libzfs_handle_t *hdl, nvlist_t *config, const char *newname,
1185     char *altroot)
1186 {
1187 	nvlist_t *props = NULL;
1188 	int ret;
1189 
1190 	if (altroot != NULL) {
1191 		if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0) {
1192 			return (zfs_error_fmt(hdl, EZFS_NOMEM,
1193 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
1194 			    newname));
1195 		}
1196 
1197 		if (nvlist_add_string(props,
1198 		    zpool_prop_to_name(ZPOOL_PROP_ALTROOT), altroot) != 0 ||
1199 		    nvlist_add_string(props,
1200 		    zpool_prop_to_name(ZPOOL_PROP_CACHEFILE), "none") != 0) {
1201 			nvlist_free(props);
1202 			return (zfs_error_fmt(hdl, EZFS_NOMEM,
1203 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
1204 			    newname));
1205 		}
1206 	}
1207 
1208 	ret = zpool_import_props(hdl, config, newname, props, B_FALSE);
1209 	if (props)
1210 		nvlist_free(props);
1211 	return (ret);
1212 }
1213 
1214 /*
1215  * Import the given pool using the known configuration and a list of
1216  * properties to be set. The configuration should have come from
1217  * zpool_find_import(). The 'newname' parameters control whether the pool
1218  * is imported with a different name.
1219  */
1220 int
1221 zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname,
1222     nvlist_t *props, boolean_t importfaulted)
1223 {
1224 	zfs_cmd_t zc = { 0 };
1225 	char *thename;
1226 	char *origname;
1227 	int ret;
1228 	char errbuf[1024];
1229 
1230 	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
1231 	    &origname) == 0);
1232 
1233 	(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
1234 	    "cannot import pool '%s'"), origname);
1235 
1236 	if (newname != NULL) {
1237 		if (!zpool_name_valid(hdl, B_FALSE, newname))
1238 			return (zfs_error_fmt(hdl, EZFS_INVALIDNAME,
1239 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
1240 			    newname));
1241 		thename = (char *)newname;
1242 	} else {
1243 		thename = origname;
1244 	}
1245 
1246 	if (props) {
1247 		uint64_t version;
1248 
1249 		verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
1250 		    &version) == 0);
1251 
1252 		if ((props = zpool_valid_proplist(hdl, origname,
1253 		    props, version, B_TRUE, errbuf)) == NULL) {
1254 			return (-1);
1255 		} else if (zcmd_write_src_nvlist(hdl, &zc, props) != 0) {
1256 			nvlist_free(props);
1257 			return (-1);
1258 		}
1259 	}
1260 
1261 	(void) strlcpy(zc.zc_name, thename, sizeof (zc.zc_name));
1262 
1263 	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
1264 	    &zc.zc_guid) == 0);
1265 
1266 	if (zcmd_write_conf_nvlist(hdl, &zc, config) != 0) {
1267 		nvlist_free(props);
1268 		return (-1);
1269 	}
1270 
1271 	zc.zc_cookie = (uint64_t)importfaulted;
1272 	ret = 0;
1273 	if (zfs_ioctl(hdl, ZFS_IOC_POOL_IMPORT, &zc) != 0) {
1274 		char desc[1024];
1275 		if (newname == NULL)
1276 			(void) snprintf(desc, sizeof (desc),
1277 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
1278 			    thename);
1279 		else
1280 			(void) snprintf(desc, sizeof (desc),
1281 			    dgettext(TEXT_DOMAIN, "cannot import '%s' as '%s'"),
1282 			    origname, thename);
1283 
1284 		switch (errno) {
1285 		case ENOTSUP:
1286 			/*
1287 			 * Unsupported version.
1288 			 */
1289 			(void) zfs_error(hdl, EZFS_BADVERSION, desc);
1290 			break;
1291 
1292 		case EINVAL:
1293 			(void) zfs_error(hdl, EZFS_INVALCONFIG, desc);
1294 			break;
1295 
1296 		default:
1297 			(void) zpool_standard_error(hdl, errno, desc);
1298 		}
1299 
1300 		ret = -1;
1301 	} else {
1302 		zpool_handle_t *zhp;
1303 
1304 		/*
1305 		 * This should never fail, but play it safe anyway.
1306 		 */
1307 		if (zpool_open_silent(hdl, thename, &zhp) != 0) {
1308 			ret = -1;
1309 		} else if (zhp != NULL) {
1310 			ret = zpool_create_zvol_links(zhp);
1311 			zpool_close(zhp);
1312 		}
1313 
1314 	}
1315 
1316 	zcmd_free_nvlists(&zc);
1317 	nvlist_free(props);
1318 
1319 	return (ret);
1320 }
1321 
1322 /*
1323  * Scrub the pool.
1324  */
1325 int
1326 zpool_scrub(zpool_handle_t *zhp, pool_scrub_type_t type)
1327 {
1328 	zfs_cmd_t zc = { 0 };
1329 	char msg[1024];
1330 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1331 
1332 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1333 	zc.zc_cookie = type;
1334 
1335 	if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_SCRUB, &zc) == 0)
1336 		return (0);
1337 
1338 	(void) snprintf(msg, sizeof (msg),
1339 	    dgettext(TEXT_DOMAIN, "cannot scrub %s"), zc.zc_name);
1340 
1341 	if (errno == EBUSY)
1342 		return (zfs_error(hdl, EZFS_RESILVERING, msg));
1343 	else
1344 		return (zpool_standard_error(hdl, errno, msg));
1345 }
1346 
1347 /*
1348  * 'avail_spare' is set to TRUE if the provided guid refers to an AVAIL
1349  * spare; but FALSE if its an INUSE spare.
1350  */
1351 static nvlist_t *
1352 vdev_to_nvlist_iter(nvlist_t *nv, const char *search, uint64_t guid,
1353     boolean_t *avail_spare, boolean_t *l2cache, boolean_t *log)
1354 {
1355 	uint_t c, children;
1356 	nvlist_t **child;
1357 	uint64_t theguid, present;
1358 	char *path;
1359 	uint64_t wholedisk = 0;
1360 	nvlist_t *ret;
1361 	uint64_t is_log;
1362 
1363 	verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &theguid) == 0);
1364 
1365 	if (search == NULL &&
1366 	    nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &present) == 0) {
1367 		/*
1368 		 * If the device has never been present since import, the only
1369 		 * reliable way to match the vdev is by GUID.
1370 		 */
1371 		if (theguid == guid)
1372 			return (nv);
1373 	} else if (search != NULL &&
1374 	    nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
1375 		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
1376 		    &wholedisk);
1377 		if (wholedisk) {
1378 			/*
1379 			 * For whole disks, the internal path has 's0', but the
1380 			 * path passed in by the user doesn't.
1381 			 */
1382 			if (strlen(search) == strlen(path) - 2 &&
1383 			    strncmp(search, path, strlen(search)) == 0)
1384 				return (nv);
1385 		} else if (strcmp(search, path) == 0) {
1386 			return (nv);
1387 		}
1388 	}
1389 
1390 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
1391 	    &child, &children) != 0)
1392 		return (NULL);
1393 
1394 	for (c = 0; c < children; c++) {
1395 		if ((ret = vdev_to_nvlist_iter(child[c], search, guid,
1396 		    avail_spare, l2cache, NULL)) != NULL) {
1397 			/*
1398 			 * The 'is_log' value is only set for the toplevel
1399 			 * vdev, not the leaf vdevs.  So we always lookup the
1400 			 * log device from the root of the vdev tree (where
1401 			 * 'log' is non-NULL).
1402 			 */
1403 			if (log != NULL &&
1404 			    nvlist_lookup_uint64(child[c],
1405 			    ZPOOL_CONFIG_IS_LOG, &is_log) == 0 &&
1406 			    is_log) {
1407 				*log = B_TRUE;
1408 			}
1409 			return (ret);
1410 		}
1411 	}
1412 
1413 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
1414 	    &child, &children) == 0) {
1415 		for (c = 0; c < children; c++) {
1416 			if ((ret = vdev_to_nvlist_iter(child[c], search, guid,
1417 			    avail_spare, l2cache, NULL)) != NULL) {
1418 				*avail_spare = B_TRUE;
1419 				return (ret);
1420 			}
1421 		}
1422 	}
1423 
1424 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
1425 	    &child, &children) == 0) {
1426 		for (c = 0; c < children; c++) {
1427 			if ((ret = vdev_to_nvlist_iter(child[c], search, guid,
1428 			    avail_spare, l2cache, NULL)) != NULL) {
1429 				*l2cache = B_TRUE;
1430 				return (ret);
1431 			}
1432 		}
1433 	}
1434 
1435 	return (NULL);
1436 }
1437 
1438 nvlist_t *
1439 zpool_find_vdev(zpool_handle_t *zhp, const char *path, boolean_t *avail_spare,
1440     boolean_t *l2cache, boolean_t *log)
1441 {
1442 	char buf[MAXPATHLEN];
1443 	const char *search;
1444 	char *end;
1445 	nvlist_t *nvroot;
1446 	uint64_t guid;
1447 
1448 	guid = strtoull(path, &end, 10);
1449 	if (guid != 0 && *end == '\0') {
1450 		search = NULL;
1451 	} else if (path[0] != '/') {
1452 		(void) snprintf(buf, sizeof (buf), "%s%s", "/dev/dsk/", path);
1453 		search = buf;
1454 	} else {
1455 		search = path;
1456 	}
1457 
1458 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
1459 	    &nvroot) == 0);
1460 
1461 	*avail_spare = B_FALSE;
1462 	*l2cache = B_FALSE;
1463 	if (log != NULL)
1464 		*log = B_FALSE;
1465 	return (vdev_to_nvlist_iter(nvroot, search, guid, avail_spare,
1466 	    l2cache, log));
1467 }
1468 
1469 static int
1470 vdev_online(nvlist_t *nv)
1471 {
1472 	uint64_t ival;
1473 
1474 	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_OFFLINE, &ival) == 0 ||
1475 	    nvlist_lookup_uint64(nv, ZPOOL_CONFIG_FAULTED, &ival) == 0 ||
1476 	    nvlist_lookup_uint64(nv, ZPOOL_CONFIG_REMOVED, &ival) == 0)
1477 		return (0);
1478 
1479 	return (1);
1480 }
1481 
1482 /*
1483  * Get phys_path for a root pool
1484  * Return 0 on success; non-zeron on failure.
1485  */
1486 int
1487 zpool_get_physpath(zpool_handle_t *zhp, char *physpath)
1488 {
1489 	nvlist_t *vdev_root;
1490 	nvlist_t **child;
1491 	uint_t count;
1492 	int i;
1493 
1494 	/*
1495 	 * Make sure this is a root pool, as phys_path doesn't mean
1496 	 * anything to a non-root pool.
1497 	 */
1498 	if (!pool_is_bootable(zhp))
1499 		return (-1);
1500 
1501 	verify(nvlist_lookup_nvlist(zhp->zpool_config,
1502 	    ZPOOL_CONFIG_VDEV_TREE, &vdev_root) == 0);
1503 
1504 	if (nvlist_lookup_nvlist_array(vdev_root, ZPOOL_CONFIG_CHILDREN,
1505 	    &child, &count) != 0)
1506 		return (-2);
1507 
1508 	for (i = 0; i < count; i++) {
1509 		nvlist_t **child2;
1510 		uint_t count2;
1511 		char *type;
1512 		char *tmppath;
1513 		int j;
1514 
1515 		if (nvlist_lookup_string(child[i], ZPOOL_CONFIG_TYPE, &type)
1516 		    != 0)
1517 			return (-3);
1518 
1519 		if (strcmp(type, VDEV_TYPE_DISK) == 0) {
1520 			if (!vdev_online(child[i]))
1521 				return (-8);
1522 			verify(nvlist_lookup_string(child[i],
1523 			    ZPOOL_CONFIG_PHYS_PATH, &tmppath) == 0);
1524 			(void) strncpy(physpath, tmppath, strlen(tmppath));
1525 		} else if (strcmp(type, VDEV_TYPE_MIRROR) == 0) {
1526 			if (nvlist_lookup_nvlist_array(child[i],
1527 			    ZPOOL_CONFIG_CHILDREN, &child2, &count2) != 0)
1528 				return (-4);
1529 
1530 			for (j = 0; j < count2; j++) {
1531 				if (!vdev_online(child2[j]))
1532 					return (-8);
1533 				if (nvlist_lookup_string(child2[j],
1534 				    ZPOOL_CONFIG_PHYS_PATH, &tmppath) != 0)
1535 					return (-5);
1536 
1537 				if ((strlen(physpath) + strlen(tmppath)) >
1538 				    MAXNAMELEN)
1539 					return (-6);
1540 
1541 				if (strlen(physpath) == 0) {
1542 					(void) strncpy(physpath, tmppath,
1543 					    strlen(tmppath));
1544 				} else {
1545 					(void) strcat(physpath, " ");
1546 					(void) strcat(physpath, tmppath);
1547 				}
1548 			}
1549 		} else {
1550 			return (-7);
1551 		}
1552 	}
1553 
1554 	return (0);
1555 }
1556 
1557 /*
1558  * Returns TRUE if the given guid corresponds to the given type.
1559  * This is used to check for hot spares (INUSE or not), and level 2 cache
1560  * devices.
1561  */
1562 static boolean_t
1563 is_guid_type(zpool_handle_t *zhp, uint64_t guid, const char *type)
1564 {
1565 	uint64_t target_guid;
1566 	nvlist_t *nvroot;
1567 	nvlist_t **list;
1568 	uint_t count;
1569 	int i;
1570 
1571 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
1572 	    &nvroot) == 0);
1573 	if (nvlist_lookup_nvlist_array(nvroot, type, &list, &count) == 0) {
1574 		for (i = 0; i < count; i++) {
1575 			verify(nvlist_lookup_uint64(list[i], ZPOOL_CONFIG_GUID,
1576 			    &target_guid) == 0);
1577 			if (guid == target_guid)
1578 				return (B_TRUE);
1579 		}
1580 	}
1581 
1582 	return (B_FALSE);
1583 }
1584 
1585 /*
1586  * Bring the specified vdev online.   The 'flags' parameter is a set of the
1587  * ZFS_ONLINE_* flags.
1588  */
1589 int
1590 zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
1591     vdev_state_t *newstate)
1592 {
1593 	zfs_cmd_t zc = { 0 };
1594 	char msg[1024];
1595 	nvlist_t *tgt;
1596 	boolean_t avail_spare, l2cache;
1597 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1598 
1599 	(void) snprintf(msg, sizeof (msg),
1600 	    dgettext(TEXT_DOMAIN, "cannot online %s"), path);
1601 
1602 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1603 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache,
1604 	    NULL)) == NULL)
1605 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1606 
1607 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
1608 
1609 	if (avail_spare ||
1610 	    is_guid_type(zhp, zc.zc_guid, ZPOOL_CONFIG_SPARES) == B_TRUE)
1611 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
1612 
1613 	zc.zc_cookie = VDEV_STATE_ONLINE;
1614 	zc.zc_obj = flags;
1615 
1616 	if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_VDEV_SET_STATE, &zc) != 0)
1617 		return (zpool_standard_error(hdl, errno, msg));
1618 
1619 	*newstate = zc.zc_cookie;
1620 	return (0);
1621 }
1622 
1623 /*
1624  * Take the specified vdev offline
1625  */
1626 int
1627 zpool_vdev_offline(zpool_handle_t *zhp, const char *path, boolean_t istmp)
1628 {
1629 	zfs_cmd_t zc = { 0 };
1630 	char msg[1024];
1631 	nvlist_t *tgt;
1632 	boolean_t avail_spare, l2cache;
1633 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1634 
1635 	(void) snprintf(msg, sizeof (msg),
1636 	    dgettext(TEXT_DOMAIN, "cannot offline %s"), path);
1637 
1638 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1639 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache,
1640 	    NULL)) == NULL)
1641 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1642 
1643 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
1644 
1645 	if (avail_spare ||
1646 	    is_guid_type(zhp, zc.zc_guid, ZPOOL_CONFIG_SPARES) == B_TRUE)
1647 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
1648 
1649 	zc.zc_cookie = VDEV_STATE_OFFLINE;
1650 	zc.zc_obj = istmp ? ZFS_OFFLINE_TEMPORARY : 0;
1651 
1652 	if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_VDEV_SET_STATE, &zc) == 0)
1653 		return (0);
1654 
1655 	switch (errno) {
1656 	case EBUSY:
1657 
1658 		/*
1659 		 * There are no other replicas of this device.
1660 		 */
1661 		return (zfs_error(hdl, EZFS_NOREPLICAS, msg));
1662 
1663 	default:
1664 		return (zpool_standard_error(hdl, errno, msg));
1665 	}
1666 }
1667 
1668 /*
1669  * Mark the given vdev faulted.
1670  */
1671 int
1672 zpool_vdev_fault(zpool_handle_t *zhp, uint64_t guid)
1673 {
1674 	zfs_cmd_t zc = { 0 };
1675 	char msg[1024];
1676 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1677 
1678 	(void) snprintf(msg, sizeof (msg),
1679 	    dgettext(TEXT_DOMAIN, "cannot fault %llu"), guid);
1680 
1681 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1682 	zc.zc_guid = guid;
1683 	zc.zc_cookie = VDEV_STATE_FAULTED;
1684 
1685 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SET_STATE, &zc) == 0)
1686 		return (0);
1687 
1688 	switch (errno) {
1689 	case EBUSY:
1690 
1691 		/*
1692 		 * There are no other replicas of this device.
1693 		 */
1694 		return (zfs_error(hdl, EZFS_NOREPLICAS, msg));
1695 
1696 	default:
1697 		return (zpool_standard_error(hdl, errno, msg));
1698 	}
1699 
1700 }
1701 
1702 /*
1703  * Mark the given vdev degraded.
1704  */
1705 int
1706 zpool_vdev_degrade(zpool_handle_t *zhp, uint64_t guid)
1707 {
1708 	zfs_cmd_t zc = { 0 };
1709 	char msg[1024];
1710 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1711 
1712 	(void) snprintf(msg, sizeof (msg),
1713 	    dgettext(TEXT_DOMAIN, "cannot degrade %llu"), guid);
1714 
1715 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1716 	zc.zc_guid = guid;
1717 	zc.zc_cookie = VDEV_STATE_DEGRADED;
1718 
1719 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SET_STATE, &zc) == 0)
1720 		return (0);
1721 
1722 	return (zpool_standard_error(hdl, errno, msg));
1723 }
1724 
1725 /*
1726  * Returns TRUE if the given nvlist is a vdev that was originally swapped in as
1727  * a hot spare.
1728  */
1729 static boolean_t
1730 is_replacing_spare(nvlist_t *search, nvlist_t *tgt, int which)
1731 {
1732 	nvlist_t **child;
1733 	uint_t c, children;
1734 	char *type;
1735 
1736 	if (nvlist_lookup_nvlist_array(search, ZPOOL_CONFIG_CHILDREN, &child,
1737 	    &children) == 0) {
1738 		verify(nvlist_lookup_string(search, ZPOOL_CONFIG_TYPE,
1739 		    &type) == 0);
1740 
1741 		if (strcmp(type, VDEV_TYPE_SPARE) == 0 &&
1742 		    children == 2 && child[which] == tgt)
1743 			return (B_TRUE);
1744 
1745 		for (c = 0; c < children; c++)
1746 			if (is_replacing_spare(child[c], tgt, which))
1747 				return (B_TRUE);
1748 	}
1749 
1750 	return (B_FALSE);
1751 }
1752 
1753 /*
1754  * Attach new_disk (fully described by nvroot) to old_disk.
1755  * If 'replacing' is specified, the new disk will replace the old one.
1756  */
1757 int
1758 zpool_vdev_attach(zpool_handle_t *zhp,
1759     const char *old_disk, const char *new_disk, nvlist_t *nvroot, int replacing)
1760 {
1761 	zfs_cmd_t zc = { 0 };
1762 	char msg[1024];
1763 	int ret;
1764 	nvlist_t *tgt;
1765 	boolean_t avail_spare, l2cache, islog;
1766 	uint64_t val;
1767 	char *path, *newname;
1768 	nvlist_t **child;
1769 	uint_t children;
1770 	nvlist_t *config_root;
1771 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1772 	boolean_t rootpool = pool_is_bootable(zhp);
1773 
1774 	if (replacing)
1775 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
1776 		    "cannot replace %s with %s"), old_disk, new_disk);
1777 	else
1778 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
1779 		    "cannot attach %s to %s"), new_disk, old_disk);
1780 
1781 	/*
1782 	 * If this is a root pool, make sure that we're not attaching an
1783 	 * EFI labeled device.
1784 	 */
1785 	if (rootpool && pool_uses_efi(nvroot)) {
1786 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1787 		    "EFI labeled devices are not supported on root pools."));
1788 		return (zfs_error(hdl, EZFS_POOL_NOTSUP, msg));
1789 	}
1790 
1791 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1792 	if ((tgt = zpool_find_vdev(zhp, old_disk, &avail_spare, &l2cache,
1793 	    &islog)) == 0)
1794 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1795 
1796 	if (avail_spare)
1797 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
1798 
1799 	if (l2cache)
1800 		return (zfs_error(hdl, EZFS_ISL2CACHE, msg));
1801 
1802 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
1803 	zc.zc_cookie = replacing;
1804 
1805 	if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
1806 	    &child, &children) != 0 || children != 1) {
1807 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1808 		    "new device must be a single disk"));
1809 		return (zfs_error(hdl, EZFS_INVALCONFIG, msg));
1810 	}
1811 
1812 	verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
1813 	    ZPOOL_CONFIG_VDEV_TREE, &config_root) == 0);
1814 
1815 	if ((newname = zpool_vdev_name(NULL, NULL, child[0])) == NULL)
1816 		return (-1);
1817 
1818 	/*
1819 	 * If the target is a hot spare that has been swapped in, we can only
1820 	 * replace it with another hot spare.
1821 	 */
1822 	if (replacing &&
1823 	    nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_IS_SPARE, &val) == 0 &&
1824 	    (zpool_find_vdev(zhp, newname, &avail_spare, &l2cache,
1825 	    NULL) == NULL || !avail_spare) &&
1826 	    is_replacing_spare(config_root, tgt, 1)) {
1827 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1828 		    "can only be replaced by another hot spare"));
1829 		free(newname);
1830 		return (zfs_error(hdl, EZFS_BADTARGET, msg));
1831 	}
1832 
1833 	/*
1834 	 * If we are attempting to replace a spare, it canot be applied to an
1835 	 * already spared device.
1836 	 */
1837 	if (replacing &&
1838 	    nvlist_lookup_string(child[0], ZPOOL_CONFIG_PATH, &path) == 0 &&
1839 	    zpool_find_vdev(zhp, newname, &avail_spare,
1840 	    &l2cache, NULL) != NULL && avail_spare &&
1841 	    is_replacing_spare(config_root, tgt, 0)) {
1842 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1843 		    "device has already been replaced with a spare"));
1844 		free(newname);
1845 		return (zfs_error(hdl, EZFS_BADTARGET, msg));
1846 	}
1847 
1848 	free(newname);
1849 
1850 	if (zcmd_write_conf_nvlist(hdl, &zc, nvroot) != 0)
1851 		return (-1);
1852 
1853 	ret = zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_VDEV_ATTACH, &zc);
1854 
1855 	zcmd_free_nvlists(&zc);
1856 
1857 	if (ret == 0) {
1858 		if (rootpool) {
1859 			/*
1860 			 * XXX - This should be removed once we can
1861 			 * automatically install the bootblocks on the
1862 			 * newly attached disk.
1863 			 */
1864 			(void) fprintf(stderr, dgettext(TEXT_DOMAIN, "Please "
1865 			    "be sure to invoke %s to make '%s' bootable.\n"),
1866 			    BOOTCMD, new_disk);
1867 		}
1868 		return (0);
1869 	}
1870 
1871 	switch (errno) {
1872 	case ENOTSUP:
1873 		/*
1874 		 * Can't attach to or replace this type of vdev.
1875 		 */
1876 		if (replacing) {
1877 			if (islog)
1878 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1879 				    "cannot replace a log with a spare"));
1880 			else
1881 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1882 				    "cannot replace a replacing device"));
1883 		} else {
1884 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1885 			    "can only attach to mirrors and top-level "
1886 			    "disks"));
1887 		}
1888 		(void) zfs_error(hdl, EZFS_BADTARGET, msg);
1889 		break;
1890 
1891 	case EINVAL:
1892 		/*
1893 		 * The new device must be a single disk.
1894 		 */
1895 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1896 		    "new device must be a single disk"));
1897 		(void) zfs_error(hdl, EZFS_INVALCONFIG, msg);
1898 		break;
1899 
1900 	case EBUSY:
1901 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "%s is busy"),
1902 		    new_disk);
1903 		(void) zfs_error(hdl, EZFS_BADDEV, msg);
1904 		break;
1905 
1906 	case EOVERFLOW:
1907 		/*
1908 		 * The new device is too small.
1909 		 */
1910 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1911 		    "device is too small"));
1912 		(void) zfs_error(hdl, EZFS_BADDEV, msg);
1913 		break;
1914 
1915 	case EDOM:
1916 		/*
1917 		 * The new device has a different alignment requirement.
1918 		 */
1919 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1920 		    "devices have different sector alignment"));
1921 		(void) zfs_error(hdl, EZFS_BADDEV, msg);
1922 		break;
1923 
1924 	case ENAMETOOLONG:
1925 		/*
1926 		 * The resulting top-level vdev spec won't fit in the label.
1927 		 */
1928 		(void) zfs_error(hdl, EZFS_DEVOVERFLOW, msg);
1929 		break;
1930 
1931 	default:
1932 		(void) zpool_standard_error(hdl, errno, msg);
1933 	}
1934 
1935 	return (-1);
1936 }
1937 
1938 /*
1939  * Detach the specified device.
1940  */
1941 int
1942 zpool_vdev_detach(zpool_handle_t *zhp, const char *path)
1943 {
1944 	zfs_cmd_t zc = { 0 };
1945 	char msg[1024];
1946 	nvlist_t *tgt;
1947 	boolean_t avail_spare, l2cache;
1948 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1949 
1950 	(void) snprintf(msg, sizeof (msg),
1951 	    dgettext(TEXT_DOMAIN, "cannot detach %s"), path);
1952 
1953 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1954 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache,
1955 	    NULL)) == 0)
1956 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1957 
1958 	if (avail_spare)
1959 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
1960 
1961 	if (l2cache)
1962 		return (zfs_error(hdl, EZFS_ISL2CACHE, msg));
1963 
1964 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
1965 
1966 	if (zfs_ioctl(hdl, ZFS_IOC_VDEV_DETACH, &zc) == 0)
1967 		return (0);
1968 
1969 	switch (errno) {
1970 
1971 	case ENOTSUP:
1972 		/*
1973 		 * Can't detach from this type of vdev.
1974 		 */
1975 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "only "
1976 		    "applicable to mirror and replacing vdevs"));
1977 		(void) zfs_error(zhp->zpool_hdl, EZFS_BADTARGET, msg);
1978 		break;
1979 
1980 	case EBUSY:
1981 		/*
1982 		 * There are no other replicas of this device.
1983 		 */
1984 		(void) zfs_error(hdl, EZFS_NOREPLICAS, msg);
1985 		break;
1986 
1987 	default:
1988 		(void) zpool_standard_error(hdl, errno, msg);
1989 	}
1990 
1991 	return (-1);
1992 }
1993 
1994 /*
1995  * Remove the given device.  Currently, this is supported only for hot spares
1996  * and level 2 cache devices.
1997  */
1998 int
1999 zpool_vdev_remove(zpool_handle_t *zhp, const char *path)
2000 {
2001 	zfs_cmd_t zc = { 0 };
2002 	char msg[1024];
2003 	nvlist_t *tgt;
2004 	boolean_t avail_spare, l2cache;
2005 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2006 
2007 	(void) snprintf(msg, sizeof (msg),
2008 	    dgettext(TEXT_DOMAIN, "cannot remove %s"), path);
2009 
2010 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2011 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache,
2012 	    NULL)) == 0)
2013 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
2014 
2015 	if (!avail_spare && !l2cache) {
2016 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
2017 		    "only inactive hot spares or cache devices "
2018 		    "can be removed"));
2019 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
2020 	}
2021 
2022 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
2023 
2024 	if (zfs_ioctl(hdl, ZFS_IOC_VDEV_REMOVE, &zc) == 0)
2025 		return (0);
2026 
2027 	return (zpool_standard_error(hdl, errno, msg));
2028 }
2029 
2030 /*
2031  * Clear the errors for the pool, or the particular device if specified.
2032  */
2033 int
2034 zpool_clear(zpool_handle_t *zhp, const char *path)
2035 {
2036 	zfs_cmd_t zc = { 0 };
2037 	char msg[1024];
2038 	nvlist_t *tgt;
2039 	boolean_t avail_spare, l2cache;
2040 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2041 
2042 	if (path)
2043 		(void) snprintf(msg, sizeof (msg),
2044 		    dgettext(TEXT_DOMAIN, "cannot clear errors for %s"),
2045 		    path);
2046 	else
2047 		(void) snprintf(msg, sizeof (msg),
2048 		    dgettext(TEXT_DOMAIN, "cannot clear errors for %s"),
2049 		    zhp->zpool_name);
2050 
2051 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2052 	if (path) {
2053 		if ((tgt = zpool_find_vdev(zhp, path, &avail_spare,
2054 		    &l2cache, NULL)) == 0)
2055 			return (zfs_error(hdl, EZFS_NODEVICE, msg));
2056 
2057 		/*
2058 		 * Don't allow error clearing for hot spares.  Do allow
2059 		 * error clearing for l2cache devices.
2060 		 */
2061 		if (avail_spare)
2062 			return (zfs_error(hdl, EZFS_ISSPARE, msg));
2063 
2064 		verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID,
2065 		    &zc.zc_guid) == 0);
2066 	}
2067 
2068 	if (zfs_ioctl(hdl, ZFS_IOC_CLEAR, &zc) == 0)
2069 		return (0);
2070 
2071 	return (zpool_standard_error(hdl, errno, msg));
2072 }
2073 
2074 /*
2075  * Similar to zpool_clear(), but takes a GUID (used by fmd).
2076  */
2077 int
2078 zpool_vdev_clear(zpool_handle_t *zhp, uint64_t guid)
2079 {
2080 	zfs_cmd_t zc = { 0 };
2081 	char msg[1024];
2082 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2083 
2084 	(void) snprintf(msg, sizeof (msg),
2085 	    dgettext(TEXT_DOMAIN, "cannot clear errors for %llx"),
2086 	    guid);
2087 
2088 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2089 	zc.zc_guid = guid;
2090 
2091 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_CLEAR, &zc) == 0)
2092 		return (0);
2093 
2094 	return (zpool_standard_error(hdl, errno, msg));
2095 }
2096 
2097 /*
2098  * Iterate over all zvols in a given pool by walking the /dev/zvol/dsk/<pool>
2099  * hierarchy.
2100  */
2101 int
2102 zpool_iter_zvol(zpool_handle_t *zhp, int (*cb)(const char *, void *),
2103     void *data)
2104 {
2105 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2106 	char (*paths)[MAXPATHLEN];
2107 	size_t size = 4;
2108 	int curr, fd, base, ret = 0;
2109 	DIR *dirp;
2110 	struct dirent *dp;
2111 	struct stat st;
2112 
2113 	if ((base = open("/dev/zvol/dsk", O_RDONLY)) < 0)
2114 		return (errno == ENOENT ? 0 : -1);
2115 
2116 	if (fstatat(base, zhp->zpool_name, &st, 0) != 0) {
2117 		int err = errno;
2118 		(void) close(base);
2119 		return (err == ENOENT ? 0 : -1);
2120 	}
2121 
2122 	/*
2123 	 * Oddly this wasn't a directory -- ignore that failure since we
2124 	 * know there are no links lower in the (non-existant) hierarchy.
2125 	 */
2126 	if (!S_ISDIR(st.st_mode)) {
2127 		(void) close(base);
2128 		return (0);
2129 	}
2130 
2131 	if ((paths = zfs_alloc(hdl, size * sizeof (paths[0]))) == NULL) {
2132 		(void) close(base);
2133 		return (-1);
2134 	}
2135 
2136 	(void) strlcpy(paths[0], zhp->zpool_name, sizeof (paths[0]));
2137 	curr = 0;
2138 
2139 	while (curr >= 0) {
2140 		if (fstatat(base, paths[curr], &st, AT_SYMLINK_NOFOLLOW) != 0)
2141 			goto err;
2142 
2143 		if (S_ISDIR(st.st_mode)) {
2144 			if ((fd = openat(base, paths[curr], O_RDONLY)) < 0)
2145 				goto err;
2146 
2147 			if ((dirp = fdopendir(fd)) == NULL) {
2148 				(void) close(fd);
2149 				goto err;
2150 			}
2151 
2152 			while ((dp = readdir(dirp)) != NULL) {
2153 				if (dp->d_name[0] == '.')
2154 					continue;
2155 
2156 				if (curr + 1 == size) {
2157 					paths = zfs_realloc(hdl, paths,
2158 					    size * sizeof (paths[0]),
2159 					    size * 2 * sizeof (paths[0]));
2160 					if (paths == NULL) {
2161 						(void) closedir(dirp);
2162 						(void) close(fd);
2163 						goto err;
2164 					}
2165 
2166 					size *= 2;
2167 				}
2168 
2169 				(void) strlcpy(paths[curr + 1], paths[curr],
2170 				    sizeof (paths[curr + 1]));
2171 				(void) strlcat(paths[curr], "/",
2172 				    sizeof (paths[curr]));
2173 				(void) strlcat(paths[curr], dp->d_name,
2174 				    sizeof (paths[curr]));
2175 				curr++;
2176 			}
2177 
2178 			(void) closedir(dirp);
2179 
2180 		} else {
2181 			if ((ret = cb(paths[curr], data)) != 0)
2182 				break;
2183 		}
2184 
2185 		curr--;
2186 	}
2187 
2188 	free(paths);
2189 	(void) close(base);
2190 
2191 	return (ret);
2192 
2193 err:
2194 	free(paths);
2195 	(void) close(base);
2196 	return (-1);
2197 }
2198 
2199 typedef struct zvol_cb {
2200 	zpool_handle_t *zcb_pool;
2201 	boolean_t zcb_create;
2202 } zvol_cb_t;
2203 
2204 /*ARGSUSED*/
2205 static int
2206 do_zvol_create(zfs_handle_t *zhp, void *data)
2207 {
2208 	int ret = 0;
2209 
2210 	if (ZFS_IS_VOLUME(zhp)) {
2211 		(void) zvol_create_link(zhp->zfs_hdl, zhp->zfs_name);
2212 		ret = zfs_iter_snapshots(zhp, do_zvol_create, NULL);
2213 	}
2214 
2215 	if (ret == 0)
2216 		ret = zfs_iter_filesystems(zhp, do_zvol_create, NULL);
2217 
2218 	zfs_close(zhp);
2219 
2220 	return (ret);
2221 }
2222 
2223 /*
2224  * Iterate over all zvols in the pool and make any necessary minor nodes.
2225  */
2226 int
2227 zpool_create_zvol_links(zpool_handle_t *zhp)
2228 {
2229 	zfs_handle_t *zfp;
2230 	int ret;
2231 
2232 	/*
2233 	 * If the pool is unavailable, just return success.
2234 	 */
2235 	if ((zfp = make_dataset_handle(zhp->zpool_hdl,
2236 	    zhp->zpool_name)) == NULL)
2237 		return (0);
2238 
2239 	ret = zfs_iter_filesystems(zfp, do_zvol_create, NULL);
2240 
2241 	zfs_close(zfp);
2242 	return (ret);
2243 }
2244 
2245 static int
2246 do_zvol_remove(const char *dataset, void *data)
2247 {
2248 	zpool_handle_t *zhp = data;
2249 
2250 	return (zvol_remove_link(zhp->zpool_hdl, dataset));
2251 }
2252 
2253 /*
2254  * Iterate over all zvols in the pool and remove any minor nodes.  We iterate
2255  * by examining the /dev links so that a corrupted pool doesn't impede this
2256  * operation.
2257  */
2258 int
2259 zpool_remove_zvol_links(zpool_handle_t *zhp)
2260 {
2261 	return (zpool_iter_zvol(zhp, do_zvol_remove, zhp));
2262 }
2263 
2264 /*
2265  * Convert from a devid string to a path.
2266  */
2267 static char *
2268 devid_to_path(char *devid_str)
2269 {
2270 	ddi_devid_t devid;
2271 	char *minor;
2272 	char *path;
2273 	devid_nmlist_t *list = NULL;
2274 	int ret;
2275 
2276 	if (devid_str_decode(devid_str, &devid, &minor) != 0)
2277 		return (NULL);
2278 
2279 	ret = devid_deviceid_to_nmlist("/dev", devid, minor, &list);
2280 
2281 	devid_str_free(minor);
2282 	devid_free(devid);
2283 
2284 	if (ret != 0)
2285 		return (NULL);
2286 
2287 	if ((path = strdup(list[0].devname)) == NULL)
2288 		return (NULL);
2289 
2290 	devid_free_nmlist(list);
2291 
2292 	return (path);
2293 }
2294 
2295 /*
2296  * Convert from a path to a devid string.
2297  */
2298 static char *
2299 path_to_devid(const char *path)
2300 {
2301 	int fd;
2302 	ddi_devid_t devid;
2303 	char *minor, *ret;
2304 
2305 	if ((fd = open(path, O_RDONLY)) < 0)
2306 		return (NULL);
2307 
2308 	minor = NULL;
2309 	ret = NULL;
2310 	if (devid_get(fd, &devid) == 0) {
2311 		if (devid_get_minor_name(fd, &minor) == 0)
2312 			ret = devid_str_encode(devid, minor);
2313 		if (minor != NULL)
2314 			devid_str_free(minor);
2315 		devid_free(devid);
2316 	}
2317 	(void) close(fd);
2318 
2319 	return (ret);
2320 }
2321 
2322 /*
2323  * Issue the necessary ioctl() to update the stored path value for the vdev.  We
2324  * ignore any failure here, since a common case is for an unprivileged user to
2325  * type 'zpool status', and we'll display the correct information anyway.
2326  */
2327 static void
2328 set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path)
2329 {
2330 	zfs_cmd_t zc = { 0 };
2331 
2332 	(void) strncpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2333 	(void) strncpy(zc.zc_value, path, sizeof (zc.zc_value));
2334 	verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
2335 	    &zc.zc_guid) == 0);
2336 
2337 	(void) ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SETPATH, &zc);
2338 }
2339 
2340 /*
2341  * Given a vdev, return the name to display in iostat.  If the vdev has a path,
2342  * we use that, stripping off any leading "/dev/dsk/"; if not, we use the type.
2343  * We also check if this is a whole disk, in which case we strip off the
2344  * trailing 's0' slice name.
2345  *
2346  * This routine is also responsible for identifying when disks have been
2347  * reconfigured in a new location.  The kernel will have opened the device by
2348  * devid, but the path will still refer to the old location.  To catch this, we
2349  * first do a path -> devid translation (which is fast for the common case).  If
2350  * the devid matches, we're done.  If not, we do a reverse devid -> path
2351  * translation and issue the appropriate ioctl() to update the path of the vdev.
2352  * If 'zhp' is NULL, then this is an exported pool, and we don't need to do any
2353  * of these checks.
2354  */
2355 char *
2356 zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv)
2357 {
2358 	char *path, *devid;
2359 	uint64_t value;
2360 	char buf[64];
2361 	vdev_stat_t *vs;
2362 	uint_t vsc;
2363 
2364 	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
2365 	    &value) == 0) {
2366 		verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
2367 		    &value) == 0);
2368 		(void) snprintf(buf, sizeof (buf), "%llu",
2369 		    (u_longlong_t)value);
2370 		path = buf;
2371 	} else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
2372 
2373 		/*
2374 		 * If the device is dead (faulted, offline, etc) then don't
2375 		 * bother opening it.  Otherwise we may be forcing the user to
2376 		 * open a misbehaving device, which can have undesirable
2377 		 * effects.
2378 		 */
2379 		if ((nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
2380 		    (uint64_t **)&vs, &vsc) != 0 ||
2381 		    vs->vs_state >= VDEV_STATE_DEGRADED) &&
2382 		    zhp != NULL &&
2383 		    nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
2384 			/*
2385 			 * Determine if the current path is correct.
2386 			 */
2387 			char *newdevid = path_to_devid(path);
2388 
2389 			if (newdevid == NULL ||
2390 			    strcmp(devid, newdevid) != 0) {
2391 				char *newpath;
2392 
2393 				if ((newpath = devid_to_path(devid)) != NULL) {
2394 					/*
2395 					 * Update the path appropriately.
2396 					 */
2397 					set_path(zhp, nv, newpath);
2398 					if (nvlist_add_string(nv,
2399 					    ZPOOL_CONFIG_PATH, newpath) == 0)
2400 						verify(nvlist_lookup_string(nv,
2401 						    ZPOOL_CONFIG_PATH,
2402 						    &path) == 0);
2403 					free(newpath);
2404 				}
2405 			}
2406 
2407 			if (newdevid)
2408 				devid_str_free(newdevid);
2409 		}
2410 
2411 		if (strncmp(path, "/dev/dsk/", 9) == 0)
2412 			path += 9;
2413 
2414 		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
2415 		    &value) == 0 && value) {
2416 			char *tmp = zfs_strdup(hdl, path);
2417 			if (tmp == NULL)
2418 				return (NULL);
2419 			tmp[strlen(path) - 2] = '\0';
2420 			return (tmp);
2421 		}
2422 	} else {
2423 		verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &path) == 0);
2424 
2425 		/*
2426 		 * If it's a raidz device, we need to stick in the parity level.
2427 		 */
2428 		if (strcmp(path, VDEV_TYPE_RAIDZ) == 0) {
2429 			verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY,
2430 			    &value) == 0);
2431 			(void) snprintf(buf, sizeof (buf), "%s%llu", path,
2432 			    (u_longlong_t)value);
2433 			path = buf;
2434 		}
2435 	}
2436 
2437 	return (zfs_strdup(hdl, path));
2438 }
2439 
2440 static int
2441 zbookmark_compare(const void *a, const void *b)
2442 {
2443 	return (memcmp(a, b, sizeof (zbookmark_t)));
2444 }
2445 
2446 /*
2447  * Retrieve the persistent error log, uniquify the members, and return to the
2448  * caller.
2449  */
2450 int
2451 zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp)
2452 {
2453 	zfs_cmd_t zc = { 0 };
2454 	uint64_t count;
2455 	zbookmark_t *zb = NULL;
2456 	int i;
2457 
2458 	/*
2459 	 * Retrieve the raw error list from the kernel.  If the number of errors
2460 	 * has increased, allocate more space and continue until we get the
2461 	 * entire list.
2462 	 */
2463 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_ERRCOUNT,
2464 	    &count) == 0);
2465 	if (count == 0)
2466 		return (0);
2467 	if ((zc.zc_nvlist_dst = (uintptr_t)zfs_alloc(zhp->zpool_hdl,
2468 	    count * sizeof (zbookmark_t))) == (uintptr_t)NULL)
2469 		return (-1);
2470 	zc.zc_nvlist_dst_size = count;
2471 	(void) strcpy(zc.zc_name, zhp->zpool_name);
2472 	for (;;) {
2473 		if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_ERROR_LOG,
2474 		    &zc) != 0) {
2475 			free((void *)(uintptr_t)zc.zc_nvlist_dst);
2476 			if (errno == ENOMEM) {
2477 				count = zc.zc_nvlist_dst_size;
2478 				if ((zc.zc_nvlist_dst = (uintptr_t)
2479 				    zfs_alloc(zhp->zpool_hdl, count *
2480 				    sizeof (zbookmark_t))) == (uintptr_t)NULL)
2481 					return (-1);
2482 			} else {
2483 				return (-1);
2484 			}
2485 		} else {
2486 			break;
2487 		}
2488 	}
2489 
2490 	/*
2491 	 * Sort the resulting bookmarks.  This is a little confusing due to the
2492 	 * implementation of ZFS_IOC_ERROR_LOG.  The bookmarks are copied last
2493 	 * to first, and 'zc_nvlist_dst_size' indicates the number of boomarks
2494 	 * _not_ copied as part of the process.  So we point the start of our
2495 	 * array appropriate and decrement the total number of elements.
2496 	 */
2497 	zb = ((zbookmark_t *)(uintptr_t)zc.zc_nvlist_dst) +
2498 	    zc.zc_nvlist_dst_size;
2499 	count -= zc.zc_nvlist_dst_size;
2500 
2501 	qsort(zb, count, sizeof (zbookmark_t), zbookmark_compare);
2502 
2503 	verify(nvlist_alloc(nverrlistp, 0, KM_SLEEP) == 0);
2504 
2505 	/*
2506 	 * Fill in the nverrlistp with nvlist's of dataset and object numbers.
2507 	 */
2508 	for (i = 0; i < count; i++) {
2509 		nvlist_t *nv;
2510 
2511 		/* ignoring zb_blkid and zb_level for now */
2512 		if (i > 0 && zb[i-1].zb_objset == zb[i].zb_objset &&
2513 		    zb[i-1].zb_object == zb[i].zb_object)
2514 			continue;
2515 
2516 		if (nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) != 0)
2517 			goto nomem;
2518 		if (nvlist_add_uint64(nv, ZPOOL_ERR_DATASET,
2519 		    zb[i].zb_objset) != 0) {
2520 			nvlist_free(nv);
2521 			goto nomem;
2522 		}
2523 		if (nvlist_add_uint64(nv, ZPOOL_ERR_OBJECT,
2524 		    zb[i].zb_object) != 0) {
2525 			nvlist_free(nv);
2526 			goto nomem;
2527 		}
2528 		if (nvlist_add_nvlist(*nverrlistp, "ejk", nv) != 0) {
2529 			nvlist_free(nv);
2530 			goto nomem;
2531 		}
2532 		nvlist_free(nv);
2533 	}
2534 
2535 	free((void *)(uintptr_t)zc.zc_nvlist_dst);
2536 	return (0);
2537 
2538 nomem:
2539 	free((void *)(uintptr_t)zc.zc_nvlist_dst);
2540 	return (no_memory(zhp->zpool_hdl));
2541 }
2542 
2543 /*
2544  * Upgrade a ZFS pool to the latest on-disk version.
2545  */
2546 int
2547 zpool_upgrade(zpool_handle_t *zhp, uint64_t new_version)
2548 {
2549 	zfs_cmd_t zc = { 0 };
2550 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2551 
2552 	(void) strcpy(zc.zc_name, zhp->zpool_name);
2553 	zc.zc_cookie = new_version;
2554 
2555 	if (zfs_ioctl(hdl, ZFS_IOC_POOL_UPGRADE, &zc) != 0)
2556 		return (zpool_standard_error_fmt(hdl, errno,
2557 		    dgettext(TEXT_DOMAIN, "cannot upgrade '%s'"),
2558 		    zhp->zpool_name));
2559 	return (0);
2560 }
2561 
2562 void
2563 zpool_set_history_str(const char *subcommand, int argc, char **argv,
2564     char *history_str)
2565 {
2566 	int i;
2567 
2568 	(void) strlcpy(history_str, subcommand, HIS_MAX_RECORD_LEN);
2569 	for (i = 1; i < argc; i++) {
2570 		if (strlen(history_str) + 1 + strlen(argv[i]) >
2571 		    HIS_MAX_RECORD_LEN)
2572 			break;
2573 		(void) strlcat(history_str, " ", HIS_MAX_RECORD_LEN);
2574 		(void) strlcat(history_str, argv[i], HIS_MAX_RECORD_LEN);
2575 	}
2576 }
2577 
2578 /*
2579  * Stage command history for logging.
2580  */
2581 int
2582 zpool_stage_history(libzfs_handle_t *hdl, const char *history_str)
2583 {
2584 	if (history_str == NULL)
2585 		return (EINVAL);
2586 
2587 	if (strlen(history_str) > HIS_MAX_RECORD_LEN)
2588 		return (EINVAL);
2589 
2590 	if (hdl->libzfs_log_str != NULL)
2591 		free(hdl->libzfs_log_str);
2592 
2593 	if ((hdl->libzfs_log_str = strdup(history_str)) == NULL)
2594 		return (no_memory(hdl));
2595 
2596 	return (0);
2597 }
2598 
2599 /*
2600  * Perform ioctl to get some command history of a pool.
2601  *
2602  * 'buf' is the buffer to fill up to 'len' bytes.  'off' is the
2603  * logical offset of the history buffer to start reading from.
2604  *
2605  * Upon return, 'off' is the next logical offset to read from and
2606  * 'len' is the actual amount of bytes read into 'buf'.
2607  */
2608 static int
2609 get_history(zpool_handle_t *zhp, char *buf, uint64_t *off, uint64_t *len)
2610 {
2611 	zfs_cmd_t zc = { 0 };
2612 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2613 
2614 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2615 
2616 	zc.zc_history = (uint64_t)(uintptr_t)buf;
2617 	zc.zc_history_len = *len;
2618 	zc.zc_history_offset = *off;
2619 
2620 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_GET_HISTORY, &zc) != 0) {
2621 		switch (errno) {
2622 		case EPERM:
2623 			return (zfs_error_fmt(hdl, EZFS_PERM,
2624 			    dgettext(TEXT_DOMAIN,
2625 			    "cannot show history for pool '%s'"),
2626 			    zhp->zpool_name));
2627 		case ENOENT:
2628 			return (zfs_error_fmt(hdl, EZFS_NOHISTORY,
2629 			    dgettext(TEXT_DOMAIN, "cannot get history for pool "
2630 			    "'%s'"), zhp->zpool_name));
2631 		case ENOTSUP:
2632 			return (zfs_error_fmt(hdl, EZFS_BADVERSION,
2633 			    dgettext(TEXT_DOMAIN, "cannot get history for pool "
2634 			    "'%s', pool must be upgraded"), zhp->zpool_name));
2635 		default:
2636 			return (zpool_standard_error_fmt(hdl, errno,
2637 			    dgettext(TEXT_DOMAIN,
2638 			    "cannot get history for '%s'"), zhp->zpool_name));
2639 		}
2640 	}
2641 
2642 	*len = zc.zc_history_len;
2643 	*off = zc.zc_history_offset;
2644 
2645 	return (0);
2646 }
2647 
2648 /*
2649  * Process the buffer of nvlists, unpacking and storing each nvlist record
2650  * into 'records'.  'leftover' is set to the number of bytes that weren't
2651  * processed as there wasn't a complete record.
2652  */
2653 static int
2654 zpool_history_unpack(char *buf, uint64_t bytes_read, uint64_t *leftover,
2655     nvlist_t ***records, uint_t *numrecords)
2656 {
2657 	uint64_t reclen;
2658 	nvlist_t *nv;
2659 	int i;
2660 
2661 	while (bytes_read > sizeof (reclen)) {
2662 
2663 		/* get length of packed record (stored as little endian) */
2664 		for (i = 0, reclen = 0; i < sizeof (reclen); i++)
2665 			reclen += (uint64_t)(((uchar_t *)buf)[i]) << (8*i);
2666 
2667 		if (bytes_read < sizeof (reclen) + reclen)
2668 			break;
2669 
2670 		/* unpack record */
2671 		if (nvlist_unpack(buf + sizeof (reclen), reclen, &nv, 0) != 0)
2672 			return (ENOMEM);
2673 		bytes_read -= sizeof (reclen) + reclen;
2674 		buf += sizeof (reclen) + reclen;
2675 
2676 		/* add record to nvlist array */
2677 		(*numrecords)++;
2678 		if (ISP2(*numrecords + 1)) {
2679 			*records = realloc(*records,
2680 			    *numrecords * 2 * sizeof (nvlist_t *));
2681 		}
2682 		(*records)[*numrecords - 1] = nv;
2683 	}
2684 
2685 	*leftover = bytes_read;
2686 	return (0);
2687 }
2688 
2689 #define	HIS_BUF_LEN	(128*1024)
2690 
2691 /*
2692  * Retrieve the command history of a pool.
2693  */
2694 int
2695 zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp)
2696 {
2697 	char buf[HIS_BUF_LEN];
2698 	uint64_t off = 0;
2699 	nvlist_t **records = NULL;
2700 	uint_t numrecords = 0;
2701 	int err, i;
2702 
2703 	do {
2704 		uint64_t bytes_read = sizeof (buf);
2705 		uint64_t leftover;
2706 
2707 		if ((err = get_history(zhp, buf, &off, &bytes_read)) != 0)
2708 			break;
2709 
2710 		/* if nothing else was read in, we're at EOF, just return */
2711 		if (!bytes_read)
2712 			break;
2713 
2714 		if ((err = zpool_history_unpack(buf, bytes_read,
2715 		    &leftover, &records, &numrecords)) != 0)
2716 			break;
2717 		off -= leftover;
2718 
2719 		/* CONSTCOND */
2720 	} while (1);
2721 
2722 	if (!err) {
2723 		verify(nvlist_alloc(nvhisp, NV_UNIQUE_NAME, 0) == 0);
2724 		verify(nvlist_add_nvlist_array(*nvhisp, ZPOOL_HIST_RECORD,
2725 		    records, numrecords) == 0);
2726 	}
2727 	for (i = 0; i < numrecords; i++)
2728 		nvlist_free(records[i]);
2729 	free(records);
2730 
2731 	return (err);
2732 }
2733 
2734 void
2735 zpool_obj_to_path(zpool_handle_t *zhp, uint64_t dsobj, uint64_t obj,
2736     char *pathname, size_t len)
2737 {
2738 	zfs_cmd_t zc = { 0 };
2739 	boolean_t mounted = B_FALSE;
2740 	char *mntpnt = NULL;
2741 	char dsname[MAXNAMELEN];
2742 
2743 	if (dsobj == 0) {
2744 		/* special case for the MOS */
2745 		(void) snprintf(pathname, len, "<metadata>:<0x%llx>", obj);
2746 		return;
2747 	}
2748 
2749 	/* get the dataset's name */
2750 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2751 	zc.zc_obj = dsobj;
2752 	if (ioctl(zhp->zpool_hdl->libzfs_fd,
2753 	    ZFS_IOC_DSOBJ_TO_DSNAME, &zc) != 0) {
2754 		/* just write out a path of two object numbers */
2755 		(void) snprintf(pathname, len, "<0x%llx>:<0x%llx>",
2756 		    dsobj, obj);
2757 		return;
2758 	}
2759 	(void) strlcpy(dsname, zc.zc_value, sizeof (dsname));
2760 
2761 	/* find out if the dataset is mounted */
2762 	mounted = is_mounted(zhp->zpool_hdl, dsname, &mntpnt);
2763 
2764 	/* get the corrupted object's path */
2765 	(void) strlcpy(zc.zc_name, dsname, sizeof (zc.zc_name));
2766 	zc.zc_obj = obj;
2767 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_OBJ_TO_PATH,
2768 	    &zc) == 0) {
2769 		if (mounted) {
2770 			(void) snprintf(pathname, len, "%s%s", mntpnt,
2771 			    zc.zc_value);
2772 		} else {
2773 			(void) snprintf(pathname, len, "%s:%s",
2774 			    dsname, zc.zc_value);
2775 		}
2776 	} else {
2777 		(void) snprintf(pathname, len, "%s:<0x%llx>", dsname, obj);
2778 	}
2779 	free(mntpnt);
2780 }
2781 
2782 #define	RDISK_ROOT	"/dev/rdsk"
2783 #define	BACKUP_SLICE	"s2"
2784 /*
2785  * Don't start the slice at the default block of 34; many storage
2786  * devices will use a stripe width of 128k, so start there instead.
2787  */
2788 #define	NEW_START_BLOCK	256
2789 
2790 /*
2791  * Read the EFI label from the config, if a label does not exist then
2792  * pass back the error to the caller. If the caller has passed a non-NULL
2793  * diskaddr argument then we set it to the starting address of the EFI
2794  * partition.
2795  */
2796 static int
2797 read_efi_label(nvlist_t *config, diskaddr_t *sb)
2798 {
2799 	char *path;
2800 	int fd;
2801 	char diskname[MAXPATHLEN];
2802 	int err = -1;
2803 
2804 	if (nvlist_lookup_string(config, ZPOOL_CONFIG_PATH, &path) != 0)
2805 		return (err);
2806 
2807 	(void) snprintf(diskname, sizeof (diskname), "%s%s", RDISK_ROOT,
2808 	    strrchr(path, '/'));
2809 	if ((fd = open(diskname, O_RDONLY|O_NDELAY)) >= 0) {
2810 		struct dk_gpt *vtoc;
2811 
2812 		if ((err = efi_alloc_and_read(fd, &vtoc)) >= 0) {
2813 			if (sb != NULL)
2814 				*sb = vtoc->efi_parts[0].p_start;
2815 			efi_free(vtoc);
2816 		}
2817 		(void) close(fd);
2818 	}
2819 	return (err);
2820 }
2821 
2822 /*
2823  * determine where a partition starts on a disk in the current
2824  * configuration
2825  */
2826 static diskaddr_t
2827 find_start_block(nvlist_t *config)
2828 {
2829 	nvlist_t **child;
2830 	uint_t c, children;
2831 	diskaddr_t sb = MAXOFFSET_T;
2832 	uint64_t wholedisk;
2833 
2834 	if (nvlist_lookup_nvlist_array(config,
2835 	    ZPOOL_CONFIG_CHILDREN, &child, &children) != 0) {
2836 		if (nvlist_lookup_uint64(config,
2837 		    ZPOOL_CONFIG_WHOLE_DISK,
2838 		    &wholedisk) != 0 || !wholedisk) {
2839 			return (MAXOFFSET_T);
2840 		}
2841 		if (read_efi_label(config, &sb) < 0)
2842 			sb = MAXOFFSET_T;
2843 		return (sb);
2844 	}
2845 
2846 	for (c = 0; c < children; c++) {
2847 		sb = find_start_block(child[c]);
2848 		if (sb != MAXOFFSET_T) {
2849 			return (sb);
2850 		}
2851 	}
2852 	return (MAXOFFSET_T);
2853 }
2854 
2855 /*
2856  * Label an individual disk.  The name provided is the short name,
2857  * stripped of any leading /dev path.
2858  */
2859 int
2860 zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, char *name)
2861 {
2862 	char path[MAXPATHLEN];
2863 	struct dk_gpt *vtoc;
2864 	int fd;
2865 	size_t resv = EFI_MIN_RESV_SIZE;
2866 	uint64_t slice_size;
2867 	diskaddr_t start_block;
2868 	char errbuf[1024];
2869 
2870 	/* prepare an error message just in case */
2871 	(void) snprintf(errbuf, sizeof (errbuf),
2872 	    dgettext(TEXT_DOMAIN, "cannot label '%s'"), name);
2873 
2874 	if (zhp) {
2875 		nvlist_t *nvroot;
2876 
2877 		if (pool_is_bootable(zhp)) {
2878 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
2879 			    "EFI labeled devices are not supported on root "
2880 			    "pools."));
2881 			return (zfs_error(hdl, EZFS_POOL_NOTSUP, errbuf));
2882 		}
2883 
2884 		verify(nvlist_lookup_nvlist(zhp->zpool_config,
2885 		    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
2886 
2887 		if (zhp->zpool_start_block == 0)
2888 			start_block = find_start_block(nvroot);
2889 		else
2890 			start_block = zhp->zpool_start_block;
2891 		zhp->zpool_start_block = start_block;
2892 	} else {
2893 		/* new pool */
2894 		start_block = NEW_START_BLOCK;
2895 	}
2896 
2897 	(void) snprintf(path, sizeof (path), "%s/%s%s", RDISK_ROOT, name,
2898 	    BACKUP_SLICE);
2899 
2900 	if ((fd = open(path, O_RDWR | O_NDELAY)) < 0) {
2901 		/*
2902 		 * This shouldn't happen.  We've long since verified that this
2903 		 * is a valid device.
2904 		 */
2905 		zfs_error_aux(hdl,
2906 		    dgettext(TEXT_DOMAIN, "unable to open device"));
2907 		return (zfs_error(hdl, EZFS_OPENFAILED, errbuf));
2908 	}
2909 
2910 	if (efi_alloc_and_init(fd, EFI_NUMPAR, &vtoc) != 0) {
2911 		/*
2912 		 * The only way this can fail is if we run out of memory, or we
2913 		 * were unable to read the disk's capacity
2914 		 */
2915 		if (errno == ENOMEM)
2916 			(void) no_memory(hdl);
2917 
2918 		(void) close(fd);
2919 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
2920 		    "unable to read disk capacity"), name);
2921 
2922 		return (zfs_error(hdl, EZFS_NOCAP, errbuf));
2923 	}
2924 
2925 	slice_size = vtoc->efi_last_u_lba + 1;
2926 	slice_size -= EFI_MIN_RESV_SIZE;
2927 	if (start_block == MAXOFFSET_T)
2928 		start_block = NEW_START_BLOCK;
2929 	slice_size -= start_block;
2930 
2931 	vtoc->efi_parts[0].p_start = start_block;
2932 	vtoc->efi_parts[0].p_size = slice_size;
2933 
2934 	/*
2935 	 * Why we use V_USR: V_BACKUP confuses users, and is considered
2936 	 * disposable by some EFI utilities (since EFI doesn't have a backup
2937 	 * slice).  V_UNASSIGNED is supposed to be used only for zero size
2938 	 * partitions, and efi_write() will fail if we use it.  V_ROOT, V_BOOT,
2939 	 * etc. were all pretty specific.  V_USR is as close to reality as we
2940 	 * can get, in the absence of V_OTHER.
2941 	 */
2942 	vtoc->efi_parts[0].p_tag = V_USR;
2943 	(void) strcpy(vtoc->efi_parts[0].p_name, "zfs");
2944 
2945 	vtoc->efi_parts[8].p_start = slice_size + start_block;
2946 	vtoc->efi_parts[8].p_size = resv;
2947 	vtoc->efi_parts[8].p_tag = V_RESERVED;
2948 
2949 	if (efi_write(fd, vtoc) != 0) {
2950 		/*
2951 		 * Some block drivers (like pcata) may not support EFI
2952 		 * GPT labels.  Print out a helpful error message dir-
2953 		 * ecting the user to manually label the disk and give
2954 		 * a specific slice.
2955 		 */
2956 		(void) close(fd);
2957 		efi_free(vtoc);
2958 
2959 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
2960 		    "try using fdisk(1M) and then provide a specific slice"));
2961 		return (zfs_error(hdl, EZFS_LABELFAILED, errbuf));
2962 	}
2963 
2964 	(void) close(fd);
2965 	efi_free(vtoc);
2966 	return (0);
2967 }
2968 
2969 static boolean_t
2970 supported_dump_vdev_type(libzfs_handle_t *hdl, nvlist_t *config, char *errbuf)
2971 {
2972 	char *type;
2973 	nvlist_t **child;
2974 	uint_t children, c;
2975 
2976 	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_TYPE, &type) == 0);
2977 	if (strcmp(type, VDEV_TYPE_RAIDZ) == 0 ||
2978 	    strcmp(type, VDEV_TYPE_FILE) == 0 ||
2979 	    strcmp(type, VDEV_TYPE_LOG) == 0 ||
2980 	    strcmp(type, VDEV_TYPE_MISSING) == 0) {
2981 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
2982 		    "vdev type '%s' is not supported"), type);
2983 		(void) zfs_error(hdl, EZFS_VDEVNOTSUP, errbuf);
2984 		return (B_FALSE);
2985 	}
2986 	if (nvlist_lookup_nvlist_array(config, ZPOOL_CONFIG_CHILDREN,
2987 	    &child, &children) == 0) {
2988 		for (c = 0; c < children; c++) {
2989 			if (!supported_dump_vdev_type(hdl, child[c], errbuf))
2990 				return (B_FALSE);
2991 		}
2992 	}
2993 	return (B_TRUE);
2994 }
2995 
2996 /*
2997  * check if this zvol is allowable for use as a dump device; zero if
2998  * it is, > 0 if it isn't, < 0 if it isn't a zvol
2999  */
3000 int
3001 zvol_check_dump_config(char *arg)
3002 {
3003 	zpool_handle_t *zhp = NULL;
3004 	nvlist_t *config, *nvroot;
3005 	char *p, *volname;
3006 	nvlist_t **top;
3007 	uint_t toplevels;
3008 	libzfs_handle_t *hdl;
3009 	char errbuf[1024];
3010 	char poolname[ZPOOL_MAXNAMELEN];
3011 	int pathlen = strlen(ZVOL_FULL_DEV_DIR);
3012 	int ret = 1;
3013 
3014 	if (strncmp(arg, ZVOL_FULL_DEV_DIR, pathlen)) {
3015 		return (-1);
3016 	}
3017 
3018 	(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
3019 	    "dump is not supported on device '%s'"), arg);
3020 
3021 	if ((hdl = libzfs_init()) == NULL)
3022 		return (1);
3023 	libzfs_print_on_error(hdl, B_TRUE);
3024 
3025 	volname = arg + pathlen;
3026 
3027 	/* check the configuration of the pool */
3028 	if ((p = strchr(volname, '/')) == NULL) {
3029 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
3030 		    "malformed dataset name"));
3031 		(void) zfs_error(hdl, EZFS_INVALIDNAME, errbuf);
3032 		return (1);
3033 	} else if (p - volname >= ZFS_MAXNAMELEN) {
3034 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
3035 		    "dataset name is too long"));
3036 		(void) zfs_error(hdl, EZFS_NAMETOOLONG, errbuf);
3037 		return (1);
3038 	} else {
3039 		(void) strncpy(poolname, volname, p - volname);
3040 		poolname[p - volname] = '\0';
3041 	}
3042 
3043 	if ((zhp = zpool_open(hdl, poolname)) == NULL) {
3044 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
3045 		    "could not open pool '%s'"), poolname);
3046 		(void) zfs_error(hdl, EZFS_OPENFAILED, errbuf);
3047 		goto out;
3048 	}
3049 	config = zpool_get_config(zhp, NULL);
3050 	if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
3051 	    &nvroot) != 0) {
3052 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
3053 		    "could not obtain vdev configuration for  '%s'"), poolname);
3054 		(void) zfs_error(hdl, EZFS_INVALCONFIG, errbuf);
3055 		goto out;
3056 	}
3057 
3058 	verify(nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
3059 	    &top, &toplevels) == 0);
3060 	if (toplevels != 1) {
3061 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
3062 		    "'%s' has multiple top level vdevs"), poolname);
3063 		(void) zfs_error(hdl, EZFS_DEVOVERFLOW, errbuf);
3064 		goto out;
3065 	}
3066 
3067 	if (!supported_dump_vdev_type(hdl, top[0], errbuf)) {
3068 		goto out;
3069 	}
3070 	ret = 0;
3071 
3072 out:
3073 	if (zhp)
3074 		zpool_close(zhp);
3075 	libzfs_fini(hdl);
3076 	return (ret);
3077 }
3078