xref: /illumos-gate/usr/src/lib/libzfs/common/libzfs_pool.c (revision b81d61a68b235e0529ebadc18e14d9d1dd52a258)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 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 <assert.h>
30 #include <ctype.h>
31 #include <errno.h>
32 #include <devid.h>
33 #include <fcntl.h>
34 #include <libintl.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <unistd.h>
39 #include <sys/zfs_ioctl.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, char *buf, size_t buflen)
50 {
51 	namecheck_err_t why;
52 	char what;
53 
54 	if (pool_namecheck(pool, &why, &what) != 0) {
55 		if (buf != NULL) {
56 			switch (why) {
57 			case NAME_ERR_TOOLONG:
58 				(void) snprintf(buf, buflen,
59 				    dgettext(TEXT_DOMAIN, "name is too long"));
60 				break;
61 
62 			case NAME_ERR_INVALCHAR:
63 				(void) snprintf(buf, buflen,
64 				    dgettext(TEXT_DOMAIN, "invalid character "
65 				    "'%c' in pool name"), what);
66 				break;
67 
68 			case NAME_ERR_NOLETTER:
69 				(void) strlcpy(buf, dgettext(TEXT_DOMAIN,
70 				    "name must begin with a letter"), buflen);
71 				break;
72 
73 			case NAME_ERR_RESERVED:
74 				(void) strlcpy(buf, dgettext(TEXT_DOMAIN,
75 				    "name is reserved\n"
76 				    "pool name may have been omitted"), buflen);
77 				break;
78 
79 			case NAME_ERR_DISKLIKE:
80 				(void) strlcpy(buf, dgettext(TEXT_DOMAIN,
81 				    "pool name is reserved\n"
82 				    "pool name may have been omitted"), buflen);
83 				break;
84 			}
85 		}
86 		return (FALSE);
87 	}
88 
89 	return (TRUE);
90 }
91 
92 /*
93  * Set the pool-wide health based on the vdev state of the root vdev.
94  */
95 void
96 set_pool_health(nvlist_t *config)
97 {
98 	nvlist_t *nvroot;
99 	vdev_stat_t *vs;
100 	uint_t vsc;
101 	char *health;
102 
103 	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
104 	    &nvroot) == 0);
105 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
106 	    (uint64_t **)&vs, &vsc) == 0);
107 
108 	switch (vs->vs_state) {
109 
110 	case VDEV_STATE_CLOSED:
111 	case VDEV_STATE_CANT_OPEN:
112 	case VDEV_STATE_OFFLINE:
113 		health = dgettext(TEXT_DOMAIN, "FAULTED");
114 		break;
115 
116 	case VDEV_STATE_DEGRADED:
117 		health = dgettext(TEXT_DOMAIN, "DEGRADED");
118 		break;
119 
120 	case VDEV_STATE_HEALTHY:
121 		health = dgettext(TEXT_DOMAIN, "ONLINE");
122 		break;
123 
124 	default:
125 		zfs_baderror(vs->vs_state);
126 	}
127 
128 	verify(nvlist_add_string(config, ZPOOL_CONFIG_POOL_HEALTH,
129 	    health) == 0);
130 }
131 
132 /*
133  * Open a handle to the given pool, even if the pool is currently in the FAULTED
134  * state.
135  */
136 zpool_handle_t *
137 zpool_open_canfail(const char *pool)
138 {
139 	zpool_handle_t *zhp;
140 	int error;
141 
142 	/*
143 	 * Make sure the pool name is valid.
144 	 */
145 	if (!zpool_name_valid(pool, NULL, 0)) {
146 		zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': invalid "
147 		    "pool name"), pool);
148 		return (NULL);
149 	}
150 
151 	zhp = zfs_malloc(sizeof (zpool_handle_t));
152 
153 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
154 
155 	if ((error = zpool_refresh_stats(zhp)) != 0) {
156 		if (error == ENOENT || error == EINVAL) {
157 			zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': no "
158 			    "such pool"), pool);
159 			free(zhp);
160 			return (NULL);
161 		} else {
162 			zhp->zpool_state = POOL_STATE_UNAVAIL;
163 		}
164 	} else {
165 		zhp->zpool_state = POOL_STATE_ACTIVE;
166 	}
167 
168 	return (zhp);
169 }
170 
171 /*
172  * Like the above, but silent on error.  Used when iterating over pools (because
173  * the configuration cache may be out of date).
174  */
175 zpool_handle_t *
176 zpool_open_silent(const char *pool)
177 {
178 	zpool_handle_t *zhp;
179 	int error;
180 
181 	zhp = zfs_malloc(sizeof (zpool_handle_t));
182 
183 	(void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name));
184 
185 	if ((error = zpool_refresh_stats(zhp)) != 0) {
186 		if (error == ENOENT || error == EINVAL) {
187 			free(zhp);
188 			return (NULL);
189 		} else {
190 			zhp->zpool_state = POOL_STATE_UNAVAIL;
191 		}
192 	} else {
193 		zhp->zpool_state = POOL_STATE_ACTIVE;
194 	}
195 
196 	return (zhp);
197 }
198 
199 /*
200  * Similar to zpool_open_canfail(), but refuses to open pools in the faulted
201  * state.
202  */
203 zpool_handle_t *
204 zpool_open(const char *pool)
205 {
206 	zpool_handle_t *zhp;
207 
208 	if ((zhp = zpool_open_canfail(pool)) == NULL)
209 		return (NULL);
210 
211 	if (zhp->zpool_state == POOL_STATE_UNAVAIL) {
212 		zfs_error(dgettext(TEXT_DOMAIN, "cannot open ' %s': pool is "
213 		    "currently unavailable\n"), zhp->zpool_name);
214 		zfs_error(dgettext(TEXT_DOMAIN, "run 'zpool status -v %s' for "
215 		    "detailed information\n"), zhp->zpool_name);
216 		zpool_close(zhp);
217 		return (NULL);
218 	}
219 
220 	return (zhp);
221 }
222 
223 /*
224  * Close the handle.  Simply frees the memory associated with the handle.
225  */
226 void
227 zpool_close(zpool_handle_t *zhp)
228 {
229 	if (zhp->zpool_config)
230 		nvlist_free(zhp->zpool_config);
231 	if (zhp->zpool_old_config)
232 		nvlist_free(zhp->zpool_old_config);
233 	free(zhp);
234 }
235 
236 /*
237  * Return the name of the pool.
238  */
239 const char *
240 zpool_get_name(zpool_handle_t *zhp)
241 {
242 	return (zhp->zpool_name);
243 }
244 
245 /*
246  * Return the GUID of the pool.
247  */
248 uint64_t
249 zpool_get_guid(zpool_handle_t *zhp)
250 {
251 	uint64_t guid;
252 
253 	verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_POOL_GUID,
254 	    &guid) == 0);
255 	return (guid);
256 }
257 
258 /*
259  * Return the amount of space currently consumed by the pool.
260  */
261 uint64_t
262 zpool_get_space_used(zpool_handle_t *zhp)
263 {
264 	nvlist_t *nvroot;
265 	vdev_stat_t *vs;
266 	uint_t vsc;
267 
268 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
269 	    &nvroot) == 0);
270 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
271 	    (uint64_t **)&vs, &vsc) == 0);
272 
273 	return (vs->vs_alloc);
274 }
275 
276 /*
277  * Return the total space in the pool.
278  */
279 uint64_t
280 zpool_get_space_total(zpool_handle_t *zhp)
281 {
282 	nvlist_t *nvroot;
283 	vdev_stat_t *vs;
284 	uint_t vsc;
285 
286 	verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE,
287 	    &nvroot) == 0);
288 	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
289 	    (uint64_t **)&vs, &vsc) == 0);
290 
291 	return (vs->vs_space);
292 }
293 
294 /*
295  * Return the alternate root for this pool, if any.
296  */
297 int
298 zpool_get_root(zpool_handle_t *zhp, char *buf, size_t buflen)
299 {
300 	zfs_cmd_t zc = { 0 };
301 
302 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
303 	if (ioctl(zfs_fd, ZFS_IOC_OBJSET_STATS, &zc) != 0 ||
304 	    zc.zc_objset_stats.dds_altroot[0] == '\0')
305 		return (-1);
306 
307 	(void) strlcpy(buf, zc.zc_objset_stats.dds_altroot, buflen);
308 
309 	return (0);
310 }
311 
312 /*
313  * Return the state of the pool (ACTIVE or UNAVAILABLE)
314  */
315 int
316 zpool_get_state(zpool_handle_t *zhp)
317 {
318 	return (zhp->zpool_state);
319 }
320 
321 /*
322  * Create the named pool, using the provided vdev list.  It is assumed
323  * that the consumer has already validated the contents of the nvlist, so we
324  * don't have to worry about error semantics.
325  */
326 int
327 zpool_create(const char *pool, nvlist_t *nvroot, const char *altroot)
328 {
329 	zfs_cmd_t zc = { 0 };
330 	char *packed;
331 	size_t len;
332 	int err;
333 	char reason[64];
334 
335 	if (!zpool_name_valid(pool, reason, sizeof (reason))) {
336 		zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': %s"),
337 		    pool, reason);
338 		return (-1);
339 	}
340 
341 	if (altroot != NULL && altroot[0] != '/') {
342 		zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': alternate "
343 		    "root '%s' must be a complete path"), pool, altroot);
344 		return (-1);
345 	}
346 
347 	if ((err = nvlist_size(nvroot, &len, NV_ENCODE_NATIVE)) != 0)
348 		zfs_baderror(err);
349 
350 	packed = zfs_malloc(len);
351 
352 	if ((err = nvlist_pack(nvroot, &packed, &len,
353 	    NV_ENCODE_NATIVE, 0)) != 0)
354 		zfs_baderror(err);
355 
356 	(void) strlcpy(zc.zc_name, pool, sizeof (zc.zc_name));
357 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
358 	zc.zc_config_src_size = len;
359 
360 	if (altroot != NULL)
361 		(void) strlcpy(zc.zc_root, altroot, sizeof (zc.zc_root));
362 
363 	if (ioctl(zfs_fd, ZFS_IOC_POOL_CREATE, &zc) != 0) {
364 		switch (errno) {
365 		case EEXIST:
366 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
367 			    "pool exists"), pool);
368 			break;
369 
370 		case EPERM:
371 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
372 			    "permission denied"), pool);
373 			break;
374 
375 		case EBUSY:
376 			/*
377 			 * This can happen if the user has specified the same
378 			 * device multiple times.  We can't reliably detect this
379 			 * until we try to add it and see we already have a
380 			 * label.
381 			 */
382 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
383 			    "one or more vdevs refer to the same device"),
384 			    pool);
385 			break;
386 
387 		case EOVERFLOW:
388 			/*
389 			 * This occurrs when one of the devices is below
390 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
391 			 * device was the problem device since there's no
392 			 * reliable way to determine device size from userland.
393 			 */
394 			{
395 				char buf[64];
396 
397 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
398 
399 				zfs_error(dgettext(TEXT_DOMAIN, "cannot "
400 				    "create '%s': one or more devices is less "
401 				    "than the minimum size (%s)"), pool,
402 				    buf);
403 			}
404 			break;
405 
406 		case ENAMETOOLONG:
407 			/*
408 			 * One of the vdevs has exceeded VDEV_SPEC_MAX length in
409 			 * its plaintext representation.
410 			 */
411 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
412 			    "too many devices in a single vdev"), pool);
413 			break;
414 
415 		case EIO:
416 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
417 			    "I/O error on one or more devices"), pool);
418 			break;
419 
420 		case ENXIO:
421 			/*
422 			 * This is unlikely to happen since we've verified that
423 			 * all the devices can be opened from userland, but it's
424 			 * still possible in some circumstances.
425 			 */
426 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
427 			    "one or more devices is unavailable"), pool);
428 			break;
429 
430 		case ENOSPC:
431 			/*
432 			 * This can occur if we were incapable of writing to a
433 			 * file vdev because the underlying filesystem is out of
434 			 * space.  This is very similar to EOVERFLOW, but we'll
435 			 * produce a slightly different message.
436 			 */
437 			zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': "
438 			    "one or more devices is out of space"), pool);
439 			break;
440 
441 		default:
442 			zfs_baderror(errno);
443 		}
444 
445 		return (-1);
446 	}
447 
448 	free(packed);
449 
450 	/*
451 	 * If this is an alternate root pool, then we automatically set the
452 	 * moutnpoint of the root dataset to be '/'.
453 	 */
454 	if (altroot != NULL) {
455 		zfs_handle_t *zhp;
456 
457 		verify((zhp = zfs_open(pool, ZFS_TYPE_ANY)) != NULL);
458 		verify(zfs_prop_set(zhp, ZFS_PROP_MOUNTPOINT, "/") == 0);
459 
460 		zfs_close(zhp);
461 	}
462 
463 	return (0);
464 }
465 
466 /*
467  * Destroy the given pool.  It is up to the caller to ensure that there are no
468  * datasets left in the pool.
469  */
470 int
471 zpool_destroy(zpool_handle_t *zhp)
472 {
473 	zfs_cmd_t zc = { 0 };
474 	zfs_handle_t *zfp = NULL;
475 
476 	if (zhp->zpool_state == POOL_STATE_ACTIVE &&
477 	    (zfp = zfs_open(zhp->zpool_name, ZFS_TYPE_FILESYSTEM)) == NULL)
478 		return (-1);
479 
480 	if (zpool_remove_zvol_links(zhp) != NULL)
481 		return (-1);
482 
483 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
484 
485 	if (ioctl(zfs_fd, ZFS_IOC_POOL_DESTROY, &zc) != 0) {
486 		switch (errno) {
487 		case EPERM:
488 			zfs_error(dgettext(TEXT_DOMAIN,
489 			    "cannot destroy '%s': permission denied"),
490 			    zhp->zpool_name);
491 			break;
492 
493 		case EBUSY:
494 			zfs_error(dgettext(TEXT_DOMAIN,
495 			    "cannot destroy '%s': pool busy"),
496 			    zhp->zpool_name);
497 			break;
498 
499 		case ENOENT:
500 			zfs_error(dgettext(TEXT_DOMAIN,
501 			    "cannot destroy '%s': no such pool"),
502 			    zhp->zpool_name);
503 			break;
504 
505 		case EROFS:
506 			zfs_error(dgettext(TEXT_DOMAIN,
507 			    "cannot destroy '%s': one or more devices is "
508 			    "read only, or '/' is mounted read only"),
509 			    zhp->zpool_name);
510 			break;
511 
512 		default:
513 			zfs_baderror(errno);
514 		}
515 
516 		if (zfp)
517 			zfs_close(zfp);
518 		return (-1);
519 	}
520 
521 	if (zfp) {
522 		remove_mountpoint(zfp);
523 		zfs_close(zfp);
524 	}
525 
526 	return (0);
527 }
528 
529 /*
530  * Add the given vdevs to the pool.  The caller must have already performed the
531  * necessary verification to ensure that the vdev specification is well-formed.
532  */
533 int
534 zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot)
535 {
536 	char *packed;
537 	size_t len;
538 	zfs_cmd_t zc;
539 
540 	verify(nvlist_size(nvroot, &len, NV_ENCODE_NATIVE) == 0);
541 
542 	packed = zfs_malloc(len);
543 
544 	verify(nvlist_pack(nvroot, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
545 
546 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
547 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
548 	zc.zc_config_src_size = len;
549 
550 	if (ioctl(zfs_fd, ZFS_IOC_VDEV_ADD, &zc) != 0) {
551 		switch (errno) {
552 		case EPERM:
553 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
554 			    "permission denied"), zhp->zpool_name);
555 			break;
556 
557 		case EBUSY:
558 			/*
559 			 * This can happen if the user has specified the same
560 			 * device multiple times.  We can't reliably detect this
561 			 * until we try to add it and see we already have a
562 			 * label.
563 			 */
564 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
565 			    "one or more vdevs refer to the same device"),
566 			    zhp->zpool_name);
567 			break;
568 
569 		case ENAMETOOLONG:
570 			/*
571 			 * One of the vdevs has exceeded VDEV_SPEC_MAX length in
572 			 * its plaintext representation.
573 			 */
574 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
575 			    "too many devices in a single vdev"),
576 			    zhp->zpool_name);
577 			break;
578 
579 		case ENXIO:
580 			/*
581 			 * This is unlikely to happen since we've verified that
582 			 * all the devices can be opened from userland, but it's
583 			 * still possible in some circumstances.
584 			 */
585 			zfs_error(dgettext(TEXT_DOMAIN, "cannot add to '%s': "
586 			    "one or more devices is unavailable"),
587 			    zhp->zpool_name);
588 			break;
589 
590 		case EOVERFLOW:
591 			/*
592 			 * This occurrs when one of the devices is below
593 			 * SPA_MINDEVSIZE.  Unfortunately, we can't detect which
594 			 * device was the problem device since there's no
595 			 * reliable way to determine device size from userland.
596 			 */
597 			{
598 				char buf[64];
599 
600 				zfs_nicenum(SPA_MINDEVSIZE, buf, sizeof (buf));
601 
602 				zfs_error(dgettext(TEXT_DOMAIN, "cannot "
603 				    "add to '%s': one or more devices is less "
604 				    "than the minimum size (%s)"),
605 				    zhp->zpool_name, buf);
606 			}
607 			break;
608 
609 		default:
610 			zfs_baderror(errno);
611 		}
612 
613 		return (-1);
614 	}
615 
616 	free(packed);
617 
618 	return (0);
619 }
620 
621 /*
622  * Exports the pool from the system.  The caller must ensure that there are no
623  * mounted datasets in the pool.
624  */
625 int
626 zpool_export(zpool_handle_t *zhp)
627 {
628 	zfs_cmd_t zc = { 0 };
629 
630 	if (zpool_remove_zvol_links(zhp) != 0)
631 		return (-1);
632 
633 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
634 
635 	if (ioctl(zfs_fd, ZFS_IOC_POOL_EXPORT, &zc) != 0) {
636 		switch (errno) {
637 		case EPERM:
638 			zfs_error(dgettext(TEXT_DOMAIN,
639 			    "cannot export '%s': permission denied"),
640 			    zhp->zpool_name);
641 			break;
642 
643 		case EBUSY:
644 			zfs_error(dgettext(TEXT_DOMAIN,
645 			    "cannot export '%s': pool is in use"),
646 			    zhp->zpool_name);
647 			break;
648 
649 		case ENOENT:
650 			zfs_error(dgettext(TEXT_DOMAIN,
651 			    "cannot export '%s': no such pool"),
652 			    zhp->zpool_name);
653 			break;
654 
655 		default:
656 			zfs_baderror(errno);
657 		}
658 
659 		return (-1);
660 	}
661 
662 	return (0);
663 }
664 
665 /*
666  * Import the given pool using the known configuration.  The configuration
667  * should have come from zpool_find_import().  The 'newname' and 'altroot'
668  * parameters control whether the pool is imported with a different name or with
669  * an alternate root, respectively.
670  */
671 int
672 zpool_import(nvlist_t *config, const char *newname, const char *altroot)
673 {
674 	zfs_cmd_t zc;
675 	char *packed;
676 	size_t len;
677 	char *thename;
678 	char *origname;
679 	int ret;
680 
681 	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
682 	    &origname) == 0);
683 
684 	if (newname != NULL) {
685 		if (!zpool_name_valid(newname, NULL, 0)) {
686 			zfs_error(dgettext(TEXT_DOMAIN, "cannot import '%s': "
687 			    "invalid pool name"), newname);
688 			return (-1);
689 		}
690 		thename = (char *)newname;
691 	} else {
692 		thename = origname;
693 	}
694 
695 	if (altroot != NULL && altroot[0] != '/') {
696 		zfs_error(dgettext(TEXT_DOMAIN, "cannot import '%s': alternate "
697 		    "root '%s' must be a complete path"), thename,
698 		    altroot);
699 		return (-1);
700 	}
701 
702 	(void) strlcpy(zc.zc_name, thename, sizeof (zc.zc_name));
703 
704 	if (altroot != NULL)
705 		(void) strlcpy(zc.zc_root, altroot, sizeof (zc.zc_root));
706 	else
707 		zc.zc_root[0] = '\0';
708 
709 	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
710 	    &zc.zc_pool_guid) == 0);
711 
712 	verify(nvlist_size(config, &len, NV_ENCODE_NATIVE) == 0);
713 
714 	packed = zfs_malloc(len);
715 
716 	verify(nvlist_pack(config, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
717 
718 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
719 	zc.zc_config_src_size = len;
720 
721 	ret = 0;
722 	if (ioctl(zfs_fd, ZFS_IOC_POOL_IMPORT, &zc) != 0) {
723 		char desc[1024];
724 		if (newname == NULL)
725 			(void) snprintf(desc, sizeof (desc),
726 			    dgettext(TEXT_DOMAIN, "cannot import '%s'"),
727 			    thename);
728 		else
729 			(void) snprintf(desc, sizeof (desc),
730 			    dgettext(TEXT_DOMAIN, "cannot import '%s' as '%s'"),
731 			    origname, thename);
732 
733 		switch (errno) {
734 		case EEXIST:
735 			/*
736 			 * A pool with that name already exists.
737 			 */
738 			zfs_error(dgettext(TEXT_DOMAIN, "%s: pool exists"),
739 			    desc);
740 			break;
741 
742 		case EPERM:
743 			/*
744 			 * The user doesn't have permission to create pools.
745 			 */
746 			zfs_error(dgettext(TEXT_DOMAIN, "%s: permission "
747 			    "denied"), desc);
748 			break;
749 
750 		case ENXIO:
751 		case EDOM:
752 			/*
753 			 * Device is unavailable, or vdev sum didn't match.
754 			 */
755 			zfs_error(dgettext(TEXT_DOMAIN, "%s: one or more "
756 			    "devices is unavailable"),
757 			    desc);
758 			break;
759 
760 		default:
761 			zfs_baderror(errno);
762 		}
763 
764 		ret = -1;
765 	} else {
766 		zpool_handle_t *zhp;
767 		/*
768 		 * This should never fail, but play it safe anyway.
769 		 */
770 		if ((zhp = zpool_open_silent(thename)) != NULL) {
771 			ret = zpool_create_zvol_links(zhp);
772 			zpool_close(zhp);
773 		}
774 	}
775 
776 	free(packed);
777 	return (ret);
778 }
779 
780 /*
781  * Scrub the pool.
782  */
783 int
784 zpool_scrub(zpool_handle_t *zhp, pool_scrub_type_t type)
785 {
786 	zfs_cmd_t zc = { 0 };
787 	char msg[1024];
788 
789 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
790 	zc.zc_cookie = type;
791 
792 	if (ioctl(zfs_fd, ZFS_IOC_POOL_SCRUB, &zc) == 0)
793 		return (0);
794 
795 	(void) snprintf(msg, sizeof (msg),
796 	    dgettext(TEXT_DOMAIN, "cannot scrub %s"), zc.zc_name);
797 
798 	switch (errno) {
799 	    case EPERM:
800 		/*
801 		 * No permission to scrub this pool.
802 		 */
803 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
804 		break;
805 
806 	    case EBUSY:
807 		/*
808 		 * Resilver in progress.
809 		 */
810 		zfs_error(dgettext(TEXT_DOMAIN, "%s: currently resilvering"),
811 		    msg);
812 		break;
813 
814 	    default:
815 		zfs_baderror(errno);
816 	}
817 	return (-1);
818 }
819 
820 /*
821  * Bring the specified vdev online
822  */
823 int
824 zpool_vdev_online(zpool_handle_t *zhp, const char *path)
825 {
826 	zfs_cmd_t zc = { 0 };
827 	char msg[1024];
828 
829 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
830 	(void) snprintf(zc.zc_prop_value, sizeof (zc.zc_prop_value),
831 	    "%s%s", path[0] == '/' ? "" : "/dev/dsk/", path);
832 
833 	if (ioctl(zfs_fd, ZFS_IOC_VDEV_ONLINE, &zc) == 0)
834 		return (0);
835 
836 	(void) snprintf(msg, sizeof (msg),
837 	    dgettext(TEXT_DOMAIN, "cannot online %s"), zc.zc_prop_value);
838 
839 	switch (errno) {
840 	    case ENODEV:
841 		/*
842 		 * Device doesn't exist
843 		 */
844 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
845 		break;
846 
847 	    case EPERM:
848 		/*
849 		 * No permission to bring this vdev online.
850 		 */
851 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
852 		break;
853 
854 	    default:
855 		zfs_baderror(errno);
856 	}
857 	return (-1);
858 }
859 
860 /*
861  * Take the specified vdev offline
862  */
863 int
864 zpool_vdev_offline(zpool_handle_t *zhp, const char *path)
865 {
866 	zfs_cmd_t zc = { 0 };
867 	char msg[1024];
868 
869 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
870 	(void) snprintf(zc.zc_prop_value, sizeof (zc.zc_prop_value),
871 	    "%s%s", path[0] == '/' ? "" : "/dev/dsk/", path);
872 
873 	if (ioctl(zfs_fd, ZFS_IOC_VDEV_OFFLINE, &zc) == 0)
874 		return (0);
875 
876 	(void) snprintf(msg, sizeof (msg),
877 	    dgettext(TEXT_DOMAIN, "cannot offline %s"), zc.zc_prop_value);
878 
879 	switch (errno) {
880 	    case ENODEV:
881 		/*
882 		 * Device doesn't exist
883 		 */
884 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
885 		break;
886 
887 	    case EPERM:
888 		/*
889 		 * No permission to take this vdev offline.
890 		 */
891 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
892 		break;
893 
894 	    case EBUSY:
895 		/*
896 		 * There are no other replicas of this device.
897 		 */
898 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no valid replicas"), msg);
899 		break;
900 
901 	    default:
902 		zfs_baderror(errno);
903 	}
904 	return (-1);
905 }
906 
907 /*
908  * Attach new_disk (fully described by nvroot) to old_disk.
909  * If 'replacing' is specified, tne new disk will replace the old one.
910  */
911 int
912 zpool_vdev_attach(zpool_handle_t *zhp,
913     const char *old_disk, const char *new_disk, nvlist_t *nvroot, int replacing)
914 {
915 	zfs_cmd_t zc = { 0 };
916 	char msg[1024];
917 	char *packed;
918 	int ret;
919 	size_t len;
920 
921 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
922 	(void) snprintf(zc.zc_prop_value, sizeof (zc.zc_prop_value),
923 	    "%s%s", old_disk[0] == '/' ? "" : "/dev/dsk/", old_disk);
924 	zc.zc_cookie = replacing;
925 
926 	verify(nvlist_size(nvroot, &len, NV_ENCODE_NATIVE) == 0);
927 
928 	packed = zfs_malloc(len);
929 
930 	verify(nvlist_pack(nvroot, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
931 
932 	zc.zc_config_src = (uint64_t)(uintptr_t)packed;
933 	zc.zc_config_src_size = len;
934 
935 	ret = ioctl(zfs_fd, ZFS_IOC_VDEV_ATTACH, &zc);
936 
937 	free(packed);
938 
939 	if (ret == 0)
940 		return (0);
941 
942 	if (replacing)
943 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
944 		    "cannot replace %s with %s"), old_disk, new_disk);
945 	else
946 		(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
947 		    "cannot attach %s to %s"), new_disk, old_disk);
948 
949 	switch (errno) {
950 	    case EPERM:
951 		/*
952 		 * No permission to mess with the config.
953 		 */
954 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
955 		break;
956 
957 	    case ENODEV:
958 		/*
959 		 * Device doesn't exist.
960 		 */
961 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s not in pool"),
962 		    msg, old_disk);
963 		break;
964 
965 	    case ENOTSUP:
966 		/*
967 		 * Can't attach to or replace this type of vdev.
968 		 */
969 		if (replacing)
970 			zfs_error(dgettext(TEXT_DOMAIN,
971 			    "%s: cannot replace a replacing device"), msg);
972 		else
973 			zfs_error(dgettext(TEXT_DOMAIN,
974 			    "%s: attach is only applicable to mirrors"), msg);
975 		break;
976 
977 	    case EINVAL:
978 		/*
979 		 * The new device must be a single disk.
980 		 */
981 		zfs_error(dgettext(TEXT_DOMAIN,
982 		    "%s: <new_device> must be a single disk"), msg);
983 		break;
984 
985 	    case ENXIO:
986 		/*
987 		 * This is unlikely to happen since we've verified that
988 		 * all the devices can be opened from userland, but it's
989 		 * still possible in some circumstances.
990 		 */
991 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s is unavailable"),
992 		    msg, new_disk);
993 		break;
994 
995 	    case EBUSY:
996 		/*
997 		 * The new device is is use.
998 		 */
999 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s busy"), msg, new_disk);
1000 		break;
1001 
1002 	    case EOVERFLOW:
1003 		/*
1004 		 * The new device is too small.
1005 		 */
1006 		zfs_error(dgettext(TEXT_DOMAIN, "%s: %s is too small"),
1007 		    msg, new_disk);
1008 		break;
1009 
1010 	    case EDOM:
1011 		/*
1012 		 * The new device has a different alignment requirement.
1013 		 */
1014 		zfs_error(dgettext(TEXT_DOMAIN,
1015 		    "%s: devices have different sector alignment"), msg);
1016 		break;
1017 
1018 	    case ENAMETOOLONG:
1019 		/*
1020 		 * The resulting top-level vdev spec won't fit in the label.
1021 		 */
1022 		zfs_error(dgettext(TEXT_DOMAIN,
1023 		    "%s: too many devices in a single vdev"), msg);
1024 		break;
1025 
1026 	    default:
1027 		zfs_baderror(errno);
1028 	}
1029 
1030 	return (1);
1031 }
1032 
1033 /*
1034  * Detach the specified device.
1035  */
1036 int
1037 zpool_vdev_detach(zpool_handle_t *zhp, const char *path)
1038 {
1039 	zfs_cmd_t zc = { 0 };
1040 	char msg[1024];
1041 
1042 	(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
1043 	(void) snprintf(zc.zc_prop_value, sizeof (zc.zc_prop_value),
1044 	    "%s%s", path[0] == '/' ? "" : "/dev/dsk/", path);
1045 
1046 	if (ioctl(zfs_fd, ZFS_IOC_VDEV_DETACH, &zc) == 0)
1047 		return (0);
1048 
1049 	(void) snprintf(msg, sizeof (msg),
1050 	    dgettext(TEXT_DOMAIN, "cannot detach %s"), zc.zc_prop_value);
1051 
1052 	switch (errno) {
1053 	    case EPERM:
1054 		/*
1055 		 * No permission to mess with the config.
1056 		 */
1057 		zfs_error(dgettext(TEXT_DOMAIN, "%s: permission denied"), msg);
1058 		break;
1059 
1060 	    case ENODEV:
1061 		/*
1062 		 * Device doesn't exist.
1063 		 */
1064 		zfs_error(dgettext(TEXT_DOMAIN, "%s: device not in pool"), msg);
1065 		break;
1066 
1067 	    case ENOTSUP:
1068 		/*
1069 		 * Can't detach from this type of vdev.
1070 		 */
1071 		zfs_error(dgettext(TEXT_DOMAIN,
1072 		    "%s: only applicable to mirror and replacing vdevs"), msg);
1073 		break;
1074 
1075 	    case EBUSY:
1076 		/*
1077 		 * There are no other replicas of this device.
1078 		 */
1079 		zfs_error(dgettext(TEXT_DOMAIN, "%s: no valid replicas"), msg);
1080 		break;
1081 
1082 	    default:
1083 		zfs_baderror(errno);
1084 	}
1085 
1086 	return (1);
1087 }
1088 
1089 static int
1090 do_zvol(zfs_handle_t *zhp, void *data)
1091 {
1092 	int linktype = (int)(uintptr_t)data;
1093 	int ret;
1094 
1095 	/*
1096 	 * We check for volblocksize intead of ZFS_TYPE_VOLUME so that we
1097 	 * correctly handle snapshots of volumes.
1098 	 */
1099 	if (zhp->zfs_volblocksize != 0) {
1100 		if (linktype)
1101 			ret = zvol_create_link(zhp->zfs_name);
1102 		else
1103 			ret = zvol_remove_link(zhp->zfs_name);
1104 	}
1105 
1106 	ret = zfs_iter_children(zhp, do_zvol, data);
1107 
1108 	zfs_close(zhp);
1109 	return (ret);
1110 }
1111 
1112 /*
1113  * Iterate over all zvols in the pool and make any necessary minor nodes.
1114  */
1115 int
1116 zpool_create_zvol_links(zpool_handle_t *zhp)
1117 {
1118 	zfs_handle_t *zfp;
1119 	int ret;
1120 
1121 	/*
1122 	 * If the pool is unavailable, just return success.
1123 	 */
1124 	if ((zfp = make_dataset_handle(zhp->zpool_name)) == NULL)
1125 		return (0);
1126 
1127 	ret = zfs_iter_children(zfp, do_zvol, (void *)TRUE);
1128 
1129 	zfs_close(zfp);
1130 	return (ret);
1131 }
1132 
1133 /*
1134  * Iterate over all zvols in the poool and remove any minor nodes.
1135  */
1136 int
1137 zpool_remove_zvol_links(zpool_handle_t *zhp)
1138 {
1139 	zfs_handle_t *zfp;
1140 	int ret;
1141 
1142 	/*
1143 	 * If the pool is unavailable, just return success.
1144 	 */
1145 	if ((zfp = make_dataset_handle(zhp->zpool_name)) == NULL)
1146 		return (0);
1147 
1148 	ret = zfs_iter_children(zfp, do_zvol, (void *)FALSE);
1149 
1150 	zfs_close(zfp);
1151 	return (ret);
1152 }
1153