xref: /illumos-gate/usr/src/lib/libzfs/common/libzfs_pool.c (revision a953e2b1fc5829a51100383fa8e540df35919269)
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 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <alloca.h>
30 #include <assert.h>
31 #include <ctype.h>
32 #include <errno.h>
33 #include <devid.h>
34 #include <dirent.h>
35 #include <fcntl.h>
36 #include <libintl.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <strings.h>
40 #include <unistd.h>
41 #include <sys/efi_partition.h>
42 #include <sys/vtoc.h>
43 #include <sys/zfs_ioctl.h>
44 #include <sys/zio.h>
45 #include <strings.h>
46 
47 #include "zfs_namecheck.h"
48 #include "zfs_prop.h"
49 #include "libzfs_impl.h"
50 
51 /*
52  * Validate the given pool name, optionally putting an extended error message in
53  * 'buf'.
54  */
55 static boolean_t
56 zpool_name_valid(libzfs_handle_t *hdl, boolean_t isopen, const char *pool)
57 {
58 	namecheck_err_t why;
59 	char what;
60 	int ret;
61 
62 	ret = pool_namecheck(pool, &why, &what);
63 
64 	/*
65 	 * The rules for reserved pool names were extended at a later point.
66 	 * But we need to support users with existing pools that may now be
67 	 * invalid.  So we only check for this expanded set of names during a
68 	 * create (or import), and only in userland.
69 	 */
70 	if (ret == 0 && !isopen &&
71 	    (strncmp(pool, "mirror", 6) == 0 ||
72 	    strncmp(pool, "raidz", 5) == 0 ||
73 	    strncmp(pool, "spare", 5) == 0)) {
74 		zfs_error_aux(hdl,
75 		    dgettext(TEXT_DOMAIN, "name is reserved"));
76 		return (B_FALSE);
77 	}
78 
79 
80 	if (ret != 0) {
81 		if (hdl != NULL) {
82 			switch (why) {
83 			case NAME_ERR_TOOLONG:
84 				zfs_error_aux(hdl,
85 				    dgettext(TEXT_DOMAIN, "name is too long"));
86 				break;
87 
88 			case NAME_ERR_INVALCHAR:
89 				zfs_error_aux(hdl,
90 				    dgettext(TEXT_DOMAIN, "invalid character "
91 				    "'%c' in pool name"), what);
92 				break;
93 
94 			case NAME_ERR_NOLETTER:
95 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
96 				    "name must begin with a letter"));
97 				break;
98 
99 			case NAME_ERR_RESERVED:
100 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
101 				    "name is reserved"));
102 				break;
103 
104 			case NAME_ERR_DISKLIKE:
105 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
106 				    "pool name is reserved"));
107 				break;
108 
109 			case NAME_ERR_LEADING_SLASH:
110 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
111 				    "leading slash in name"));
112 				break;
113 
114 			case NAME_ERR_EMPTY_COMPONENT:
115 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
116 				    "empty component in name"));
117 				break;
118 
119 			case NAME_ERR_TRAILING_SLASH:
120 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
121 				    "trailing slash in name"));
122 				break;
123 
124 			case NAME_ERR_MULTIPLE_AT:
125 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
126 				    "multiple '@' delimiters in name"));
127 				break;
128 
129 			}
130 		}
131 		return (B_FALSE);
132 	}
133 
134 	return (B_TRUE);
135 }
136 
137 static int
138 zpool_get_all_props(zpool_handle_t *zhp)
139 {
140 	zfs_cmd_t zc = { 0 };
141 	libzfs_handle_t *hdl = zhp->zpool_hdl;
142 
143 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
144 
145 	if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0)
146 		return (-1);
147 
148 	while (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_GET_PROPS, &zc) != 0) {
149 		if (errno == ENOMEM) {
150 			if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) {
151 				zcmd_free_nvlists(&zc);
152 				return (-1);
153 			}
154 		} else {
155 			zcmd_free_nvlists(&zc);
156 			return (-1);
157 		}
158 	}
159 
160 	if (zcmd_read_dst_nvlist(hdl, &zc, &zhp->zpool_props) != 0) {
161 		zcmd_free_nvlists(&zc);
162 		return (-1);
163 	}
164 
165 	zcmd_free_nvlists(&zc);
166 
167 	return (0);
168 }
169 
170 /*
171  * Open a handle to the given pool, even if the pool is currently in the FAULTED
172  * state.
173  */
174 zpool_handle_t *
175 zpool_open_canfail(libzfs_handle_t *hdl, const char *pool)
176 {
177 	zpool_handle_t *zhp;
178 	boolean_t missing;
179 
180 	/*
181 	 * Make sure the pool name is valid.
182 	 */
183 	if (!zpool_name_valid(hdl, B_TRUE, pool)) {
184 		(void) zfs_error_fmt(hdl, EZFS_INVALIDNAME,
185 		    dgettext(TEXT_DOMAIN, "cannot open '%s'"),
186 		    pool);
187 		return (NULL);
188 	}
189 
190 	if ((zhp = zfs_alloc(hdl, sizeof (zpool_handle_t))) == NULL)
191 		return (NULL);
192 
193 	zhp->zpool_hdl = hdl;
194 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
195 
196 	if (zpool_refresh_stats(zhp, &missing) != 0) {
197 		zpool_close(zhp);
198 		return (NULL);
199 	}
200 
201 	if (missing) {
202 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
203 		    "no such pool"));
204 		(void) zfs_error_fmt(hdl, EZFS_NOENT,
205 		    dgettext(TEXT_DOMAIN, "cannot open '%s'"),
206 		    pool);
207 		zpool_close(zhp);
208 		return (NULL);
209 	}
210 
211 	return (zhp);
212 }
213 
214 /*
215  * Like the above, but silent on error.  Used when iterating over pools (because
216  * the configuration cache may be out of date).
217  */
218 int
219 zpool_open_silent(libzfs_handle_t *hdl, const char *pool, zpool_handle_t **ret)
220 {
221 	zpool_handle_t *zhp;
222 	boolean_t missing;
223 
224 	if ((zhp = zfs_alloc(hdl, sizeof (zpool_handle_t))) == NULL)
225 		return (-1);
226 
227 	zhp->zpool_hdl = hdl;
228 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
229 
230 	if (zpool_refresh_stats(zhp, &missing) != 0) {
231 		zpool_close(zhp);
232 		return (-1);
233 	}
234 
235 	if (missing) {
236 		zpool_close(zhp);
237 		*ret = NULL;
238 		return (0);
239 	}
240 
241 	*ret = zhp;
242 	return (0);
243 }
244 
245 /*
246  * Similar to zpool_open_canfail(), but refuses to open pools in the faulted
247  * state.
248  */
249 zpool_handle_t *
250 zpool_open(libzfs_handle_t *hdl, const char *pool)
251 {
252 	zpool_handle_t *zhp;
253 
254 	if ((zhp = zpool_open_canfail(hdl, pool)) == NULL)
255 		return (NULL);
256 
257 	if (zhp->zpool_state == POOL_STATE_UNAVAIL) {
258 		(void) zfs_error_fmt(hdl, EZFS_POOLUNAVAIL,
259 		    dgettext(TEXT_DOMAIN, "cannot open '%s'"), zhp->zpool_name);
260 		zpool_close(zhp);
261 		return (NULL);
262 	}
263 
264 	return (zhp);
265 }
266 
267 /*
268  * Close the handle.  Simply frees the memory associated with the handle.
269  */
270 void
271 zpool_close(zpool_handle_t *zhp)
272 {
273 	if (zhp->zpool_config)
274 		nvlist_free(zhp->zpool_config);
275 	if (zhp->zpool_old_config)
276 		nvlist_free(zhp->zpool_old_config);
277 	if (zhp->zpool_props)
278 		nvlist_free(zhp->zpool_props);
279 	free(zhp);
280 }
281 
282 /*
283  * Return the name of the pool.
284  */
285 const char *
286 zpool_get_name(zpool_handle_t *zhp)
287 {
288 	return (zhp->zpool_name);
289 }
290 
291 /*
292  * Return the GUID of the pool.
293  */
294 uint64_t
295 zpool_get_guid(zpool_handle_t *zhp)
296 {
297 	uint64_t guid;
298 
299 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_POOL_GUID,
300 	    &guid) == 0);
301 	return (guid);
302 }
303 
304 /*
305  * Return the version of the pool.
306  */
307 uint64_t
308 zpool_get_version(zpool_handle_t *zhp)
309 {
310 	uint64_t version;
311 
312 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_VERSION,
313 	    &version) == 0);
314 
315 	return (version);
316 }
317 
318 /*
319  * Return the amount of space currently consumed by the pool.
320  */
321 uint64_t
322 zpool_get_space_used(zpool_handle_t *zhp)
323 {
324 	nvlist_t *nvroot;
325 	vdev_stat_t *vs;
326 	uint_t vsc;
327 
328 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
329 	    &nvroot) == 0);
330 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
331 	    (uint64_t **)&vs, &vsc) == 0);
332 
333 	return (vs->vs_alloc);
334 }
335 
336 /*
337  * Return the total space in the pool.
338  */
339 uint64_t
340 zpool_get_space_total(zpool_handle_t *zhp)
341 {
342 	nvlist_t *nvroot;
343 	vdev_stat_t *vs;
344 	uint_t vsc;
345 
346 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
347 	    &nvroot) == 0);
348 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
349 	    (uint64_t **)&vs, &vsc) == 0);
350 
351 	return (vs->vs_space);
352 }
353 
354 /*
355  * Return the alternate root for this pool, if any.
356  */
357 int
358 zpool_get_root(zpool_handle_t *zhp, char *buf, size_t buflen)
359 {
360 	zfs_cmd_t zc = { 0 };
361 
362 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
363 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_OBJSET_STATS, &zc) != 0 ||
364 	    zc.zc_value[0] == '\0')
365 		return (-1);
366 
367 	(void) strlcpy(buf, zc.zc_value, buflen);
368 
369 	return (0);
370 }
371 
372 /*
373  * Return the state of the pool (ACTIVE or UNAVAILABLE)
374  */
375 int
376 zpool_get_state(zpool_handle_t *zhp)
377 {
378 	return (zhp->zpool_state);
379 }
380 
381 /*
382  * Create the named pool, using the provided vdev list.  It is assumed
383  * that the consumer has already validated the contents of the nvlist, so we
384  * don't have to worry about error semantics.
385  */
386 int
387 zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot,
388     const char *altroot)
389 {
390 	zfs_cmd_t zc = { 0 };
391 	char msg[1024];
392 
393 	(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
394 	    "cannot create '%s'"), pool);
395 
396 	if (!zpool_name_valid(hdl, B_FALSE, pool))
397 		return (zfs_error(hdl, EZFS_INVALIDNAME, msg));
398 
399 	if (altroot != NULL && altroot[0] != '/')
400 		return (zfs_error_fmt(hdl, EZFS_BADPATH,
401 		    dgettext(TEXT_DOMAIN, "bad alternate root '%s'"), altroot));
402 
403 	if (zcmd_write_src_nvlist(hdl, &zc, nvroot, NULL) != 0)
404 		return (-1);
405 
406 	(void) strlcpy(zc.zc_name, pool, sizeof (zc.zc_name));
407 
408 	if (altroot != NULL)
409 		(void) strlcpy(zc.zc_value, altroot, sizeof (zc.zc_value));
410 
411 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_CREATE, &zc) != 0) {
412 		zcmd_free_nvlists(&zc);
413 
414 		switch (errno) {
415 		case EBUSY:
416 			/*
417 			 * This can happen if the user has specified the same
418 			 * device multiple times.  We can't reliably detect this
419 			 * until we try to add it and see we already have a
420 			 * label.
421 			 */
422 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
423 			    "one or more vdevs refer to the same device"));
424 			return (zfs_error(hdl, EZFS_BADDEV, msg));
425 
426 		case EOVERFLOW:
427 			/*
428 			 * This occurs when one of the devices is below
429 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
430 			 * device was the problem device since there's no
431 			 * reliable way to determine device size from userland.
432 			 */
433 			{
434 				char buf[64];
435 
436 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
437 
438 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
439 				    "one or more devices is less than the "
440 				    "minimum size (%s)"), buf);
441 			}
442 			return (zfs_error(hdl, EZFS_BADDEV, msg));
443 
444 		case ENOSPC:
445 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
446 			    "one or more devices is out of space"));
447 			return (zfs_error(hdl, EZFS_BADDEV, msg));
448 
449 		default:
450 			return (zpool_standard_error(hdl, errno, msg));
451 		}
452 	}
453 
454 	zcmd_free_nvlists(&zc);
455 
456 	/*
457 	 * If this is an alternate root pool, then we automatically set the
458 	 * mountpoint of the root dataset to be '/'.
459 	 */
460 	if (altroot != NULL) {
461 		zfs_handle_t *zhp;
462 
463 		verify((zhp = zfs_open(hdl, pool, ZFS_TYPE_ANY)) != NULL);
464 		verify(zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
465 		    "/") == 0);
466 
467 		zfs_close(zhp);
468 	}
469 
470 	return (0);
471 }
472 
473 /*
474  * Destroy the given pool.  It is up to the caller to ensure that there are no
475  * datasets left in the pool.
476  */
477 int
478 zpool_destroy(zpool_handle_t *zhp)
479 {
480 	zfs_cmd_t zc = { 0 };
481 	zfs_handle_t *zfp = NULL;
482 	libzfs_handle_t *hdl = zhp->zpool_hdl;
483 	char msg[1024];
484 
485 	if (zhp->zpool_state == POOL_STATE_ACTIVE &&
486 	    (zfp = zfs_open(zhp->zpool_hdl, zhp->zpool_name,
487 	    ZFS_TYPE_FILESYSTEM)) == NULL)
488 		return (-1);
489 
490 	if (zpool_remove_zvol_links(zhp) != 0)
491 		return (-1);
492 
493 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
494 
495 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_POOL_DESTROY, &zc) != 0) {
496 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
497 		    "cannot destroy '%s'"), zhp->zpool_name);
498 
499 		if (errno == EROFS) {
500 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
501 			    "one or more devices is read only"));
502 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
503 		} else {
504 			(void) zpool_standard_error(hdl, errno, msg);
505 		}
506 
507 		if (zfp)
508 			zfs_close(zfp);
509 		return (-1);
510 	}
511 
512 	if (zfp) {
513 		remove_mountpoint(zfp);
514 		zfs_close(zfp);
515 	}
516 
517 	return (0);
518 }
519 
520 /*
521  * Add the given vdevs to the pool.  The caller must have already performed the
522  * necessary verification to ensure that the vdev specification is well-formed.
523  */
524 int
525 zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot)
526 {
527 	zfs_cmd_t zc = { 0 };
528 	int ret;
529 	libzfs_handle_t *hdl = zhp->zpool_hdl;
530 	char msg[1024];
531 	nvlist_t **spares;
532 	uint_t nspares;
533 
534 	(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
535 	    "cannot add to '%s'"), zhp->zpool_name);
536 
537 	if (zpool_get_version(zhp) < ZFS_VERSION_SPARES &&
538 	    nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
539 	    &spares, &nspares) == 0) {
540 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be "
541 		    "upgraded to add hot spares"));
542 		return (zfs_error(hdl, EZFS_BADVERSION, msg));
543 	}
544 
545 	if (zcmd_write_src_nvlist(hdl, &zc, nvroot, NULL) != 0)
546 		return (-1);
547 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
548 
549 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_ADD, &zc) != 0) {
550 		switch (errno) {
551 		case EBUSY:
552 			/*
553 			 * This can happen if the user has specified the same
554 			 * device multiple times.  We can't reliably detect this
555 			 * until we try to add it and see we already have a
556 			 * label.
557 			 */
558 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
559 			    "one or more vdevs refer to the same device"));
560 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
561 			break;
562 
563 		case EOVERFLOW:
564 			/*
565 			 * This occurrs when one of the devices is below
566 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
567 			 * device was the problem device since there's no
568 			 * reliable way to determine device size from userland.
569 			 */
570 			{
571 				char buf[64];
572 
573 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
574 
575 				zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
576 				    "device is less than the minimum "
577 				    "size (%s)"), buf);
578 			}
579 			(void) zfs_error(hdl, EZFS_BADDEV, msg);
580 			break;
581 
582 		case ENOTSUP:
583 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
584 			    "pool must be upgraded to add raidz2 vdevs"));
585 			(void) zfs_error(hdl, EZFS_BADVERSION, msg);
586 			break;
587 
588 		case EDOM:
589 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
590 			    "root pool can not have multiple vdevs"));
591 			(void) zfs_error(hdl, EZFS_POOL_NOTSUP, msg);
592 			break;
593 
594 		default:
595 			(void) zpool_standard_error(hdl, errno, msg);
596 		}
597 
598 		ret = -1;
599 	} else {
600 		ret = 0;
601 	}
602 
603 	zcmd_free_nvlists(&zc);
604 
605 	return (ret);
606 }
607 
608 /*
609  * Exports the pool from the system.  The caller must ensure that there are no
610  * mounted datasets in the pool.
611  */
612 int
613 zpool_export(zpool_handle_t *zhp)
614 {
615 	zfs_cmd_t zc = { 0 };
616 
617 	if (zpool_remove_zvol_links(zhp) != 0)
618 		return (-1);
619 
620 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
621 
622 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_POOL_EXPORT, &zc) != 0)
623 		return (zpool_standard_error_fmt(zhp->zpool_hdl, errno,
624 		    dgettext(TEXT_DOMAIN, "cannot export '%s'"),
625 		    zhp->zpool_name));
626 	return (0);
627 }
628 
629 /*
630  * Import the given pool using the known configuration.  The configuration
631  * should have come from zpool_find_import().  The 'newname' and 'altroot'
632  * parameters control whether the pool is imported with a different name or with
633  * an alternate root, respectively.
634  */
635 int
636 zpool_import(libzfs_handle_t *hdl, nvlist_t *config, const char *newname,
637     const char *altroot)
638 {
639 	zfs_cmd_t zc = { 0 };
640 	char *thename;
641 	char *origname;
642 	int ret;
643 
644 	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
645 	    &origname) == 0);
646 
647 	if (newname != NULL) {
648 		if (!zpool_name_valid(hdl, B_FALSE, newname))
649 			return (zfs_error_fmt(hdl, EZFS_INVALIDNAME,
650 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
651 			    newname));
652 		thename = (char *)newname;
653 	} else {
654 		thename = origname;
655 	}
656 
657 	if (altroot != NULL && altroot[0] != '/')
658 		return (zfs_error_fmt(hdl, EZFS_BADPATH,
659 		    dgettext(TEXT_DOMAIN, "bad alternate root '%s'"),
660 		    altroot));
661 
662 	(void) strlcpy(zc.zc_name, thename, sizeof (zc.zc_name));
663 
664 	if (altroot != NULL)
665 		(void) strlcpy(zc.zc_value, altroot, sizeof (zc.zc_value));
666 	else
667 		zc.zc_value[0] = '\0';
668 
669 	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
670 	    &zc.zc_guid) == 0);
671 
672 	if (zcmd_write_src_nvlist(hdl, &zc, config, NULL) != 0)
673 		return (-1);
674 
675 	ret = 0;
676 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_IMPORT, &zc) != 0) {
677 		char desc[1024];
678 		if (newname == NULL)
679 			(void) snprintf(desc, sizeof (desc),
680 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
681 			    thename);
682 		else
683 			(void) snprintf(desc, sizeof (desc),
684 			    dgettext(TEXT_DOMAIN, "cannot import '%s' as '%s'"),
685 			    origname, thename);
686 
687 		switch (errno) {
688 		case ENOTSUP:
689 			/*
690 			 * Unsupported version.
691 			 */
692 			(void) zfs_error(hdl, EZFS_BADVERSION, desc);
693 			break;
694 
695 		case EINVAL:
696 			(void) zfs_error(hdl, EZFS_INVALCONFIG, desc);
697 			break;
698 
699 		default:
700 			(void) zpool_standard_error(hdl, errno, desc);
701 		}
702 
703 		ret = -1;
704 	} else {
705 		zpool_handle_t *zhp;
706 		/*
707 		 * This should never fail, but play it safe anyway.
708 		 */
709 		if (zpool_open_silent(hdl, thename, &zhp) != 0) {
710 			ret = -1;
711 		} else if (zhp != NULL) {
712 			ret = zpool_create_zvol_links(zhp);
713 			zpool_close(zhp);
714 		}
715 	}
716 
717 	zcmd_free_nvlists(&zc);
718 	return (ret);
719 }
720 
721 /*
722  * Scrub the pool.
723  */
724 int
725 zpool_scrub(zpool_handle_t *zhp, pool_scrub_type_t type)
726 {
727 	zfs_cmd_t zc = { 0 };
728 	char msg[1024];
729 	libzfs_handle_t *hdl = zhp->zpool_hdl;
730 
731 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
732 	zc.zc_cookie = type;
733 
734 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_POOL_SCRUB, &zc) == 0)
735 		return (0);
736 
737 	(void) snprintf(msg, sizeof (msg),
738 	    dgettext(TEXT_DOMAIN, "cannot scrub %s"), zc.zc_name);
739 
740 	if (errno == EBUSY)
741 		return (zfs_error(hdl, EZFS_RESILVERING, msg));
742 	else
743 		return (zpool_standard_error(hdl, errno, msg));
744 }
745 
746 /*
747  * 'avail_spare' is set to TRUE if the provided guid refers to an AVAIL
748  * spare; but FALSE if its an INUSE spare.
749  */
750 static nvlist_t *
751 vdev_to_nvlist_iter(nvlist_t *nv, const char *search, uint64_t guid,
752     boolean_t *avail_spare)
753 {
754 	uint_t c, children;
755 	nvlist_t **child;
756 	uint64_t theguid, present;
757 	char *path;
758 	uint64_t wholedisk = 0;
759 	nvlist_t *ret;
760 
761 	verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &theguid) == 0);
762 
763 	if (search == NULL &&
764 	    nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &present) == 0) {
765 		/*
766 		 * If the device has never been present since import, the only
767 		 * reliable way to match the vdev is by GUID.
768 		 */
769 		if (theguid == guid)
770 			return (nv);
771 	} else if (search != NULL &&
772 	    nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
773 		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
774 		    &wholedisk);
775 		if (wholedisk) {
776 			/*
777 			 * For whole disks, the internal path has 's0', but the
778 			 * path passed in by the user doesn't.
779 			 */
780 			if (strlen(search) == strlen(path) - 2 &&
781 			    strncmp(search, path, strlen(search)) == 0)
782 				return (nv);
783 		} else if (strcmp(search, path) == 0) {
784 			return (nv);
785 		}
786 	}
787 
788 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
789 	    &child, &children) != 0)
790 		return (NULL);
791 
792 	for (c = 0; c < children; c++)
793 		if ((ret = vdev_to_nvlist_iter(child[c], search, guid,
794 		    avail_spare)) != NULL)
795 			return (ret);
796 
797 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
798 	    &child, &children) == 0) {
799 		for (c = 0; c < children; c++) {
800 			if ((ret = vdev_to_nvlist_iter(child[c], search, guid,
801 			    avail_spare)) != NULL) {
802 				*avail_spare = B_TRUE;
803 				return (ret);
804 			}
805 		}
806 	}
807 
808 	return (NULL);
809 }
810 
811 nvlist_t *
812 zpool_find_vdev(zpool_handle_t *zhp, const char *path, boolean_t *avail_spare)
813 {
814 	char buf[MAXPATHLEN];
815 	const char *search;
816 	char *end;
817 	nvlist_t *nvroot;
818 	uint64_t guid;
819 
820 	guid = strtoull(path, &end, 10);
821 	if (guid != 0 && *end == '\0') {
822 		search = NULL;
823 	} else if (path[0] != '/') {
824 		(void) snprintf(buf, sizeof (buf), "%s%s", "/dev/dsk/", path);
825 		search = buf;
826 	} else {
827 		search = path;
828 	}
829 
830 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
831 	    &nvroot) == 0);
832 
833 	*avail_spare = B_FALSE;
834 	return (vdev_to_nvlist_iter(nvroot, search, guid, avail_spare));
835 }
836 
837 /*
838  * Returns TRUE if the given guid corresponds to a spare (INUSE or not).
839  */
840 static boolean_t
841 is_spare(zpool_handle_t *zhp, uint64_t guid)
842 {
843 	uint64_t spare_guid;
844 	nvlist_t *nvroot;
845 	nvlist_t **spares;
846 	uint_t nspares;
847 	int i;
848 
849 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
850 	    &nvroot) == 0);
851 	if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
852 	    &spares, &nspares) == 0) {
853 		for (i = 0; i < nspares; i++) {
854 			verify(nvlist_lookup_uint64(spares[i],
855 			    ZPOOL_CONFIG_GUID, &spare_guid) == 0);
856 			if (guid == spare_guid)
857 				return (B_TRUE);
858 		}
859 	}
860 
861 	return (B_FALSE);
862 }
863 
864 /*
865  * Bring the specified vdev online
866  */
867 int
868 zpool_vdev_online(zpool_handle_t *zhp, const char *path)
869 {
870 	zfs_cmd_t zc = { 0 };
871 	char msg[1024];
872 	nvlist_t *tgt;
873 	boolean_t avail_spare;
874 	libzfs_handle_t *hdl = zhp->zpool_hdl;
875 
876 	(void) snprintf(msg, sizeof (msg),
877 	    dgettext(TEXT_DOMAIN, "cannot online %s"), path);
878 
879 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
880 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare)) == NULL)
881 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
882 
883 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
884 
885 	if (avail_spare || is_spare(zhp, zc.zc_guid) == B_TRUE)
886 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
887 
888 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_ONLINE, &zc) == 0)
889 		return (0);
890 
891 	return (zpool_standard_error(hdl, errno, msg));
892 }
893 
894 /*
895  * Take the specified vdev offline
896  */
897 int
898 zpool_vdev_offline(zpool_handle_t *zhp, const char *path, int istmp)
899 {
900 	zfs_cmd_t zc = { 0 };
901 	char msg[1024];
902 	nvlist_t *tgt;
903 	boolean_t avail_spare;
904 	libzfs_handle_t *hdl = zhp->zpool_hdl;
905 
906 	(void) snprintf(msg, sizeof (msg),
907 	    dgettext(TEXT_DOMAIN, "cannot offline %s"), path);
908 
909 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
910 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare)) == NULL)
911 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
912 
913 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
914 
915 	if (avail_spare || is_spare(zhp, zc.zc_guid) == B_TRUE)
916 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
917 
918 	zc.zc_cookie = istmp;
919 
920 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_OFFLINE, &zc) == 0)
921 		return (0);
922 
923 	switch (errno) {
924 	case EBUSY:
925 
926 		/*
927 		 * There are no other replicas of this device.
928 		 */
929 		return (zfs_error(hdl, EZFS_NOREPLICAS, msg));
930 
931 	default:
932 		return (zpool_standard_error(hdl, errno, msg));
933 	}
934 }
935 
936 /*
937  * Returns TRUE if the given nvlist is a vdev that was originally swapped in as
938  * a hot spare.
939  */
940 static boolean_t
941 is_replacing_spare(nvlist_t *search, nvlist_t *tgt, int which)
942 {
943 	nvlist_t **child;
944 	uint_t c, children;
945 	char *type;
946 
947 	if (nvlist_lookup_nvlist_array(search, ZPOOL_CONFIG_CHILDREN, &child,
948 	    &children) == 0) {
949 		verify(nvlist_lookup_string(search, ZPOOL_CONFIG_TYPE,
950 		    &type) == 0);
951 
952 		if (strcmp(type, VDEV_TYPE_SPARE) == 0 &&
953 		    children == 2 && child[which] == tgt)
954 			return (B_TRUE);
955 
956 		for (c = 0; c < children; c++)
957 			if (is_replacing_spare(child[c], tgt, which))
958 				return (B_TRUE);
959 	}
960 
961 	return (B_FALSE);
962 }
963 
964 /*
965  * Attach new_disk (fully described by nvroot) to old_disk.
966  * If 'replacing' is specified, tne new disk will replace the old one.
967  */
968 int
969 zpool_vdev_attach(zpool_handle_t *zhp,
970     const char *old_disk, const char *new_disk, nvlist_t *nvroot, int replacing)
971 {
972 	zfs_cmd_t zc = { 0 };
973 	char msg[1024];
974 	int ret;
975 	nvlist_t *tgt;
976 	boolean_t avail_spare;
977 	uint64_t val;
978 	char *path;
979 	nvlist_t **child;
980 	uint_t children;
981 	nvlist_t *config_root;
982 	libzfs_handle_t *hdl = zhp->zpool_hdl;
983 
984 	if (replacing)
985 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
986 		    "cannot replace %s with %s"), old_disk, new_disk);
987 	else
988 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
989 		    "cannot attach %s to %s"), new_disk, old_disk);
990 
991 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
992 	if ((tgt = zpool_find_vdev(zhp, old_disk, &avail_spare)) == 0)
993 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
994 
995 	if (avail_spare)
996 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
997 
998 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
999 	zc.zc_cookie = replacing;
1000 
1001 	if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
1002 	    &child, &children) != 0 || children != 1) {
1003 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1004 		    "new device must be a single disk"));
1005 		return (zfs_error(hdl, EZFS_INVALCONFIG, msg));
1006 	}
1007 
1008 	verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
1009 	    ZPOOL_CONFIG_VDEV_TREE, &config_root) == 0);
1010 
1011 	/*
1012 	 * If the target is a hot spare that has been swapped in, we can only
1013 	 * replace it with another hot spare.
1014 	 */
1015 	if (replacing &&
1016 	    nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_IS_SPARE, &val) == 0 &&
1017 	    nvlist_lookup_string(child[0], ZPOOL_CONFIG_PATH, &path) == 0 &&
1018 	    (zpool_find_vdev(zhp, path, &avail_spare) == NULL ||
1019 	    !avail_spare) && is_replacing_spare(config_root, tgt, 1)) {
1020 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1021 		    "can only be replaced by another hot spare"));
1022 		return (zfs_error(hdl, EZFS_BADTARGET, msg));
1023 	}
1024 
1025 	/*
1026 	 * If we are attempting to replace a spare, it canot be applied to an
1027 	 * already spared device.
1028 	 */
1029 	if (replacing &&
1030 	    nvlist_lookup_string(child[0], ZPOOL_CONFIG_PATH, &path) == 0 &&
1031 	    zpool_find_vdev(zhp, path, &avail_spare) != NULL && avail_spare &&
1032 	    is_replacing_spare(config_root, tgt, 0)) {
1033 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1034 		    "device has already been replaced with a spare"));
1035 		return (zfs_error(hdl, EZFS_BADTARGET, msg));
1036 	}
1037 
1038 	if (zcmd_write_src_nvlist(hdl, &zc, nvroot, NULL) != 0)
1039 		return (-1);
1040 
1041 	ret = ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_ATTACH, &zc);
1042 
1043 	zcmd_free_nvlists(&zc);
1044 
1045 	if (ret == 0)
1046 		return (0);
1047 
1048 	switch (errno) {
1049 	case ENOTSUP:
1050 		/*
1051 		 * Can't attach to or replace this type of vdev.
1052 		 */
1053 		if (replacing)
1054 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1055 			    "cannot replace a replacing device"));
1056 		else
1057 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1058 			    "can only attach to mirrors and top-level "
1059 			    "disks"));
1060 		(void) zfs_error(hdl, EZFS_BADTARGET, msg);
1061 		break;
1062 
1063 	case EINVAL:
1064 		/*
1065 		 * The new device must be a single disk.
1066 		 */
1067 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1068 		    "new device must be a single disk"));
1069 		(void) zfs_error(hdl, EZFS_INVALCONFIG, msg);
1070 		break;
1071 
1072 	case EBUSY:
1073 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "%s is busy"),
1074 		    new_disk);
1075 		(void) zfs_error(hdl, EZFS_BADDEV, msg);
1076 		break;
1077 
1078 	case EOVERFLOW:
1079 		/*
1080 		 * The new device is too small.
1081 		 */
1082 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1083 		    "device is too small"));
1084 		(void) zfs_error(hdl, EZFS_BADDEV, msg);
1085 		break;
1086 
1087 	case EDOM:
1088 		/*
1089 		 * The new device has a different alignment requirement.
1090 		 */
1091 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1092 		    "devices have different sector alignment"));
1093 		(void) zfs_error(hdl, EZFS_BADDEV, msg);
1094 		break;
1095 
1096 	case ENAMETOOLONG:
1097 		/*
1098 		 * The resulting top-level vdev spec won't fit in the label.
1099 		 */
1100 		(void) zfs_error(hdl, EZFS_DEVOVERFLOW, msg);
1101 		break;
1102 
1103 	default:
1104 		(void) zpool_standard_error(hdl, errno, msg);
1105 	}
1106 
1107 	return (-1);
1108 }
1109 
1110 /*
1111  * Detach the specified device.
1112  */
1113 int
1114 zpool_vdev_detach(zpool_handle_t *zhp, const char *path)
1115 {
1116 	zfs_cmd_t zc = { 0 };
1117 	char msg[1024];
1118 	nvlist_t *tgt;
1119 	boolean_t avail_spare;
1120 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1121 
1122 	(void) snprintf(msg, sizeof (msg),
1123 	    dgettext(TEXT_DOMAIN, "cannot detach %s"), path);
1124 
1125 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1126 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare)) == 0)
1127 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1128 
1129 	if (avail_spare)
1130 		return (zfs_error(hdl, EZFS_ISSPARE, msg));
1131 
1132 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
1133 
1134 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_VDEV_DETACH, &zc) == 0)
1135 		return (0);
1136 
1137 	switch (errno) {
1138 
1139 	case ENOTSUP:
1140 		/*
1141 		 * Can't detach from this type of vdev.
1142 		 */
1143 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "only "
1144 		    "applicable to mirror and replacing vdevs"));
1145 		(void) zfs_error(zhp->zpool_hdl, EZFS_BADTARGET, msg);
1146 		break;
1147 
1148 	case EBUSY:
1149 		/*
1150 		 * There are no other replicas of this device.
1151 		 */
1152 		(void) zfs_error(hdl, EZFS_NOREPLICAS, msg);
1153 		break;
1154 
1155 	default:
1156 		(void) zpool_standard_error(hdl, errno, msg);
1157 	}
1158 
1159 	return (-1);
1160 }
1161 
1162 /*
1163  * Remove the given device.  Currently, this is supported only for hot spares.
1164  */
1165 int
1166 zpool_vdev_remove(zpool_handle_t *zhp, const char *path)
1167 {
1168 	zfs_cmd_t zc = { 0 };
1169 	char msg[1024];
1170 	nvlist_t *tgt;
1171 	boolean_t avail_spare;
1172 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1173 
1174 	(void) snprintf(msg, sizeof (msg),
1175 	    dgettext(TEXT_DOMAIN, "cannot remove %s"), path);
1176 
1177 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1178 	if ((tgt = zpool_find_vdev(zhp, path, &avail_spare)) == 0)
1179 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1180 
1181 	if (!avail_spare) {
1182 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1183 		    "only inactive hot spares can be removed"));
1184 		return (zfs_error(hdl, EZFS_NODEVICE, msg));
1185 	}
1186 
1187 	verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
1188 
1189 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_VDEV_REMOVE, &zc) == 0)
1190 		return (0);
1191 
1192 	return (zpool_standard_error(hdl, errno, msg));
1193 }
1194 
1195 /*
1196  * Clear the errors for the pool, or the particular device if specified.
1197  */
1198 int
1199 zpool_clear(zpool_handle_t *zhp, const char *path)
1200 {
1201 	zfs_cmd_t zc = { 0 };
1202 	char msg[1024];
1203 	nvlist_t *tgt;
1204 	boolean_t avail_spare;
1205 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1206 
1207 	if (path)
1208 		(void) snprintf(msg, sizeof (msg),
1209 		    dgettext(TEXT_DOMAIN, "cannot clear errors for %s"),
1210 		    path);
1211 	else
1212 		(void) snprintf(msg, sizeof (msg),
1213 		    dgettext(TEXT_DOMAIN, "cannot clear errors for %s"),
1214 		    zhp->zpool_name);
1215 
1216 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1217 	if (path) {
1218 		if ((tgt = zpool_find_vdev(zhp, path, &avail_spare)) == 0)
1219 			return (zfs_error(hdl, EZFS_NODEVICE, msg));
1220 
1221 		if (avail_spare)
1222 			return (zfs_error(hdl, EZFS_ISSPARE, msg));
1223 
1224 		verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID,
1225 		    &zc.zc_guid) == 0);
1226 	}
1227 
1228 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_CLEAR, &zc) == 0)
1229 		return (0);
1230 
1231 	return (zpool_standard_error(hdl, errno, msg));
1232 }
1233 
1234 /*
1235  * Iterate over all zvols in a given pool by walking the /dev/zvol/dsk/<pool>
1236  * hierarchy.
1237  */
1238 int
1239 zpool_iter_zvol(zpool_handle_t *zhp, int (*cb)(const char *, void *),
1240     void *data)
1241 {
1242 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1243 	char (*paths)[MAXPATHLEN];
1244 	size_t size = 4;
1245 	int curr, fd, base, ret = 0;
1246 	DIR *dirp;
1247 	struct dirent *dp;
1248 	struct stat st;
1249 
1250 	if ((base = open("/dev/zvol/dsk", O_RDONLY)) < 0)
1251 		return (errno == ENOENT ? 0 : -1);
1252 
1253 	if (fstatat(base, zhp->zpool_name, &st, 0) != 0) {
1254 		int err = errno;
1255 		(void) close(base);
1256 		return (err == ENOENT ? 0 : -1);
1257 	}
1258 
1259 	/*
1260 	 * Oddly this wasn't a directory -- ignore that failure since we
1261 	 * know there are no links lower in the (non-existant) hierarchy.
1262 	 */
1263 	if (!S_ISDIR(st.st_mode)) {
1264 		(void) close(base);
1265 		return (0);
1266 	}
1267 
1268 	if ((paths = zfs_alloc(hdl, size * sizeof (paths[0]))) == NULL) {
1269 		(void) close(base);
1270 		return (-1);
1271 	}
1272 
1273 	(void) strlcpy(paths[0], zhp->zpool_name, sizeof (paths[0]));
1274 	curr = 0;
1275 
1276 	while (curr >= 0) {
1277 		if (fstatat(base, paths[curr], &st, AT_SYMLINK_NOFOLLOW) != 0)
1278 			goto err;
1279 
1280 		if (S_ISDIR(st.st_mode)) {
1281 			if ((fd = openat(base, paths[curr], O_RDONLY)) < 0)
1282 				goto err;
1283 
1284 			if ((dirp = fdopendir(fd)) == NULL) {
1285 				(void) close(fd);
1286 				goto err;
1287 			}
1288 
1289 			while ((dp = readdir(dirp)) != NULL) {
1290 				if (dp->d_name[0] == '.')
1291 					continue;
1292 
1293 				if (curr + 1 == size) {
1294 					paths = zfs_realloc(hdl, paths,
1295 					    size * sizeof (paths[0]),
1296 					    size * 2 * sizeof (paths[0]));
1297 					if (paths == NULL) {
1298 						(void) closedir(dirp);
1299 						(void) close(fd);
1300 						goto err;
1301 					}
1302 
1303 					size *= 2;
1304 				}
1305 
1306 				(void) strlcpy(paths[curr + 1], paths[curr],
1307 				    sizeof (paths[curr + 1]));
1308 				(void) strlcat(paths[curr], "/",
1309 				    sizeof (paths[curr]));
1310 				(void) strlcat(paths[curr], dp->d_name,
1311 				    sizeof (paths[curr]));
1312 				curr++;
1313 			}
1314 
1315 			(void) closedir(dirp);
1316 
1317 		} else {
1318 			if ((ret = cb(paths[curr], data)) != 0)
1319 				break;
1320 		}
1321 
1322 		curr--;
1323 	}
1324 
1325 	free(paths);
1326 	(void) close(base);
1327 
1328 	return (ret);
1329 
1330 err:
1331 	free(paths);
1332 	(void) close(base);
1333 	return (-1);
1334 }
1335 
1336 typedef struct zvol_cb {
1337 	zpool_handle_t *zcb_pool;
1338 	boolean_t zcb_create;
1339 } zvol_cb_t;
1340 
1341 /*ARGSUSED*/
1342 static int
1343 do_zvol_create(zfs_handle_t *zhp, void *data)
1344 {
1345 	int ret;
1346 
1347 	if (ZFS_IS_VOLUME(zhp))
1348 		(void) zvol_create_link(zhp->zfs_hdl, zhp->zfs_name);
1349 
1350 	ret = zfs_iter_children(zhp, do_zvol_create, NULL);
1351 
1352 	zfs_close(zhp);
1353 
1354 	return (ret);
1355 }
1356 
1357 /*
1358  * Iterate over all zvols in the pool and make any necessary minor nodes.
1359  */
1360 int
1361 zpool_create_zvol_links(zpool_handle_t *zhp)
1362 {
1363 	zfs_handle_t *zfp;
1364 	int ret;
1365 
1366 	/*
1367 	 * If the pool is unavailable, just return success.
1368 	 */
1369 	if ((zfp = make_dataset_handle(zhp->zpool_hdl,
1370 	    zhp->zpool_name)) == NULL)
1371 		return (0);
1372 
1373 	ret = zfs_iter_children(zfp, do_zvol_create, NULL);
1374 
1375 	zfs_close(zfp);
1376 	return (ret);
1377 }
1378 
1379 static int
1380 do_zvol_remove(const char *dataset, void *data)
1381 {
1382 	zpool_handle_t *zhp = data;
1383 
1384 	return (zvol_remove_link(zhp->zpool_hdl, dataset));
1385 }
1386 
1387 /*
1388  * Iterate over all zvols in the pool and remove any minor nodes.  We iterate
1389  * by examining the /dev links so that a corrupted pool doesn't impede this
1390  * operation.
1391  */
1392 int
1393 zpool_remove_zvol_links(zpool_handle_t *zhp)
1394 {
1395 	return (zpool_iter_zvol(zhp, do_zvol_remove, zhp));
1396 }
1397 
1398 /*
1399  * Convert from a devid string to a path.
1400  */
1401 static char *
1402 devid_to_path(char *devid_str)
1403 {
1404 	ddi_devid_t devid;
1405 	char *minor;
1406 	char *path;
1407 	devid_nmlist_t *list = NULL;
1408 	int ret;
1409 
1410 	if (devid_str_decode(devid_str, &devid, &minor) != 0)
1411 		return (NULL);
1412 
1413 	ret = devid_deviceid_to_nmlist("/dev", devid, minor, &list);
1414 
1415 	devid_str_free(minor);
1416 	devid_free(devid);
1417 
1418 	if (ret != 0)
1419 		return (NULL);
1420 
1421 	if ((path = strdup(list[0].devname)) == NULL)
1422 		return (NULL);
1423 
1424 	devid_free_nmlist(list);
1425 
1426 	return (path);
1427 }
1428 
1429 /*
1430  * Convert from a path to a devid string.
1431  */
1432 static char *
1433 path_to_devid(const char *path)
1434 {
1435 	int fd;
1436 	ddi_devid_t devid;
1437 	char *minor, *ret;
1438 
1439 	if ((fd = open(path, O_RDONLY)) < 0)
1440 		return (NULL);
1441 
1442 	minor = NULL;
1443 	ret = NULL;
1444 	if (devid_get(fd, &devid) == 0) {
1445 		if (devid_get_minor_name(fd, &minor) == 0)
1446 			ret = devid_str_encode(devid, minor);
1447 		if (minor != NULL)
1448 			devid_str_free(minor);
1449 		devid_free(devid);
1450 	}
1451 	(void) close(fd);
1452 
1453 	return (ret);
1454 }
1455 
1456 /*
1457  * Issue the necessary ioctl() to update the stored path value for the vdev.  We
1458  * ignore any failure here, since a common case is for an unprivileged user to
1459  * type 'zpool status', and we'll display the correct information anyway.
1460  */
1461 static void
1462 set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path)
1463 {
1464 	zfs_cmd_t zc = { 0 };
1465 
1466 	(void) strncpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1467 	(void) strncpy(zc.zc_value, path, sizeof (zc.zc_value));
1468 	verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
1469 	    &zc.zc_guid) == 0);
1470 
1471 	(void) ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SETPATH, &zc);
1472 }
1473 
1474 /*
1475  * Given a vdev, return the name to display in iostat.  If the vdev has a path,
1476  * we use that, stripping off any leading "/dev/dsk/"; if not, we use the type.
1477  * We also check if this is a whole disk, in which case we strip off the
1478  * trailing 's0' slice name.
1479  *
1480  * This routine is also responsible for identifying when disks have been
1481  * reconfigured in a new location.  The kernel will have opened the device by
1482  * devid, but the path will still refer to the old location.  To catch this, we
1483  * first do a path -> devid translation (which is fast for the common case).  If
1484  * the devid matches, we're done.  If not, we do a reverse devid -> path
1485  * translation and issue the appropriate ioctl() to update the path of the vdev.
1486  * If 'zhp' is NULL, then this is an exported pool, and we don't need to do any
1487  * of these checks.
1488  */
1489 char *
1490 zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv)
1491 {
1492 	char *path, *devid;
1493 	uint64_t value;
1494 	char buf[64];
1495 
1496 	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
1497 	    &value) == 0) {
1498 		verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
1499 		    &value) == 0);
1500 		(void) snprintf(buf, sizeof (buf), "%llu",
1501 		    (u_longlong_t)value);
1502 		path = buf;
1503 	} else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
1504 
1505 		if (zhp != NULL &&
1506 		    nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
1507 			/*
1508 			 * Determine if the current path is correct.
1509 			 */
1510 			char *newdevid = path_to_devid(path);
1511 
1512 			if (newdevid == NULL ||
1513 			    strcmp(devid, newdevid) != 0) {
1514 				char *newpath;
1515 
1516 				if ((newpath = devid_to_path(devid)) != NULL) {
1517 					/*
1518 					 * Update the path appropriately.
1519 					 */
1520 					set_path(zhp, nv, newpath);
1521 					if (nvlist_add_string(nv,
1522 					    ZPOOL_CONFIG_PATH, newpath) == 0)
1523 						verify(nvlist_lookup_string(nv,
1524 						    ZPOOL_CONFIG_PATH,
1525 						    &path) == 0);
1526 					free(newpath);
1527 				}
1528 			}
1529 
1530 			if (newdevid)
1531 				devid_str_free(newdevid);
1532 		}
1533 
1534 		if (strncmp(path, "/dev/dsk/", 9) == 0)
1535 			path += 9;
1536 
1537 		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
1538 		    &value) == 0 && value) {
1539 			char *tmp = zfs_strdup(hdl, path);
1540 			if (tmp == NULL)
1541 				return (NULL);
1542 			tmp[strlen(path) - 2] = '\0';
1543 			return (tmp);
1544 		}
1545 	} else {
1546 		verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &path) == 0);
1547 
1548 		/*
1549 		 * If it's a raidz device, we need to stick in the parity level.
1550 		 */
1551 		if (strcmp(path, VDEV_TYPE_RAIDZ) == 0) {
1552 			verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY,
1553 			    &value) == 0);
1554 			(void) snprintf(buf, sizeof (buf), "%s%llu", path,
1555 			    (u_longlong_t)value);
1556 			path = buf;
1557 		}
1558 	}
1559 
1560 	return (zfs_strdup(hdl, path));
1561 }
1562 
1563 static int
1564 zbookmark_compare(const void *a, const void *b)
1565 {
1566 	return (memcmp(a, b, sizeof (zbookmark_t)));
1567 }
1568 
1569 /*
1570  * Retrieve the persistent error log, uniquify the members, and return to the
1571  * caller.
1572  */
1573 int
1574 zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp)
1575 {
1576 	zfs_cmd_t zc = { 0 };
1577 	uint64_t count;
1578 	zbookmark_t *zb = NULL;
1579 	int i;
1580 
1581 	/*
1582 	 * Retrieve the raw error list from the kernel.  If the number of errors
1583 	 * has increased, allocate more space and continue until we get the
1584 	 * entire list.
1585 	 */
1586 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_ERRCOUNT,
1587 	    &count) == 0);
1588 	if ((zc.zc_nvlist_dst = (uintptr_t)zfs_alloc(zhp->zpool_hdl,
1589 	    count * sizeof (zbookmark_t))) == (uintptr_t)NULL)
1590 		return (-1);
1591 	zc.zc_nvlist_dst_size = count;
1592 	(void) strcpy(zc.zc_name, zhp->zpool_name);
1593 	for (;;) {
1594 		if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_ERROR_LOG,
1595 		    &zc) != 0) {
1596 			free((void *)(uintptr_t)zc.zc_nvlist_dst);
1597 			if (errno == ENOMEM) {
1598 				count = zc.zc_nvlist_dst_size;
1599 				if ((zc.zc_nvlist_dst = (uintptr_t)
1600 				    zfs_alloc(zhp->zpool_hdl, count *
1601 				    sizeof (zbookmark_t))) == (uintptr_t)NULL)
1602 					return (-1);
1603 			} else {
1604 				return (-1);
1605 			}
1606 		} else {
1607 			break;
1608 		}
1609 	}
1610 
1611 	/*
1612 	 * Sort the resulting bookmarks.  This is a little confusing due to the
1613 	 * implementation of ZFS_IOC_ERROR_LOG.  The bookmarks are copied last
1614 	 * to first, and 'zc_nvlist_dst_size' indicates the number of boomarks
1615 	 * _not_ copied as part of the process.  So we point the start of our
1616 	 * array appropriate and decrement the total number of elements.
1617 	 */
1618 	zb = ((zbookmark_t *)(uintptr_t)zc.zc_nvlist_dst) +
1619 	    zc.zc_nvlist_dst_size;
1620 	count -= zc.zc_nvlist_dst_size;
1621 
1622 	qsort(zb, count, sizeof (zbookmark_t), zbookmark_compare);
1623 
1624 	verify(nvlist_alloc(nverrlistp, 0, KM_SLEEP) == 0);
1625 
1626 	/*
1627 	 * Fill in the nverrlistp with nvlist's of dataset and object numbers.
1628 	 */
1629 	for (i = 0; i < count; i++) {
1630 		nvlist_t *nv;
1631 
1632 		/* ignoring zb_blkid and zb_level for now */
1633 		if (i > 0 && zb[i-1].zb_objset == zb[i].zb_objset &&
1634 		    zb[i-1].zb_object == zb[i].zb_object)
1635 			continue;
1636 
1637 		if (nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) != 0)
1638 			goto nomem;
1639 		if (nvlist_add_uint64(nv, ZPOOL_ERR_DATASET,
1640 		    zb[i].zb_objset) != 0) {
1641 			nvlist_free(nv);
1642 			goto nomem;
1643 		}
1644 		if (nvlist_add_uint64(nv, ZPOOL_ERR_OBJECT,
1645 		    zb[i].zb_object) != 0) {
1646 			nvlist_free(nv);
1647 			goto nomem;
1648 		}
1649 		if (nvlist_add_nvlist(*nverrlistp, "ejk", nv) != 0) {
1650 			nvlist_free(nv);
1651 			goto nomem;
1652 		}
1653 		nvlist_free(nv);
1654 	}
1655 
1656 	free((void *)(uintptr_t)zc.zc_nvlist_dst);
1657 	return (0);
1658 
1659 nomem:
1660 	free((void *)(uintptr_t)zc.zc_nvlist_dst);
1661 	return (no_memory(zhp->zpool_hdl));
1662 }
1663 
1664 /*
1665  * Upgrade a ZFS pool to the latest on-disk version.
1666  */
1667 int
1668 zpool_upgrade(zpool_handle_t *zhp)
1669 {
1670 	zfs_cmd_t zc = { 0 };
1671 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1672 
1673 	(void) strcpy(zc.zc_name, zhp->zpool_name);
1674 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_UPGRADE, &zc) != 0)
1675 		return (zpool_standard_error_fmt(hdl, errno,
1676 		    dgettext(TEXT_DOMAIN, "cannot upgrade '%s'"),
1677 		    zhp->zpool_name));
1678 
1679 	return (0);
1680 }
1681 
1682 /*
1683  * Log command history.
1684  *
1685  * 'pool' is B_TRUE if we are logging a command for 'zpool'; B_FALSE
1686  * otherwise ('zfs').  'pool_create' is B_TRUE if we are logging the creation
1687  * of the pool; B_FALSE otherwise.  'path' is the pathanme containing the
1688  * poolname.  'argc' and 'argv' are used to construct the command string.
1689  */
1690 void
1691 zpool_log_history(libzfs_handle_t *hdl, int argc, char **argv, const char *path,
1692 	boolean_t pool, boolean_t pool_create)
1693 {
1694 	char cmd_buf[HIS_MAX_RECORD_LEN];
1695 	char *dspath;
1696 	zfs_cmd_t zc = { 0 };
1697 	int i;
1698 
1699 	/* construct the command string */
1700 	(void) strcpy(cmd_buf, pool ? "zpool" : "zfs");
1701 	for (i = 0; i < argc; i++) {
1702 		if (strlen(cmd_buf) + 1 + strlen(argv[i]) > HIS_MAX_RECORD_LEN)
1703 			break;
1704 		(void) strcat(cmd_buf, " ");
1705 		(void) strcat(cmd_buf, argv[i]);
1706 	}
1707 
1708 	/* figure out the poolname */
1709 	dspath = strpbrk(path, "/@");
1710 	if (dspath == NULL) {
1711 		(void) strcpy(zc.zc_name, path);
1712 	} else {
1713 		(void) strncpy(zc.zc_name, path, dspath - path);
1714 		zc.zc_name[dspath-path] = '\0';
1715 	}
1716 
1717 	zc.zc_history = (uint64_t)(uintptr_t)cmd_buf;
1718 	zc.zc_history_len = strlen(cmd_buf);
1719 
1720 	/* overloading zc_history_offset */
1721 	zc.zc_history_offset = pool_create;
1722 
1723 	(void) ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_LOG_HISTORY, &zc);
1724 }
1725 
1726 /*
1727  * Perform ioctl to get some command history of a pool.
1728  *
1729  * 'buf' is the buffer to fill up to 'len' bytes.  'off' is the
1730  * logical offset of the history buffer to start reading from.
1731  *
1732  * Upon return, 'off' is the next logical offset to read from and
1733  * 'len' is the actual amount of bytes read into 'buf'.
1734  */
1735 static int
1736 get_history(zpool_handle_t *zhp, char *buf, uint64_t *off, uint64_t *len)
1737 {
1738 	zfs_cmd_t zc = { 0 };
1739 	libzfs_handle_t *hdl = zhp->zpool_hdl;
1740 
1741 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1742 
1743 	zc.zc_history = (uint64_t)(uintptr_t)buf;
1744 	zc.zc_history_len = *len;
1745 	zc.zc_history_offset = *off;
1746 
1747 	if (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_GET_HISTORY, &zc) != 0) {
1748 		switch (errno) {
1749 		case EPERM:
1750 			return (zfs_error_fmt(hdl, EZFS_PERM,
1751 			    dgettext(TEXT_DOMAIN,
1752 			    "cannot show history for pool '%s'"),
1753 			    zhp->zpool_name));
1754 		case ENOENT:
1755 			return (zfs_error_fmt(hdl, EZFS_NOHISTORY,
1756 			    dgettext(TEXT_DOMAIN, "cannot get history for pool "
1757 			    "'%s'"), zhp->zpool_name));
1758 		case ENOTSUP:
1759 			return (zfs_error_fmt(hdl, EZFS_BADVERSION,
1760 			    dgettext(TEXT_DOMAIN, "cannot get history for pool "
1761 			    "'%s', pool must be upgraded"), zhp->zpool_name));
1762 		default:
1763 			return (zpool_standard_error_fmt(hdl, errno,
1764 			    dgettext(TEXT_DOMAIN,
1765 			    "cannot get history for '%s'"), zhp->zpool_name));
1766 		}
1767 	}
1768 
1769 	*len = zc.zc_history_len;
1770 	*off = zc.zc_history_offset;
1771 
1772 	return (0);
1773 }
1774 
1775 /*
1776  * Process the buffer of nvlists, unpacking and storing each nvlist record
1777  * into 'records'.  'leftover' is set to the number of bytes that weren't
1778  * processed as there wasn't a complete record.
1779  */
1780 static int
1781 zpool_history_unpack(char *buf, uint64_t bytes_read, uint64_t *leftover,
1782     nvlist_t ***records, uint_t *numrecords)
1783 {
1784 	uint64_t reclen;
1785 	nvlist_t *nv;
1786 	int i;
1787 
1788 	while (bytes_read > sizeof (reclen)) {
1789 
1790 		/* get length of packed record (stored as little endian) */
1791 		for (i = 0, reclen = 0; i < sizeof (reclen); i++)
1792 			reclen += (uint64_t)(((uchar_t *)buf)[i]) << (8*i);
1793 
1794 		if (bytes_read < sizeof (reclen) + reclen)
1795 			break;
1796 
1797 		/* unpack record */
1798 		if (nvlist_unpack(buf + sizeof (reclen), reclen, &nv, 0) != 0)
1799 			return (ENOMEM);
1800 		bytes_read -= sizeof (reclen) + reclen;
1801 		buf += sizeof (reclen) + reclen;
1802 
1803 		/* add record to nvlist array */
1804 		(*numrecords)++;
1805 		if (ISP2(*numrecords + 1)) {
1806 			*records = realloc(*records,
1807 			    *numrecords * 2 * sizeof (nvlist_t *));
1808 		}
1809 		(*records)[*numrecords - 1] = nv;
1810 	}
1811 
1812 	*leftover = bytes_read;
1813 	return (0);
1814 }
1815 
1816 #define	HIS_BUF_LEN	(128*1024)
1817 
1818 /*
1819  * Retrieve the command history of a pool.
1820  */
1821 int
1822 zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp)
1823 {
1824 	char buf[HIS_BUF_LEN];
1825 	uint64_t off = 0;
1826 	nvlist_t **records = NULL;
1827 	uint_t numrecords = 0;
1828 	int err, i;
1829 
1830 	do {
1831 		uint64_t bytes_read = sizeof (buf);
1832 		uint64_t leftover;
1833 
1834 		if ((err = get_history(zhp, buf, &off, &bytes_read)) != 0)
1835 			break;
1836 
1837 		/* if nothing else was read in, we're at EOF, just return */
1838 		if (!bytes_read)
1839 			break;
1840 
1841 		if ((err = zpool_history_unpack(buf, bytes_read,
1842 		    &leftover, &records, &numrecords)) != 0)
1843 			break;
1844 		off -= leftover;
1845 
1846 		/* CONSTCOND */
1847 	} while (1);
1848 
1849 	if (!err) {
1850 		verify(nvlist_alloc(nvhisp, NV_UNIQUE_NAME, 0) == 0);
1851 		verify(nvlist_add_nvlist_array(*nvhisp, ZPOOL_HIST_RECORD,
1852 		    records, numrecords) == 0);
1853 	}
1854 	for (i = 0; i < numrecords; i++)
1855 		nvlist_free(records[i]);
1856 	free(records);
1857 
1858 	return (err);
1859 }
1860 
1861 void
1862 zpool_obj_to_path(zpool_handle_t *zhp, uint64_t dsobj, uint64_t obj,
1863     char *pathname, size_t len)
1864 {
1865 	zfs_cmd_t zc = { 0 };
1866 	boolean_t mounted = B_FALSE;
1867 	char *mntpnt = NULL;
1868 	char dsname[MAXNAMELEN];
1869 
1870 	if (dsobj == 0) {
1871 		/* special case for the MOS */
1872 		(void) snprintf(pathname, len, "<metadata>:<0x%llx>", obj);
1873 		return;
1874 	}
1875 
1876 	/* get the dataset's name */
1877 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1878 	zc.zc_obj = dsobj;
1879 	if (ioctl(zhp->zpool_hdl->libzfs_fd,
1880 	    ZFS_IOC_DSOBJ_TO_DSNAME, &zc) != 0) {
1881 		/* just write out a path of two object numbers */
1882 		(void) snprintf(pathname, len, "<0x%llx>:<0x%llx>",
1883 		    dsobj, obj);
1884 		return;
1885 	}
1886 	(void) strlcpy(dsname, zc.zc_value, sizeof (dsname));
1887 
1888 	/* find out if the dataset is mounted */
1889 	mounted = is_mounted(zhp->zpool_hdl, dsname, &mntpnt);
1890 
1891 	/* get the corrupted object's path */
1892 	(void) strlcpy(zc.zc_name, dsname, sizeof (zc.zc_name));
1893 	zc.zc_obj = obj;
1894 	if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_OBJ_TO_PATH,
1895 	    &zc) == 0) {
1896 		if (mounted) {
1897 			(void) snprintf(pathname, len, "%s%s", mntpnt,
1898 			    zc.zc_value);
1899 		} else {
1900 			(void) snprintf(pathname, len, "%s:%s",
1901 			    dsname, zc.zc_value);
1902 		}
1903 	} else {
1904 		(void) snprintf(pathname, len, "%s:<0x%llx>", dsname, obj);
1905 	}
1906 	free(mntpnt);
1907 }
1908 
1909 #define	RDISK_ROOT	"/dev/rdsk"
1910 #define	BACKUP_SLICE	"s2"
1911 /*
1912  * Don't start the slice at the default block of 34; many storage
1913  * devices will use a stripe width of 128k, so start there instead.
1914  */
1915 #define	NEW_START_BLOCK	256
1916 
1917 /*
1918  * determine where a partition starts on a disk in the current
1919  * configuration
1920  */
1921 static diskaddr_t
1922 find_start_block(nvlist_t *config)
1923 {
1924 	nvlist_t **child;
1925 	uint_t c, children;
1926 	char *path;
1927 	diskaddr_t sb = MAXOFFSET_T;
1928 	int fd;
1929 	char diskname[MAXPATHLEN];
1930 	uint64_t wholedisk;
1931 
1932 	if (nvlist_lookup_nvlist_array(config,
1933 	    ZPOOL_CONFIG_CHILDREN, &child, &children) != 0) {
1934 		if (nvlist_lookup_uint64(config,
1935 		    ZPOOL_CONFIG_WHOLE_DISK,
1936 		    &wholedisk) != 0 || !wholedisk) {
1937 			return (MAXOFFSET_T);
1938 		}
1939 		if (nvlist_lookup_string(config,
1940 		    ZPOOL_CONFIG_PATH, &path) != 0) {
1941 			return (MAXOFFSET_T);
1942 		}
1943 
1944 		(void) snprintf(diskname, sizeof (diskname), "%s%s",
1945 		    RDISK_ROOT, strrchr(path, '/'));
1946 		if ((fd = open(diskname, O_RDONLY|O_NDELAY)) >= 0) {
1947 			struct dk_gpt *vtoc;
1948 			if (efi_alloc_and_read(fd, &vtoc) >= 0) {
1949 				sb = vtoc->efi_parts[0].p_start;
1950 				efi_free(vtoc);
1951 			}
1952 			(void) close(fd);
1953 		}
1954 		return (sb);
1955 	}
1956 
1957 	for (c = 0; c < children; c++) {
1958 		sb = find_start_block(child[c]);
1959 		if (sb != MAXOFFSET_T) {
1960 			return (sb);
1961 		}
1962 	}
1963 	return (MAXOFFSET_T);
1964 }
1965 
1966 /*
1967  * Label an individual disk.  The name provided is the short name,
1968  * stripped of any leading /dev path.
1969  */
1970 int
1971 zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, char *name)
1972 {
1973 	char path[MAXPATHLEN];
1974 	struct dk_gpt *vtoc;
1975 	int fd;
1976 	size_t resv = EFI_MIN_RESV_SIZE;
1977 	uint64_t slice_size;
1978 	diskaddr_t start_block;
1979 	char errbuf[1024];
1980 
1981 	if (zhp) {
1982 		nvlist_t *nvroot;
1983 
1984 		verify(nvlist_lookup_nvlist(zhp->zpool_config,
1985 		    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
1986 
1987 		if (zhp->zpool_start_block == 0)
1988 			start_block = find_start_block(nvroot);
1989 		else
1990 			start_block = zhp->zpool_start_block;
1991 		zhp->zpool_start_block = start_block;
1992 	} else {
1993 		/* new pool */
1994 		start_block = NEW_START_BLOCK;
1995 	}
1996 
1997 	(void) snprintf(path, sizeof (path), "%s/%s%s", RDISK_ROOT, name,
1998 	    BACKUP_SLICE);
1999 
2000 	if ((fd = open(path, O_RDWR | O_NDELAY)) < 0) {
2001 		/*
2002 		 * This shouldn't happen.  We've long since verified that this
2003 		 * is a valid device.
2004 		 */
2005 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
2006 		    "label '%s': unable to open device"), name);
2007 		return (zfs_error(hdl, EZFS_OPENFAILED, errbuf));
2008 	}
2009 
2010 	if (efi_alloc_and_init(fd, EFI_NUMPAR, &vtoc) != 0) {
2011 		/*
2012 		 * The only way this can fail is if we run out of memory, or we
2013 		 * were unable to read the disk's capacity
2014 		 */
2015 		if (errno == ENOMEM)
2016 			(void) no_memory(hdl);
2017 
2018 		(void) close(fd);
2019 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
2020 		    "label '%s': unable to read disk capacity"), name);
2021 
2022 		return (zfs_error(hdl, EZFS_NOCAP, errbuf));
2023 	}
2024 
2025 	slice_size = vtoc->efi_last_u_lba + 1;
2026 	slice_size -= EFI_MIN_RESV_SIZE;
2027 	if (start_block == MAXOFFSET_T)
2028 		start_block = NEW_START_BLOCK;
2029 	slice_size -= start_block;
2030 
2031 	vtoc->efi_parts[0].p_start = start_block;
2032 	vtoc->efi_parts[0].p_size = slice_size;
2033 
2034 	/*
2035 	 * Why we use V_USR: V_BACKUP confuses users, and is considered
2036 	 * disposable by some EFI utilities (since EFI doesn't have a backup
2037 	 * slice).  V_UNASSIGNED is supposed to be used only for zero size
2038 	 * partitions, and efi_write() will fail if we use it.  V_ROOT, V_BOOT,
2039 	 * etc. were all pretty specific.  V_USR is as close to reality as we
2040 	 * can get, in the absence of V_OTHER.
2041 	 */
2042 	vtoc->efi_parts[0].p_tag = V_USR;
2043 	(void) strcpy(vtoc->efi_parts[0].p_name, "zfs");
2044 
2045 	vtoc->efi_parts[8].p_start = slice_size + start_block;
2046 	vtoc->efi_parts[8].p_size = resv;
2047 	vtoc->efi_parts[8].p_tag = V_RESERVED;
2048 
2049 	if (efi_write(fd, vtoc) != 0) {
2050 		/*
2051 		 * Some block drivers (like pcata) may not support EFI
2052 		 * GPT labels.  Print out a helpful error message dir-
2053 		 * ecting the user to manually label the disk and give
2054 		 * a specific slice.
2055 		 */
2056 		(void) close(fd);
2057 		efi_free(vtoc);
2058 
2059 		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
2060 		    "cannot label '%s': try using fdisk(1M) and then "
2061 		    "provide a specific slice"), name);
2062 		return (zfs_error(hdl, EZFS_LABELFAILED, errbuf));
2063 	}
2064 
2065 	(void) close(fd);
2066 	efi_free(vtoc);
2067 	return (0);
2068 }
2069 
2070 int
2071 zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval)
2072 {
2073 	zfs_cmd_t zc = { 0 };
2074 	int ret = -1;
2075 	char errbuf[1024];
2076 	nvlist_t *nvl = NULL;
2077 	nvlist_t *realprops;
2078 
2079 	(void) snprintf(errbuf, sizeof (errbuf),
2080 	    dgettext(TEXT_DOMAIN, "cannot set property for '%s'"),
2081 	    zhp->zpool_name);
2082 
2083 	if (zpool_get_version(zhp) < ZFS_VERSION_BOOTFS) {
2084 		zfs_error_aux(zhp->zpool_hdl,
2085 		    dgettext(TEXT_DOMAIN, "pool must be "
2086 		    "upgraded to support pool properties"));
2087 		return (zfs_error(zhp->zpool_hdl, EZFS_BADVERSION, errbuf));
2088 	}
2089 
2090 	if (zhp->zpool_props == NULL && zpool_get_all_props(zhp))
2091 		return (zfs_error(zhp->zpool_hdl, EZFS_POOLPROPS, errbuf));
2092 
2093 	if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0 ||
2094 	    nvlist_add_string(nvl, propname, propval) != 0) {
2095 		return (no_memory(zhp->zpool_hdl));
2096 	}
2097 
2098 	if ((realprops = zfs_validate_properties(zhp->zpool_hdl, ZFS_TYPE_POOL,
2099 	    zhp->zpool_name, nvl, 0, NULL, errbuf)) == NULL) {
2100 		nvlist_free(nvl);
2101 		return (-1);
2102 	}
2103 
2104 	nvlist_free(nvl);
2105 	nvl = realprops;
2106 
2107 	/*
2108 	 * Execute the corresponding ioctl() to set this property.
2109 	 */
2110 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
2111 
2112 	if (zcmd_write_src_nvlist(zhp->zpool_hdl, &zc, nvl, NULL) != 0)
2113 		return (-1);
2114 
2115 	ret = ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_POOL_SET_PROPS, &zc);
2116 	zcmd_free_nvlists(&zc);
2117 
2118 	if (ret)
2119 		(void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf);
2120 
2121 	return (ret);
2122 }
2123 
2124 int
2125 zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *propbuf,
2126     size_t proplen, zfs_source_t *srctype)
2127 {
2128 	uint64_t value;
2129 	char msg[1024], *strvalue;
2130 	nvlist_t *nvp;
2131 	zfs_source_t src = ZFS_SRC_NONE;
2132 
2133 	(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
2134 	    "cannot get property '%s'"), zpool_prop_to_name(prop));
2135 
2136 	if (zpool_get_version(zhp) < ZFS_VERSION_BOOTFS) {
2137 		zfs_error_aux(zhp->zpool_hdl,
2138 		    dgettext(TEXT_DOMAIN, "pool must be "
2139 		    "upgraded to support pool properties"));
2140 		return (zfs_error(zhp->zpool_hdl, EZFS_BADVERSION, msg));
2141 	}
2142 
2143 	if (zhp->zpool_props == NULL && zpool_get_all_props(zhp))
2144 		return (zfs_error(zhp->zpool_hdl, EZFS_POOLPROPS, msg));
2145 
2146 	/*
2147 	 * the "name" property is special cased
2148 	 */
2149 	if (!zfs_prop_valid_for_type(prop, ZFS_TYPE_POOL) &&
2150 	    prop != ZFS_PROP_NAME)
2151 		return (-1);
2152 
2153 	switch (prop) {
2154 	case ZFS_PROP_NAME:
2155 		(void) strlcpy(propbuf, zhp->zpool_name, proplen);
2156 		break;
2157 
2158 	case ZFS_PROP_BOOTFS:
2159 		if (nvlist_lookup_nvlist(zhp->zpool_props,
2160 		    zpool_prop_to_name(prop), &nvp) != 0) {
2161 			strvalue = (char *)zfs_prop_default_string(prop);
2162 			if (strvalue == NULL)
2163 				strvalue = "-";
2164 			src = ZFS_SRC_DEFAULT;
2165 		} else {
2166 			VERIFY(nvlist_lookup_uint64(nvp,
2167 			    ZFS_PROP_SOURCE, &value) == 0);
2168 			src = value;
2169 			VERIFY(nvlist_lookup_string(nvp, ZFS_PROP_VALUE,
2170 			    &strvalue) == 0);
2171 			if (strlen(strvalue) >= proplen)
2172 				return (-1);
2173 		}
2174 		(void) strcpy(propbuf, strvalue);
2175 		break;
2176 
2177 	default:
2178 		return (-1);
2179 	}
2180 	if (srctype)
2181 		*srctype = src;
2182 	return (0);
2183 }
2184 
2185 int
2186 zpool_get_proplist(libzfs_handle_t *hdl, char *fields, zpool_proplist_t **listp)
2187 {
2188 	return (zfs_get_proplist_common(hdl, fields, listp, ZFS_TYPE_POOL));
2189 }
2190 
2191 
2192 int
2193 zpool_expand_proplist(zpool_handle_t *zhp, zpool_proplist_t **plp)
2194 {
2195 	libzfs_handle_t *hdl = zhp->zpool_hdl;
2196 	zpool_proplist_t *entry;
2197 	char buf[ZFS_MAXPROPLEN];
2198 
2199 	if (zfs_expand_proplist_common(hdl, plp, ZFS_TYPE_POOL) != 0)
2200 		return (-1);
2201 
2202 	for (entry = *plp; entry != NULL; entry = entry->pl_next) {
2203 
2204 		if (entry->pl_fixed)
2205 			continue;
2206 
2207 		if (entry->pl_prop != ZFS_PROP_INVAL &&
2208 		    zpool_get_prop(zhp, entry->pl_prop, buf, sizeof (buf),
2209 		    NULL) == 0) {
2210 			if (strlen(buf) > entry->pl_width)
2211 				entry->pl_width = strlen(buf);
2212 		}
2213 	}
2214 
2215 	return (0);
2216 }
2217