xref: /illumos-gate/usr/src/lib/libzfs/common/libzfs_pool.c (revision 10a4fa49f51ed9ae1c857a626de6ce9ebf41661a)
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  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <assert.h>
29 #include <ctype.h>
30 #include <errno.h>
31 #include <devid.h>
32 #include <fcntl.h>
33 #include <libintl.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <unistd.h>
38 #include <sys/zfs_ioctl.h>
39 #include <sys/zio.h>
40 
41 #include "zfs_namecheck.h"
42 #include "libzfs_impl.h"
43 
44 /*
45  * Validate the given pool name, optionally putting an extended error message in
46  * 'buf'.
47  */
48 static int
49 zpool_name_valid(const char *pool, boolean_t isopen, char *buf, size_t buflen)
50 {
51 	namecheck_err_t why;
52 	char what;
53 	int ret;
54 
55 	ret = pool_namecheck(pool, &why, &what);
56 
57 	/*
58 	 * The rules for reserved pool names were extended at a later point.
59 	 * But we need to support users with existing pools that may now be
60 	 * invalid.  So we only check for this expanded set of names during a
61 	 * create (or import), and only in userland.
62 	 */
63 	if (ret == 0 && !isopen &&
64 	    (strncmp(pool, "mirror", 6) == 0 ||
65 	    strncmp(pool, "raidz", 5) == 0 ||
66 	    strncmp(pool, "spare", 5) == 0)) {
67 		ret = -1;
68 		why = NAME_ERR_RESERVED;
69 	}
70 
71 
72 	if (ret != 0) {
73 		if (buf != NULL) {
74 			switch (why) {
75 			case NAME_ERR_TOOLONG:
76 				(void) snprintf(buf, buflen,
77 				    dgettext(TEXT_DOMAIN, "name is too long"));
78 				break;
79 
80 			case NAME_ERR_INVALCHAR:
81 				(void) snprintf(buf, buflen,
82 				    dgettext(TEXT_DOMAIN, "invalid character "
83 				    "'%c' in pool name"), what);
84 				break;
85 
86 			case NAME_ERR_NOLETTER:
87 				(void) strlcpy(buf, dgettext(TEXT_DOMAIN,
88 				    "name must begin with a letter"), buflen);
89 				break;
90 
91 			case NAME_ERR_RESERVED:
92 				(void) strlcpy(buf, dgettext(TEXT_DOMAIN,
93 				    "name is reserved\n"
94 				    "pool name may have been omitted"), buflen);
95 				break;
96 
97 			case NAME_ERR_DISKLIKE:
98 				(void) strlcpy(buf, dgettext(TEXT_DOMAIN,
99 				    "pool name is reserved\n"
100 				    "pool name may have been omitted"), buflen);
101 				break;
102 			}
103 		}
104 		return (FALSE);
105 	}
106 
107 	return (TRUE);
108 }
109 
110 /*
111  * Set the pool-wide health based on the vdev state of the root vdev.
112  */
113 void
114 set_pool_health(nvlist_t *config)
115 {
116 	nvlist_t *nvroot;
117 	vdev_stat_t *vs;
118 	uint_t vsc;
119 	char *health;
120 
121 	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
122 	    &nvroot) == 0);
123 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
124 	    (uint64_t **)&vs, &vsc) == 0);
125 
126 	switch (vs->vs_state) {
127 
128 	case VDEV_STATE_CLOSED:
129 	case VDEV_STATE_CANT_OPEN:
130 	case VDEV_STATE_OFFLINE:
131 		health = dgettext(TEXT_DOMAIN, "FAULTED");
132 		break;
133 
134 	case VDEV_STATE_DEGRADED:
135 		health = dgettext(TEXT_DOMAIN, "DEGRADED");
136 		break;
137 
138 	case VDEV_STATE_HEALTHY:
139 		health = dgettext(TEXT_DOMAIN, "ONLINE");
140 		break;
141 
142 	default:
143 		zfs_baderror(vs->vs_state);
144 	}
145 
146 	verify(nvlist_add_string(config, ZPOOL_CONFIG_POOL_HEALTH,
147 	    health) == 0);
148 }
149 
150 /*
151  * Open a handle to the given pool, even if the pool is currently in the FAULTED
152  * state.
153  */
154 zpool_handle_t *
155 zpool_open_canfail(const char *pool)
156 {
157 	zpool_handle_t *zhp;
158 	int error;
159 
160 	/*
161 	 * Make sure the pool name is valid.
162 	 */
163 	if (!zpool_name_valid(pool, B_TRUE, NULL, 0)) {
164 		zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': invalid "
165 		    "pool name"), pool);
166 		return (NULL);
167 	}
168 
169 	zhp = zfs_malloc(sizeof (zpool_handle_t));
170 
171 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
172 
173 	if ((error = zpool_refresh_stats(zhp)) != 0) {
174 		if (error == ENOENT || error == EINVAL) {
175 			zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': no "
176 			    "such pool"), pool);
177 			free(zhp);
178 			return (NULL);
179 		} else {
180 			zhp->zpool_state = POOL_STATE_UNAVAIL;
181 		}
182 	} else {
183 		zhp->zpool_state = POOL_STATE_ACTIVE;
184 	}
185 
186 	return (zhp);
187 }
188 
189 /*
190  * Like the above, but silent on error.  Used when iterating over pools (because
191  * the configuration cache may be out of date).
192  */
193 zpool_handle_t *
194 zpool_open_silent(const char *pool)
195 {
196 	zpool_handle_t *zhp;
197 	int error;
198 
199 	zhp = zfs_malloc(sizeof (zpool_handle_t));
200 
201 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
202 
203 	if ((error = zpool_refresh_stats(zhp)) != 0) {
204 		if (error == ENOENT || error == EINVAL) {
205 			free(zhp);
206 			return (NULL);
207 		} else {
208 			zhp->zpool_state = POOL_STATE_UNAVAIL;
209 		}
210 	} else {
211 		zhp->zpool_state = POOL_STATE_ACTIVE;
212 	}
213 
214 	return (zhp);
215 }
216 
217 /*
218  * Similar to zpool_open_canfail(), but refuses to open pools in the faulted
219  * state.
220  */
221 zpool_handle_t *
222 zpool_open(const char *pool)
223 {
224 	zpool_handle_t *zhp;
225 
226 	if ((zhp = zpool_open_canfail(pool)) == NULL)
227 		return (NULL);
228 
229 	if (zhp->zpool_state == POOL_STATE_UNAVAIL) {
230 		zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': pool is "
231 		    "currently unavailable"), zhp->zpool_name);
232 		zfs_error(dgettext(TEXT_DOMAIN, "run 'zpool status %s' for "
233 		    "detailed information"), zhp->zpool_name);
234 		zpool_close(zhp);
235 		return (NULL);
236 	}
237 
238 	return (zhp);
239 }
240 
241 /*
242  * Close the handle.  Simply frees the memory associated with the handle.
243  */
244 void
245 zpool_close(zpool_handle_t *zhp)
246 {
247 	if (zhp->zpool_config)
248 		nvlist_free(zhp->zpool_config);
249 	if (zhp->zpool_old_config)
250 		nvlist_free(zhp->zpool_old_config);
251 	if (zhp->zpool_error_log) {
252 		int i;
253 		for (i = 0; i < zhp->zpool_error_count; i++)
254 			free(zhp->zpool_error_log[i]);
255 		free(zhp->zpool_error_log);
256 	}
257 	free(zhp);
258 }
259 
260 /*
261  * Return the name of the pool.
262  */
263 const char *
264 zpool_get_name(zpool_handle_t *zhp)
265 {
266 	return (zhp->zpool_name);
267 }
268 
269 /*
270  * Return the GUID of the pool.
271  */
272 uint64_t
273 zpool_get_guid(zpool_handle_t *zhp)
274 {
275 	uint64_t guid;
276 
277 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_POOL_GUID,
278 	    &guid) == 0);
279 	return (guid);
280 }
281 
282 /*
283  * Return the amount of space currently consumed by the pool.
284  */
285 uint64_t
286 zpool_get_space_used(zpool_handle_t *zhp)
287 {
288 	nvlist_t *nvroot;
289 	vdev_stat_t *vs;
290 	uint_t vsc;
291 
292 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
293 	    &nvroot) == 0);
294 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
295 	    (uint64_t **)&vs, &vsc) == 0);
296 
297 	return (vs->vs_alloc);
298 }
299 
300 /*
301  * Return the total space in the pool.
302  */
303 uint64_t
304 zpool_get_space_total(zpool_handle_t *zhp)
305 {
306 	nvlist_t *nvroot;
307 	vdev_stat_t *vs;
308 	uint_t vsc;
309 
310 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
311 	    &nvroot) == 0);
312 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
313 	    (uint64_t **)&vs, &vsc) == 0);
314 
315 	return (vs->vs_space);
316 }
317 
318 /*
319  * Return the alternate root for this pool, if any.
320  */
321 int
322 zpool_get_root(zpool_handle_t *zhp, char *buf, size_t buflen)
323 {
324 	zfs_cmd_t zc = { 0 };
325 
326 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
327 	if (zfs_ioctl(ZFS_IOC_OBJSET_STATS, &zc) != 0 ||
328 	    zc.zc_root[0] == '\0')
329 		return (-1);
330 
331 	(void) strlcpy(buf, zc.zc_root, buflen);
332 
333 	return (0);
334 }
335 
336 /*
337  * Return the state of the pool (ACTIVE or UNAVAILABLE)
338  */
339 int
340 zpool_get_state(zpool_handle_t *zhp)
341 {
342 	return (zhp->zpool_state);
343 }
344 
345 /*
346  * Create the named pool, using the provided vdev list.  It is assumed
347  * that the consumer has already validated the contents of the nvlist, so we
348  * don't have to worry about error semantics.
349  */
350 int
351 zpool_create(const char *pool, nvlist_t *nvroot, const char *altroot)
352 {
353 	zfs_cmd_t zc = { 0 };
354 	char *packed;
355 	size_t len;
356 	int err;
357 	char reason[64];
358 
359 	if (!zpool_name_valid(pool, B_FALSE, reason, sizeof (reason))) {
360 		zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': %s"),
361 		    pool, reason);
362 		return (-1);
363 	}
364 
365 	if (altroot != NULL && altroot[0] != '/') {
366 		zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': alternate "
367 		    "root '%s' must be a complete path"), pool, altroot);
368 		return (-1);
369 	}
370 
371 	if ((err = nvlist_size(nvroot, &len, NV_ENCODE_NATIVE)) != 0)
372 		zfs_baderror(err);
373 
374 	packed = zfs_malloc(len);
375 
376 	if ((err = nvlist_pack(nvroot, &packed, &len,
377 	    NV_ENCODE_NATIVE, 0)) != 0)
378 		zfs_baderror(err);
379 
380 	(void) strlcpy(zc.zc_name, pool, sizeof (zc.zc_name));
381 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
382 	zc.zc_config_src_size = len;
383 
384 	if (altroot != NULL)
385 		(void) strlcpy(zc.zc_root, altroot, sizeof (zc.zc_root));
386 
387 	if (zfs_ioctl(ZFS_IOC_POOL_CREATE, &zc) != 0) {
388 		switch (errno) {
389 		case EEXIST:
390 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
391 			    "pool exists"), pool);
392 			break;
393 
394 		case EPERM:
395 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
396 			    "permission denied"), pool);
397 			break;
398 
399 		case EBUSY:
400 			/*
401 			 * This can happen if the user has specified the same
402 			 * device multiple times.  We can't reliably detect this
403 			 * until we try to add it and see we already have a
404 			 * label.
405 			 */
406 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
407 			    "one or more vdevs refer to the same device"),
408 			    pool);
409 			break;
410 
411 		case EOVERFLOW:
412 			/*
413 			 * This occurrs when one of the devices is below
414 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
415 			 * device was the problem device since there's no
416 			 * reliable way to determine device size from userland.
417 			 */
418 			{
419 				char buf[64];
420 
421 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
422 
423 				zfs_error(dgettext(TEXT_DOMAIN, "cannot "
424 				    "create '%s': one or more devices is less "
425 				    "than the minimum size (%s)"), pool,
426 				    buf);
427 			}
428 			break;
429 
430 		case ENAMETOOLONG:
431 			/*
432 			 * One of the vdevs has exceeded VDEV_SPEC_MAX length in
433 			 * its plaintext representation.
434 			 */
435 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
436 			    "too many devices in a single vdev"), pool);
437 			break;
438 
439 		case EIO:
440 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
441 			    "I/O error on one or more devices"), pool);
442 			break;
443 
444 		case ENXIO:
445 			/*
446 			 * This is unlikely to happen since we've verified that
447 			 * all the devices can be opened from userland, but it's
448 			 * still possible in some circumstances.
449 			 */
450 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
451 			    "one or more devices is unavailable"), pool);
452 			break;
453 
454 		case ENOSPC:
455 			/*
456 			 * This can occur if we were incapable of writing to a
457 			 * file vdev because the underlying filesystem is out of
458 			 * space.  This is very similar to EOVERFLOW, but we'll
459 			 * produce a slightly different message.
460 			 */
461 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
462 			    "one or more devices is out of space"), pool);
463 			break;
464 
465 		default:
466 			zfs_baderror(errno);
467 		}
468 
469 		return (-1);
470 	}
471 
472 	free(packed);
473 
474 	/*
475 	 * If this is an alternate root pool, then we automatically set the
476 	 * moutnpoint of the root dataset to be '/'.
477 	 */
478 	if (altroot != NULL) {
479 		zfs_handle_t *zhp;
480 
481 		verify((zhp = zfs_open(pool, ZFS_TYPE_ANY)) != NULL);
482 		verify(zfs_prop_set(zhp, ZFS_PROP_MOUNTPOINT, "/") == 0);
483 
484 		zfs_close(zhp);
485 	}
486 
487 	return (0);
488 }
489 
490 /*
491  * Destroy the given pool.  It is up to the caller to ensure that there are no
492  * datasets left in the pool.
493  */
494 int
495 zpool_destroy(zpool_handle_t *zhp)
496 {
497 	zfs_cmd_t zc = { 0 };
498 	zfs_handle_t *zfp = NULL;
499 
500 	if (zhp->zpool_state == POOL_STATE_ACTIVE &&
501 	    (zfp = zfs_open(zhp->zpool_name, ZFS_TYPE_FILESYSTEM)) == NULL)
502 		return (-1);
503 
504 	if (zpool_remove_zvol_links(zhp) != NULL)
505 		return (-1);
506 
507 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
508 
509 	if (zfs_ioctl(ZFS_IOC_POOL_DESTROY, &zc) != 0) {
510 		switch (errno) {
511 		case EPERM:
512 			zfs_error(dgettext(TEXT_DOMAIN,
513 			    "cannot destroy '%s': permission denied"),
514 			    zhp->zpool_name);
515 			break;
516 
517 		case EBUSY:
518 			zfs_error(dgettext(TEXT_DOMAIN,
519 			    "cannot destroy '%s': pool busy"),
520 			    zhp->zpool_name);
521 			break;
522 
523 		case ENOENT:
524 			zfs_error(dgettext(TEXT_DOMAIN,
525 			    "cannot destroy '%s': no such pool"),
526 			    zhp->zpool_name);
527 			break;
528 
529 		case EROFS:
530 			zfs_error(dgettext(TEXT_DOMAIN,
531 			    "cannot destroy '%s': one or more devices is "
532 			    "read only, or '/' is mounted read only"),
533 			    zhp->zpool_name);
534 			break;
535 
536 		default:
537 			zfs_baderror(errno);
538 		}
539 
540 		if (zfp)
541 			zfs_close(zfp);
542 		return (-1);
543 	}
544 
545 	if (zfp) {
546 		remove_mountpoint(zfp);
547 		zfs_close(zfp);
548 	}
549 
550 	return (0);
551 }
552 
553 /*
554  * Add the given vdevs to the pool.  The caller must have already performed the
555  * necessary verification to ensure that the vdev specification is well-formed.
556  */
557 int
558 zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot)
559 {
560 	char *packed;
561 	size_t len;
562 	zfs_cmd_t zc;
563 
564 	verify(nvlist_size(nvroot, &len, NV_ENCODE_NATIVE) == 0);
565 
566 	packed = zfs_malloc(len);
567 
568 	verify(nvlist_pack(nvroot, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
569 
570 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
571 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
572 	zc.zc_config_src_size = len;
573 
574 	if (zfs_ioctl(ZFS_IOC_VDEV_ADD, &zc) != 0) {
575 		switch (errno) {
576 		case EPERM:
577 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
578 			    "permission denied"), zhp->zpool_name);
579 			break;
580 
581 		case EBUSY:
582 			/*
583 			 * This can happen if the user has specified the same
584 			 * device multiple times.  We can't reliably detect this
585 			 * until we try to add it and see we already have a
586 			 * label.
587 			 */
588 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
589 			    "one or more vdevs refer to the same device"),
590 			    zhp->zpool_name);
591 			break;
592 
593 		case ENAMETOOLONG:
594 			/*
595 			 * One of the vdevs has exceeded VDEV_SPEC_MAX length in
596 			 * its plaintext representation.
597 			 */
598 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
599 			    "too many devices in a single vdev"),
600 			    zhp->zpool_name);
601 			break;
602 
603 		case ENXIO:
604 			/*
605 			 * This is unlikely to happen since we've verified that
606 			 * all the devices can be opened from userland, but it's
607 			 * still possible in some circumstances.
608 			 */
609 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
610 			    "one or more devices is unavailable"),
611 			    zhp->zpool_name);
612 			break;
613 
614 		case EOVERFLOW:
615 			/*
616 			 * This occurrs when one of the devices is below
617 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
618 			 * device was the problem device since there's no
619 			 * reliable way to determine device size from userland.
620 			 */
621 			{
622 				char buf[64];
623 
624 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
625 
626 				zfs_error(dgettext(TEXT_DOMAIN, "cannot "
627 				    "add to '%s': one or more devices is less "
628 				    "than the minimum size (%s)"),
629 				    zhp->zpool_name, buf);
630 			}
631 			break;
632 
633 		default:
634 			zfs_baderror(errno);
635 		}
636 
637 		return (-1);
638 	}
639 
640 	free(packed);
641 
642 	return (0);
643 }
644 
645 /*
646  * Exports the pool from the system.  The caller must ensure that there are no
647  * mounted datasets in the pool.
648  */
649 int
650 zpool_export(zpool_handle_t *zhp)
651 {
652 	zfs_cmd_t zc = { 0 };
653 
654 	if (zpool_remove_zvol_links(zhp) != 0)
655 		return (-1);
656 
657 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
658 
659 	if (zfs_ioctl(ZFS_IOC_POOL_EXPORT, &zc) != 0) {
660 		switch (errno) {
661 		case EPERM:
662 			zfs_error(dgettext(TEXT_DOMAIN,
663 			    "cannot export '%s': permission denied"),
664 			    zhp->zpool_name);
665 			break;
666 
667 		case EBUSY:
668 			zfs_error(dgettext(TEXT_DOMAIN,
669 			    "cannot export '%s': pool is in use"),
670 			    zhp->zpool_name);
671 			break;
672 
673 		case ENOENT:
674 			zfs_error(dgettext(TEXT_DOMAIN,
675 			    "cannot export '%s': no such pool"),
676 			    zhp->zpool_name);
677 			break;
678 
679 		default:
680 			zfs_baderror(errno);
681 		}
682 
683 		return (-1);
684 	}
685 
686 	return (0);
687 }
688 
689 /*
690  * Import the given pool using the known configuration.  The configuration
691  * should have come from zpool_find_import().  The 'newname' and 'altroot'
692  * parameters control whether the pool is imported with a different name or with
693  * an alternate root, respectively.
694  */
695 int
696 zpool_import(nvlist_t *config, const char *newname, const char *altroot)
697 {
698 	zfs_cmd_t zc;
699 	char *packed;
700 	size_t len;
701 	char *thename;
702 	char *origname;
703 	int ret;
704 
705 	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
706 	    &origname) == 0);
707 
708 	if (newname != NULL) {
709 		if (!zpool_name_valid(newname, B_FALSE, NULL, 0)) {
710 			zfs_error(dgettext(TEXT_DOMAIN, "cannot import '%s': "
711 			    "invalid pool name"), newname);
712 			return (-1);
713 		}
714 		thename = (char *)newname;
715 	} else {
716 		thename = origname;
717 	}
718 
719 	if (altroot != NULL && altroot[0] != '/') {
720 		zfs_error(dgettext(TEXT_DOMAIN, "cannot import '%s': alternate "
721 		    "root '%s' must be a complete path"), thename,
722 		    altroot);
723 		return (-1);
724 	}
725 
726 	(void) strlcpy(zc.zc_name, thename, sizeof (zc.zc_name));
727 
728 	if (altroot != NULL)
729 		(void) strlcpy(zc.zc_root, altroot, sizeof (zc.zc_root));
730 	else
731 		zc.zc_root[0] = '\0';
732 
733 	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
734 	    &zc.zc_guid) == 0);
735 
736 	verify(nvlist_size(config, &len, NV_ENCODE_NATIVE) == 0);
737 
738 	packed = zfs_malloc(len);
739 
740 	verify(nvlist_pack(config, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
741 
742 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
743 	zc.zc_config_src_size = len;
744 
745 	ret = 0;
746 	if (zfs_ioctl(ZFS_IOC_POOL_IMPORT, &zc) != 0) {
747 		char desc[1024];
748 		if (newname == NULL)
749 			(void) snprintf(desc, sizeof (desc),
750 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
751 			    thename);
752 		else
753 			(void) snprintf(desc, sizeof (desc),
754 			    dgettext(TEXT_DOMAIN, "cannot import '%s' as '%s'"),
755 			    origname, thename);
756 
757 		switch (errno) {
758 		case EEXIST:
759 			/*
760 			 * A pool with that name already exists.
761 			 */
762 			zfs_error(dgettext(TEXT_DOMAIN, "%s: pool exists"),
763 			    desc);
764 			break;
765 
766 		case EPERM:
767 			/*
768 			 * The user doesn't have permission to create pools.
769 			 */
770 			zfs_error(dgettext(TEXT_DOMAIN, "%s: permission "
771 			    "denied"), desc);
772 			break;
773 
774 		case ENXIO:
775 		case EDOM:
776 			/*
777 			 * Device is unavailable, or vdev sum didn't match.
778 			 */
779 			zfs_error(dgettext(TEXT_DOMAIN, "%s: one or more "
780 			    "devices is unavailable"),
781 			    desc);
782 			break;
783 
784 		case ENOTSUP:
785 			/*
786 			 * Unsupported version.
787 			 */
788 			zfs_error(dgettext(TEXT_DOMAIN,
789 			    "%s: unsupported version"), desc);
790 			break;
791 
792 		default:
793 			zfs_baderror(errno);
794 		}
795 
796 		ret = -1;
797 	} else {
798 		zpool_handle_t *zhp;
799 		/*
800 		 * This should never fail, but play it safe anyway.
801 		 */
802 		if ((zhp = zpool_open_silent(thename)) != NULL) {
803 			ret = zpool_create_zvol_links(zhp);
804 			zpool_close(zhp);
805 		}
806 	}
807 
808 	free(packed);
809 	return (ret);
810 }
811 
812 /*
813  * Scrub the pool.
814  */
815 int
816 zpool_scrub(zpool_handle_t *zhp, pool_scrub_type_t type)
817 {
818 	zfs_cmd_t zc = { 0 };
819 	char msg[1024];
820 
821 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
822 	zc.zc_cookie = type;
823 
824 	if (zfs_ioctl(ZFS_IOC_POOL_SCRUB, &zc) == 0)
825 		return (0);
826 
827 	(void) snprintf(msg, sizeof (msg),
828 	    dgettext(TEXT_DOMAIN, "cannot scrub %s"), zc.zc_name);
829 
830 	switch (errno) {
831 	    case EPERM:
832 		/*
833 		 * No permission to scrub this pool.
834 		 */
835 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
836 		break;
837 
838 	    case EBUSY:
839 		/*
840 		 * Resilver in progress.
841 		 */
842 		zfs_error(dgettext(TEXT_DOMAIN, "%s: currently resilvering"),
843 		    msg);
844 		break;
845 
846 	    default:
847 		zfs_baderror(errno);
848 	}
849 	return (-1);
850 }
851 
852 static uint64_t
853 vdev_to_guid(nvlist_t *nv, const char *search, uint64_t guid)
854 {
855 	uint_t c, children;
856 	nvlist_t **child;
857 	uint64_t ret, present;
858 	char *path;
859 	uint64_t wholedisk = 0;
860 
861 	verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &ret) == 0);
862 
863 	if (search == NULL &&
864 	    nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &present) == 0) {
865 		/*
866 		 * If the device has never been present since import, the only
867 		 * reliable way to match the vdev is by GUID.
868 		 */
869 		if (ret == guid)
870 			return (ret);
871 	} else if (search != NULL &&
872 	    nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
873 		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
874 		    &wholedisk);
875 		if (wholedisk) {
876 			/*
877 			 * For whole disks, the internal path has 's0', but the
878 			 * path passed in by the user doesn't.
879 			 */
880 			if (strlen(search) == strlen(path) - 2 &&
881 			    strncmp(search, path, strlen(search)) == 0)
882 				return (ret);
883 		} else if (strcmp(search, path) == 0) {
884 			return (ret);
885 		}
886 	}
887 
888 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
889 	    &child, &children) != 0)
890 		return (0);
891 
892 	for (c = 0; c < children; c++)
893 		if ((ret = vdev_to_guid(child[c], search, guid)) != 0)
894 			return (ret);
895 
896 	return (0);
897 }
898 
899 /*
900  * Given a string describing a vdev, returns the matching GUID, or 0 if none.
901  */
902 uint64_t
903 zpool_vdev_to_guid(zpool_handle_t *zhp, const char *path)
904 {
905 	char buf[MAXPATHLEN];
906 	const char *search;
907 	char *end;
908 	nvlist_t *nvroot;
909 	uint64_t guid;
910 
911 	guid = strtoull(path, &end, 10);
912 	if (guid != 0 && *end == '\0') {
913 		search = NULL;
914 	} else if (path[0] != '/') {
915 		(void) snprintf(buf, sizeof (buf), "%s%s", "/dev/dsk/", path);
916 		search = buf;
917 	} else {
918 		search = path;
919 	}
920 
921 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
922 	    &nvroot) == 0);
923 
924 	return (vdev_to_guid(nvroot, search, guid));
925 }
926 
927 /*
928  * Bring the specified vdev online
929  */
930 int
931 zpool_vdev_online(zpool_handle_t *zhp, const char *path)
932 {
933 	zfs_cmd_t zc = { 0 };
934 	char msg[1024];
935 
936 	(void) snprintf(msg, sizeof (msg),
937 	    dgettext(TEXT_DOMAIN, "cannot online %s"), path);
938 
939 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
940 	if ((zc.zc_guid = zpool_vdev_to_guid(zhp, path)) == 0) {
941 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no such device in pool"),
942 		    msg);
943 		return (-1);
944 	}
945 
946 	if (zfs_ioctl(ZFS_IOC_VDEV_ONLINE, &zc) == 0)
947 		return (0);
948 
949 	switch (errno) {
950 	    case ENODEV:
951 		/*
952 		 * Device doesn't exist
953 		 */
954 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
955 		break;
956 
957 	    case EPERM:
958 		/*
959 		 * No permission to bring this vdev online.
960 		 */
961 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
962 		break;
963 
964 	    default:
965 		zfs_baderror(errno);
966 	}
967 	return (-1);
968 }
969 
970 /*
971  * Take the specified vdev offline
972  */
973 int
974 zpool_vdev_offline(zpool_handle_t *zhp, const char *path, int istmp)
975 {
976 	zfs_cmd_t zc = { 0 };
977 	char msg[1024];
978 
979 	(void) snprintf(msg, sizeof (msg),
980 	    dgettext(TEXT_DOMAIN, "cannot offline %s"), path);
981 
982 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
983 	if ((zc.zc_guid = zpool_vdev_to_guid(zhp, path)) == 0) {
984 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no such device in pool"),
985 		    msg);
986 		return (-1);
987 	}
988 
989 	zc.zc_cookie = istmp;
990 
991 	if (zfs_ioctl(ZFS_IOC_VDEV_OFFLINE, &zc) == 0)
992 		return (0);
993 
994 	switch (errno) {
995 	    case ENODEV:
996 		/*
997 		 * Device doesn't exist
998 		 */
999 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
1000 		break;
1001 
1002 	    case EPERM:
1003 		/*
1004 		 * No permission to take this vdev offline.
1005 		 */
1006 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
1007 		break;
1008 
1009 	    case EBUSY:
1010 		/*
1011 		 * There are no other replicas of this device.
1012 		 */
1013 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no valid replicas"), msg);
1014 		break;
1015 
1016 	    default:
1017 		zfs_baderror(errno);
1018 	}
1019 	return (-1);
1020 }
1021 
1022 /*
1023  * Attach new_disk (fully described by nvroot) to old_disk.
1024  * If 'replacing' is specified, tne new disk will replace the old one.
1025  */
1026 int
1027 zpool_vdev_attach(zpool_handle_t *zhp,
1028     const char *old_disk, const char *new_disk, nvlist_t *nvroot, int replacing)
1029 {
1030 	zfs_cmd_t zc = { 0 };
1031 	char msg[1024];
1032 	char *packed;
1033 	int ret;
1034 	size_t len;
1035 
1036 	if (replacing)
1037 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
1038 		    "cannot replace %s with %s"), old_disk, new_disk);
1039 	else
1040 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
1041 		    "cannot attach %s to %s"), new_disk, old_disk);
1042 
1043 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1044 	if ((zc.zc_guid = zpool_vdev_to_guid(zhp, old_disk)) == 0) {
1045 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no such device in pool"),
1046 		    msg);
1047 		return (-1);
1048 	}
1049 	zc.zc_cookie = replacing;
1050 
1051 	verify(nvlist_size(nvroot, &len, NV_ENCODE_NATIVE) == 0);
1052 
1053 	packed = zfs_malloc(len);
1054 
1055 	verify(nvlist_pack(nvroot, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
1056 
1057 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
1058 	zc.zc_config_src_size = len;
1059 
1060 	ret = zfs_ioctl(ZFS_IOC_VDEV_ATTACH, &zc);
1061 
1062 	free(packed);
1063 
1064 	if (ret == 0)
1065 		return (0);
1066 
1067 	switch (errno) {
1068 	case EPERM:
1069 		/*
1070 		 * No permission to mess with the config.
1071 		 */
1072 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
1073 		break;
1074 
1075 	case ENODEV:
1076 		/*
1077 		 * Device doesn't exist.
1078 		 */
1079 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s not in pool"),
1080 		    msg, old_disk);
1081 		break;
1082 
1083 	case ENOTSUP:
1084 		/*
1085 		 * Can't attach to or replace this type of vdev.
1086 		 */
1087 		if (replacing)
1088 			zfs_error(dgettext(TEXT_DOMAIN,
1089 			    "%s: cannot replace a replacing device"), msg);
1090 		else
1091 			zfs_error(dgettext(TEXT_DOMAIN,
1092 			    "%s: attach is only applicable to mirrors"), msg);
1093 		break;
1094 
1095 	case EINVAL:
1096 		/*
1097 		 * The new device must be a single disk.
1098 		 */
1099 		zfs_error(dgettext(TEXT_DOMAIN,
1100 		    "%s: <new_device> must be a single disk"), msg);
1101 		break;
1102 
1103 	case ENXIO:
1104 		/*
1105 		 * This is unlikely to happen since we've verified that
1106 		 * all the devices can be opened from userland, but it's
1107 		 * still possible in some circumstances.
1108 		 */
1109 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s is unavailable"),
1110 		    msg, new_disk);
1111 		break;
1112 
1113 	case EBUSY:
1114 		/*
1115 		 * The new device is is use.
1116 		 */
1117 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s busy"), msg, new_disk);
1118 		break;
1119 
1120 	case EOVERFLOW:
1121 		/*
1122 		 * The new device is too small.
1123 		 */
1124 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s is too small"),
1125 		    msg, new_disk);
1126 		break;
1127 
1128 	case EDOM:
1129 		/*
1130 		 * The new device has a different alignment requirement.
1131 		 */
1132 		zfs_error(dgettext(TEXT_DOMAIN,
1133 		    "%s: devices have different sector alignment"), msg);
1134 		break;
1135 
1136 	case ENAMETOOLONG:
1137 		/*
1138 		 * The resulting top-level vdev spec won't fit in the label.
1139 		 */
1140 		zfs_error(dgettext(TEXT_DOMAIN,
1141 		    "%s: too many devices in a single vdev"), msg);
1142 		break;
1143 
1144 	default:
1145 		zfs_baderror(errno);
1146 	}
1147 
1148 	return (1);
1149 }
1150 
1151 /*
1152  * Detach the specified device.
1153  */
1154 int
1155 zpool_vdev_detach(zpool_handle_t *zhp, const char *path)
1156 {
1157 	zfs_cmd_t zc = { 0 };
1158 	char msg[1024];
1159 
1160 	(void) snprintf(msg, sizeof (msg),
1161 	    dgettext(TEXT_DOMAIN, "cannot detach %s"), path);
1162 
1163 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1164 	if ((zc.zc_guid = zpool_vdev_to_guid(zhp, path)) == 0) {
1165 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no such device in pool"),
1166 		    msg);
1167 		return (-1);
1168 	}
1169 
1170 	if (zfs_ioctl(ZFS_IOC_VDEV_DETACH, &zc) == 0)
1171 		return (0);
1172 
1173 	switch (errno) {
1174 	case EPERM:
1175 		/*
1176 		 * No permission to mess with the config.
1177 		 */
1178 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
1179 		break;
1180 
1181 	case ENODEV:
1182 		/*
1183 		 * Device doesn't exist.
1184 		 */
1185 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
1186 		break;
1187 
1188 	case ENOTSUP:
1189 		/*
1190 		 * Can't detach from this type of vdev.
1191 		 */
1192 		zfs_error(dgettext(TEXT_DOMAIN,
1193 		    "%s: only applicable to mirror and replacing vdevs"), msg);
1194 		break;
1195 
1196 	case EBUSY:
1197 		/*
1198 		 * There are no other replicas of this device.
1199 		 */
1200 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no valid replicas"), msg);
1201 		break;
1202 
1203 	default:
1204 		zfs_baderror(errno);
1205 	}
1206 
1207 	return (1);
1208 }
1209 
1210 /*
1211  * Clear the errors for the pool, or the particular device if specified.
1212  */
1213 int
1214 zpool_clear(zpool_handle_t *zhp, const char *path)
1215 {
1216 	zfs_cmd_t zc = { 0 };
1217 	char msg[1024];
1218 
1219 	if (path)
1220 		(void) snprintf(msg, sizeof (msg),
1221 		    dgettext(TEXT_DOMAIN, "cannot clear errors for %s"),
1222 		    zc.zc_prop_value);
1223 	else
1224 		(void) snprintf(msg, sizeof (msg),
1225 		    dgettext(TEXT_DOMAIN, "cannot clear errors for %s"),
1226 		    zhp->zpool_name);
1227 
1228 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1229 	if (path && (zc.zc_guid = zpool_vdev_to_guid(zhp, path)) == 0) {
1230 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no such device in pool"),
1231 		    msg);
1232 		return (-1);
1233 	}
1234 
1235 	if (zfs_ioctl(ZFS_IOC_CLEAR, &zc) == 0)
1236 		return (0);
1237 
1238 	switch (errno) {
1239 	case EPERM:
1240 		/*
1241 		 * No permission to mess with the config.
1242 		 */
1243 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
1244 		break;
1245 
1246 	case ENODEV:
1247 		/*
1248 		 * Device doesn't exist.
1249 		 */
1250 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
1251 		break;
1252 
1253 	default:
1254 		zfs_baderror(errno);
1255 	}
1256 
1257 	return (1);
1258 }
1259 
1260 static int
1261 do_zvol(zfs_handle_t *zhp, void *data)
1262 {
1263 	int linktype = (int)(uintptr_t)data;
1264 	int ret;
1265 
1266 	/*
1267 	 * We check for volblocksize intead of ZFS_TYPE_VOLUME so that we
1268 	 * correctly handle snapshots of volumes.
1269 	 */
1270 	if (zhp->zfs_volblocksize != 0) {
1271 		if (linktype)
1272 			ret = zvol_create_link(zhp->zfs_name);
1273 		else
1274 			ret = zvol_remove_link(zhp->zfs_name);
1275 	}
1276 
1277 	ret = zfs_iter_children(zhp, do_zvol, data);
1278 
1279 	zfs_close(zhp);
1280 	return (ret);
1281 }
1282 
1283 /*
1284  * Iterate over all zvols in the pool and make any necessary minor nodes.
1285  */
1286 int
1287 zpool_create_zvol_links(zpool_handle_t *zhp)
1288 {
1289 	zfs_handle_t *zfp;
1290 	int ret;
1291 
1292 	/*
1293 	 * If the pool is unavailable, just return success.
1294 	 */
1295 	if ((zfp = make_dataset_handle(zhp->zpool_name)) == NULL)
1296 		return (0);
1297 
1298 	ret = zfs_iter_children(zfp, do_zvol, (void *)TRUE);
1299 
1300 	zfs_close(zfp);
1301 	return (ret);
1302 }
1303 
1304 /*
1305  * Iterate over all zvols in the poool and remove any minor nodes.
1306  */
1307 int
1308 zpool_remove_zvol_links(zpool_handle_t *zhp)
1309 {
1310 	zfs_handle_t *zfp;
1311 	int ret;
1312 
1313 	/*
1314 	 * If the pool is unavailable, just return success.
1315 	 */
1316 	if ((zfp = make_dataset_handle(zhp->zpool_name)) == NULL)
1317 		return (0);
1318 
1319 	ret = zfs_iter_children(zfp, do_zvol, (void *)FALSE);
1320 
1321 	zfs_close(zfp);
1322 	return (ret);
1323 }
1324 
1325 /*
1326  * Convert from a devid string to a path.
1327  */
1328 static char *
1329 devid_to_path(char *devid_str)
1330 {
1331 	ddi_devid_t devid;
1332 	char *minor;
1333 	char *path;
1334 	devid_nmlist_t *list = NULL;
1335 	int ret;
1336 
1337 	if (devid_str_decode(devid_str, &devid, &minor) != 0)
1338 		return (NULL);
1339 
1340 	ret = devid_deviceid_to_nmlist("/dev", devid, minor, &list);
1341 
1342 	devid_str_free(minor);
1343 	devid_free(devid);
1344 
1345 	if (ret != 0)
1346 		return (NULL);
1347 
1348 	path = zfs_strdup(list[0].devname);
1349 	devid_free_nmlist(list);
1350 
1351 	return (path);
1352 }
1353 
1354 /*
1355  * Convert from a path to a devid string.
1356  */
1357 static char *
1358 path_to_devid(const char *path)
1359 {
1360 	int fd;
1361 	ddi_devid_t devid;
1362 	char *minor, *ret;
1363 
1364 	if ((fd = open(path, O_RDONLY)) < 0)
1365 		return (NULL);
1366 
1367 	minor = NULL;
1368 	ret = NULL;
1369 	if (devid_get(fd, &devid) == 0) {
1370 		if (devid_get_minor_name(fd, &minor) == 0)
1371 			ret = devid_str_encode(devid, minor);
1372 		if (minor != NULL)
1373 			devid_str_free(minor);
1374 		devid_free(devid);
1375 	}
1376 	(void) close(fd);
1377 
1378 	return (ret);
1379 }
1380 
1381 /*
1382  * Issue the necessary ioctl() to update the stored path value for the vdev.  We
1383  * ignore any failure here, since a common case is for an unprivileged user to
1384  * type 'zpool status', and we'll display the correct information anyway.
1385  */
1386 static void
1387 set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path)
1388 {
1389 	zfs_cmd_t zc = { 0 };
1390 
1391 	(void) strncpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1392 	(void) strncpy(zc.zc_prop_value, path, sizeof (zc.zc_prop_value));
1393 	verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
1394 	    &zc.zc_guid) == 0);
1395 
1396 	(void) zfs_ioctl(ZFS_IOC_VDEV_SETPATH, &zc);
1397 }
1398 
1399 /*
1400  * Given a vdev, return the name to display in iostat.  If the vdev has a path,
1401  * we use that, stripping off any leading "/dev/dsk/"; if not, we use the type.
1402  * We also check if this is a whole disk, in which case we strip off the
1403  * trailing 's0' slice name.
1404  *
1405  * This routine is also responsible for identifying when disks have been
1406  * reconfigured in a new location.  The kernel will have opened the device by
1407  * devid, but the path will still refer to the old location.  To catch this, we
1408  * first do a path -> devid translation (which is fast for the common case).  If
1409  * the devid matches, we're done.  If not, we do a reverse devid -> path
1410  * translation and issue the appropriate ioctl() to update the path of the vdev.
1411  * If 'zhp' is NULL, then this is an exported pool, and we don't need to do any
1412  * of these checks.
1413  */
1414 char *
1415 zpool_vdev_name(zpool_handle_t *zhp, nvlist_t *nv)
1416 {
1417 	char *path, *devid;
1418 	uint64_t value;
1419 	char buf[64];
1420 
1421 	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
1422 	    &value) == 0) {
1423 		verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
1424 		    &value) == 0);
1425 		(void) snprintf(buf, sizeof (buf), "%llu", value);
1426 		path = buf;
1427 	} else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
1428 
1429 		if (zhp != NULL &&
1430 		    nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
1431 			/*
1432 			 * Determine if the current path is correct.
1433 			 */
1434 			char *newdevid = path_to_devid(path);
1435 
1436 			if (newdevid == NULL ||
1437 			    strcmp(devid, newdevid) != 0) {
1438 				char *newpath;
1439 
1440 				if ((newpath = devid_to_path(devid)) != NULL) {
1441 					/*
1442 					 * Update the path appropriately.
1443 					 */
1444 					set_path(zhp, nv, newpath);
1445 					verify(nvlist_add_string(nv,
1446 					    ZPOOL_CONFIG_PATH, newpath) == 0);
1447 					free(newpath);
1448 					verify(nvlist_lookup_string(nv,
1449 					    ZPOOL_CONFIG_PATH, &path) == 0);
1450 				}
1451 
1452 				if (newdevid)
1453 					devid_str_free(newdevid);
1454 			}
1455 
1456 		}
1457 
1458 		if (strncmp(path, "/dev/dsk/", 9) == 0)
1459 			path += 9;
1460 
1461 		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
1462 		    &value) == 0 && value) {
1463 			char *tmp = zfs_strdup(path);
1464 			tmp[strlen(path) - 2] = '\0';
1465 			return (tmp);
1466 		}
1467 	} else {
1468 		verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &path) == 0);
1469 	}
1470 
1471 	return (zfs_strdup(path));
1472 }
1473 
1474 static int
1475 zbookmark_compare(const void *a, const void *b)
1476 {
1477 	return (memcmp(a, b, sizeof (zbookmark_t)));
1478 }
1479 
1480 /*
1481  * Retrieve the persistent error log, uniquify the members, and return to the
1482  * caller.
1483  */
1484 int
1485 zpool_get_errlog(zpool_handle_t *zhp, nvlist_t ***list, size_t *nelem)
1486 {
1487 	zfs_cmd_t zc = { 0 };
1488 	uint64_t count;
1489 	zbookmark_t *zb;
1490 	int i, j;
1491 
1492 	if (zhp->zpool_error_log != NULL) {
1493 		*list = zhp->zpool_error_log;
1494 		*nelem = zhp->zpool_error_count;
1495 		return (0);
1496 	}
1497 
1498 	/*
1499 	 * Retrieve the raw error list from the kernel.  If the number of errors
1500 	 * has increased, allocate more space and continue until we get the
1501 	 * entire list.
1502 	 */
1503 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_ERRCOUNT,
1504 	    &count) == 0);
1505 	zc.zc_config_dst = (uintptr_t)zfs_malloc(count * sizeof (zbookmark_t));
1506 	zc.zc_config_dst_size = count;
1507 	(void) strcpy(zc.zc_name, zhp->zpool_name);
1508 	for (;;) {
1509 		if (zfs_ioctl(ZFS_IOC_ERROR_LOG, &zc) != 0) {
1510 			if (errno == ENOMEM) {
1511 				free((void *)(uintptr_t)zc.zc_config_dst);
1512 				zc.zc_config_dst = (uintptr_t)
1513 				    zfs_malloc(zc.zc_config_dst_size);
1514 			} else {
1515 				return (-1);
1516 			}
1517 		} else {
1518 			break;
1519 		}
1520 	}
1521 
1522 	/*
1523 	 * Sort the resulting bookmarks.  This is a little confusing due to the
1524 	 * implementation of ZFS_IOC_ERROR_LOG.  The bookmarks are copied last
1525 	 * to first, and 'zc_config_dst_size' indicates the number of boomarks
1526 	 * _not_ copied as part of the process.  So we point the start of our
1527 	 * array appropriate and decrement the total number of elements.
1528 	 */
1529 	zb = ((zbookmark_t *)(uintptr_t)zc.zc_config_dst) +
1530 	    zc.zc_config_dst_size;
1531 	count -= zc.zc_config_dst_size;
1532 
1533 	qsort(zb, count, sizeof (zbookmark_t), zbookmark_compare);
1534 
1535 	/*
1536 	 * Count the number of unique elements
1537 	 */
1538 	j = 0;
1539 	for (i = 0; i < count; i++) {
1540 		if (i > 0 && memcmp(&zb[i - 1], &zb[i],
1541 		    sizeof (zbookmark_t)) == 0)
1542 			continue;
1543 		j++;
1544 	}
1545 
1546 	/*
1547 	 * If the user has only requested the number of items, return it now
1548 	 * without bothering with the extra work.
1549 	 */
1550 	if (list == NULL) {
1551 		*nelem = j;
1552 		return (0);
1553 	}
1554 
1555 	zhp->zpool_error_count = j;
1556 
1557 	/*
1558 	 * Allocate an array of nvlists to hold the results
1559 	 */
1560 	zhp->zpool_error_log = zfs_malloc(j * sizeof (nvlist_t *));
1561 
1562 	/*
1563 	 * Fill in the results with names from the kernel.
1564 	 */
1565 	j = 0;
1566 	for (i = 0; i < count; i++) {
1567 		char buf[64];
1568 		nvlist_t *nv;
1569 
1570 		if (i > 0 && memcmp(&zb[i - 1], &zb[i],
1571 		    sizeof (zbookmark_t)) == 0)
1572 			continue;
1573 
1574 		verify(nvlist_alloc(&nv, NV_UNIQUE_NAME,
1575 		    0) == 0);
1576 		zhp->zpool_error_log[j] = nv;
1577 
1578 		zc.zc_bookmark = zb[i];
1579 		if (zfs_ioctl(ZFS_IOC_BOOKMARK_NAME, &zc) == 0) {
1580 			verify(nvlist_add_string(nv, ZPOOL_ERR_DATASET,
1581 			    zc.zc_prop_name) == 0);
1582 			verify(nvlist_add_string(nv, ZPOOL_ERR_OBJECT,
1583 			    zc.zc_prop_value) == 0);
1584 			verify(nvlist_add_string(nv, ZPOOL_ERR_RANGE,
1585 			    zc.zc_filename) == 0);
1586 		} else {
1587 			(void) snprintf(buf, sizeof (buf), "%llx",
1588 			    zb[i].zb_objset);
1589 			verify(nvlist_add_string(nv,
1590 			    ZPOOL_ERR_DATASET, buf) == 0);
1591 			(void) snprintf(buf, sizeof (buf), "%llx",
1592 			    zb[i].zb_object);
1593 			verify(nvlist_add_string(nv, ZPOOL_ERR_OBJECT,
1594 			    buf) == 0);
1595 			(void) snprintf(buf, sizeof (buf), "lvl=%u blkid=%llu",
1596 			    (int)zb[i].zb_level, (long long)zb[i].zb_blkid);
1597 			verify(nvlist_add_string(nv, ZPOOL_ERR_RANGE,
1598 			    buf) == 0);
1599 		}
1600 
1601 		j++;
1602 	}
1603 
1604 	*list = zhp->zpool_error_log;
1605 	*nelem = zhp->zpool_error_count;
1606 
1607 	free((void *)(uintptr_t)zc.zc_config_dst);
1608 
1609 	return (0);
1610 }
1611 
1612 /*
1613  * Upgrade a ZFS pool to the latest on-disk version.
1614  */
1615 int
1616 zpool_upgrade(zpool_handle_t *zhp)
1617 {
1618 	zfs_cmd_t zc = { 0 };
1619 
1620 	(void) strcpy(zc.zc_name, zhp->zpool_name);
1621 	if (zfs_ioctl(ZFS_IOC_POOL_UPGRADE, &zc) != 0) {
1622 		switch (errno) {
1623 		case EPERM:
1624 			zfs_error(dgettext(TEXT_DOMAIN, "cannot upgrade '%s': "
1625 			    "permission denied"), zhp->zpool_name);
1626 			break;
1627 		default:
1628 			zfs_baderror(errno);
1629 		}
1630 
1631 		return (-1);
1632 	}
1633 
1634 	return (0);
1635 }
1636