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 (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 25 /* 26 * Pool import support functions. 27 * 28 * To import a pool, we rely on reading the configuration information from the 29 * ZFS label of each device. If we successfully read the label, then we 30 * organize the configuration information in the following hierarchy: 31 * 32 * pool guid -> toplevel vdev guid -> label txg 33 * 34 * Duplicate entries matching this same tuple will be discarded. Once we have 35 * examined every device, we pick the best label txg config for each toplevel 36 * vdev. We then arrange these toplevel vdevs into a complete pool config, and 37 * update any paths that have changed. Finally, we attempt to import the pool 38 * using our derived config, and record the results. 39 */ 40 41 #include <ctype.h> 42 #include <devid.h> 43 #include <dirent.h> 44 #include <errno.h> 45 #include <libintl.h> 46 #include <stddef.h> 47 #include <stdlib.h> 48 #include <string.h> 49 #include <sys/stat.h> 50 #include <unistd.h> 51 #include <fcntl.h> 52 #include <sys/vtoc.h> 53 #include <sys/dktp/fdisk.h> 54 #include <sys/efi_partition.h> 55 #include <thread_pool.h> 56 57 #include <sys/vdev_impl.h> 58 59 #include "libzfs.h" 60 #include "libzfs_impl.h" 61 62 /* 63 * Intermediate structures used to gather configuration information. 64 */ 65 typedef struct config_entry { 66 uint64_t ce_txg; 67 nvlist_t *ce_config; 68 struct config_entry *ce_next; 69 } config_entry_t; 70 71 typedef struct vdev_entry { 72 uint64_t ve_guid; 73 config_entry_t *ve_configs; 74 struct vdev_entry *ve_next; 75 } vdev_entry_t; 76 77 typedef struct pool_entry { 78 uint64_t pe_guid; 79 vdev_entry_t *pe_vdevs; 80 struct pool_entry *pe_next; 81 } pool_entry_t; 82 83 typedef struct name_entry { 84 char *ne_name; 85 uint64_t ne_guid; 86 struct name_entry *ne_next; 87 } name_entry_t; 88 89 typedef struct pool_list { 90 pool_entry_t *pools; 91 name_entry_t *names; 92 } pool_list_t; 93 94 static char * 95 get_devid(const char *path) 96 { 97 int fd; 98 ddi_devid_t devid; 99 char *minor, *ret; 100 101 if ((fd = open(path, O_RDONLY)) < 0) 102 return (NULL); 103 104 minor = NULL; 105 ret = NULL; 106 if (devid_get(fd, &devid) == 0) { 107 if (devid_get_minor_name(fd, &minor) == 0) 108 ret = devid_str_encode(devid, minor); 109 if (minor != NULL) 110 devid_str_free(minor); 111 devid_free(devid); 112 } 113 (void) close(fd); 114 115 return (ret); 116 } 117 118 119 /* 120 * Go through and fix up any path and/or devid information for the given vdev 121 * configuration. 122 */ 123 static int 124 fix_paths(nvlist_t *nv, name_entry_t *names) 125 { 126 nvlist_t **child; 127 uint_t c, children; 128 uint64_t guid; 129 name_entry_t *ne, *best; 130 char *path, *devid; 131 int matched; 132 133 if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, 134 &child, &children) == 0) { 135 for (c = 0; c < children; c++) 136 if (fix_paths(child[c], names) != 0) 137 return (-1); 138 return (0); 139 } 140 141 /* 142 * This is a leaf (file or disk) vdev. In either case, go through 143 * the name list and see if we find a matching guid. If so, replace 144 * the path and see if we can calculate a new devid. 145 * 146 * There may be multiple names associated with a particular guid, in 147 * which case we have overlapping slices or multiple paths to the same 148 * disk. If this is the case, then we want to pick the path that is 149 * the most similar to the original, where "most similar" is the number 150 * of matching characters starting from the end of the path. This will 151 * preserve slice numbers even if the disks have been reorganized, and 152 * will also catch preferred disk names if multiple paths exist. 153 */ 154 verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0); 155 if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0) 156 path = NULL; 157 158 matched = 0; 159 best = NULL; 160 for (ne = names; ne != NULL; ne = ne->ne_next) { 161 if (ne->ne_guid == guid) { 162 const char *src, *dst; 163 int count; 164 165 if (path == NULL) { 166 best = ne; 167 break; 168 } 169 170 src = ne->ne_name + strlen(ne->ne_name) - 1; 171 dst = path + strlen(path) - 1; 172 for (count = 0; src >= ne->ne_name && dst >= path; 173 src--, dst--, count++) 174 if (*src != *dst) 175 break; 176 177 /* 178 * At this point, 'count' is the number of characters 179 * matched from the end. 180 */ 181 if (count > matched || best == NULL) { 182 best = ne; 183 matched = count; 184 } 185 } 186 } 187 188 if (best == NULL) 189 return (0); 190 191 if (nvlist_add_string(nv, ZPOOL_CONFIG_PATH, best->ne_name) != 0) 192 return (-1); 193 194 if ((devid = get_devid(best->ne_name)) == NULL) { 195 (void) nvlist_remove_all(nv, ZPOOL_CONFIG_DEVID); 196 } else { 197 if (nvlist_add_string(nv, ZPOOL_CONFIG_DEVID, devid) != 0) 198 return (-1); 199 devid_str_free(devid); 200 } 201 202 return (0); 203 } 204 205 /* 206 * Add the given configuration to the list of known devices. 207 */ 208 static int 209 add_config(libzfs_handle_t *hdl, pool_list_t *pl, const char *path, 210 nvlist_t *config) 211 { 212 uint64_t pool_guid, vdev_guid, top_guid, txg, state; 213 pool_entry_t *pe; 214 vdev_entry_t *ve; 215 config_entry_t *ce; 216 name_entry_t *ne; 217 218 /* 219 * If this is a hot spare not currently in use or level 2 cache 220 * device, add it to the list of names to translate, but don't do 221 * anything else. 222 */ 223 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, 224 &state) == 0 && 225 (state == POOL_STATE_SPARE || state == POOL_STATE_L2CACHE) && 226 nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, &vdev_guid) == 0) { 227 if ((ne = zfs_alloc(hdl, sizeof (name_entry_t))) == NULL) 228 return (-1); 229 230 if ((ne->ne_name = zfs_strdup(hdl, path)) == NULL) { 231 free(ne); 232 return (-1); 233 } 234 ne->ne_guid = vdev_guid; 235 ne->ne_next = pl->names; 236 pl->names = ne; 237 return (0); 238 } 239 240 /* 241 * If we have a valid config but cannot read any of these fields, then 242 * it means we have a half-initialized label. In vdev_label_init() 243 * we write a label with txg == 0 so that we can identify the device 244 * in case the user refers to the same disk later on. If we fail to 245 * create the pool, we'll be left with a label in this state 246 * which should not be considered part of a valid pool. 247 */ 248 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, 249 &pool_guid) != 0 || 250 nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, 251 &vdev_guid) != 0 || 252 nvlist_lookup_uint64(config, ZPOOL_CONFIG_TOP_GUID, 253 &top_guid) != 0 || 254 nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, 255 &txg) != 0 || txg == 0) { 256 nvlist_free(config); 257 return (0); 258 } 259 260 /* 261 * First, see if we know about this pool. If not, then add it to the 262 * list of known pools. 263 */ 264 for (pe = pl->pools; pe != NULL; pe = pe->pe_next) { 265 if (pe->pe_guid == pool_guid) 266 break; 267 } 268 269 if (pe == NULL) { 270 if ((pe = zfs_alloc(hdl, sizeof (pool_entry_t))) == NULL) { 271 nvlist_free(config); 272 return (-1); 273 } 274 pe->pe_guid = pool_guid; 275 pe->pe_next = pl->pools; 276 pl->pools = pe; 277 } 278 279 /* 280 * Second, see if we know about this toplevel vdev. Add it if its 281 * missing. 282 */ 283 for (ve = pe->pe_vdevs; ve != NULL; ve = ve->ve_next) { 284 if (ve->ve_guid == top_guid) 285 break; 286 } 287 288 if (ve == NULL) { 289 if ((ve = zfs_alloc(hdl, sizeof (vdev_entry_t))) == NULL) { 290 nvlist_free(config); 291 return (-1); 292 } 293 ve->ve_guid = top_guid; 294 ve->ve_next = pe->pe_vdevs; 295 pe->pe_vdevs = ve; 296 } 297 298 /* 299 * Third, see if we have a config with a matching transaction group. If 300 * so, then we do nothing. Otherwise, add it to the list of known 301 * configs. 302 */ 303 for (ce = ve->ve_configs; ce != NULL; ce = ce->ce_next) { 304 if (ce->ce_txg == txg) 305 break; 306 } 307 308 if (ce == NULL) { 309 if ((ce = zfs_alloc(hdl, sizeof (config_entry_t))) == NULL) { 310 nvlist_free(config); 311 return (-1); 312 } 313 ce->ce_txg = txg; 314 ce->ce_config = config; 315 ce->ce_next = ve->ve_configs; 316 ve->ve_configs = ce; 317 } else { 318 nvlist_free(config); 319 } 320 321 /* 322 * At this point we've successfully added our config to the list of 323 * known configs. The last thing to do is add the vdev guid -> path 324 * mappings so that we can fix up the configuration as necessary before 325 * doing the import. 326 */ 327 if ((ne = zfs_alloc(hdl, sizeof (name_entry_t))) == NULL) 328 return (-1); 329 330 if ((ne->ne_name = zfs_strdup(hdl, path)) == NULL) { 331 free(ne); 332 return (-1); 333 } 334 335 ne->ne_guid = vdev_guid; 336 ne->ne_next = pl->names; 337 pl->names = ne; 338 339 return (0); 340 } 341 342 /* 343 * Returns true if the named pool matches the given GUID. 344 */ 345 static int 346 pool_active(libzfs_handle_t *hdl, const char *name, uint64_t guid, 347 boolean_t *isactive) 348 { 349 zpool_handle_t *zhp; 350 uint64_t theguid; 351 352 if (zpool_open_silent(hdl, name, &zhp) != 0) 353 return (-1); 354 355 if (zhp == NULL) { 356 *isactive = B_FALSE; 357 return (0); 358 } 359 360 verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_POOL_GUID, 361 &theguid) == 0); 362 363 zpool_close(zhp); 364 365 *isactive = (theguid == guid); 366 return (0); 367 } 368 369 static nvlist_t * 370 refresh_config(libzfs_handle_t *hdl, nvlist_t *config) 371 { 372 nvlist_t *nvl; 373 zfs_cmd_t zc = { 0 }; 374 int err; 375 376 if (zcmd_write_conf_nvlist(hdl, &zc, config) != 0) 377 return (NULL); 378 379 if (zcmd_alloc_dst_nvlist(hdl, &zc, 380 zc.zc_nvlist_conf_size * 2) != 0) { 381 zcmd_free_nvlists(&zc); 382 return (NULL); 383 } 384 385 while ((err = ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_TRYIMPORT, 386 &zc)) != 0 && errno == ENOMEM) { 387 if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { 388 zcmd_free_nvlists(&zc); 389 return (NULL); 390 } 391 } 392 393 if (err) { 394 zcmd_free_nvlists(&zc); 395 return (NULL); 396 } 397 398 if (zcmd_read_dst_nvlist(hdl, &zc, &nvl) != 0) { 399 zcmd_free_nvlists(&zc); 400 return (NULL); 401 } 402 403 zcmd_free_nvlists(&zc); 404 return (nvl); 405 } 406 407 /* 408 * Determine if the vdev id is a hole in the namespace. 409 */ 410 boolean_t 411 vdev_is_hole(uint64_t *hole_array, uint_t holes, uint_t id) 412 { 413 for (int c = 0; c < holes; c++) { 414 415 /* Top-level is a hole */ 416 if (hole_array[c] == id) 417 return (B_TRUE); 418 } 419 return (B_FALSE); 420 } 421 422 /* 423 * Convert our list of pools into the definitive set of configurations. We 424 * start by picking the best config for each toplevel vdev. Once that's done, 425 * we assemble the toplevel vdevs into a full config for the pool. We make a 426 * pass to fix up any incorrect paths, and then add it to the main list to 427 * return to the user. 428 */ 429 static nvlist_t * 430 get_configs(libzfs_handle_t *hdl, pool_list_t *pl, boolean_t active_ok) 431 { 432 pool_entry_t *pe; 433 vdev_entry_t *ve; 434 config_entry_t *ce; 435 nvlist_t *ret = NULL, *config = NULL, *tmp, *nvtop, *nvroot; 436 nvlist_t **spares, **l2cache; 437 uint_t i, nspares, nl2cache; 438 boolean_t config_seen; 439 uint64_t best_txg; 440 char *name, *hostname; 441 uint64_t version, guid; 442 uint_t children = 0; 443 nvlist_t **child = NULL; 444 uint_t holes; 445 uint64_t *hole_array, max_id; 446 uint_t c; 447 boolean_t isactive; 448 uint64_t hostid; 449 nvlist_t *nvl; 450 boolean_t found_one = B_FALSE; 451 boolean_t valid_top_config = B_FALSE; 452 453 if (nvlist_alloc(&ret, 0, 0) != 0) 454 goto nomem; 455 456 for (pe = pl->pools; pe != NULL; pe = pe->pe_next) { 457 uint64_t id, max_txg = 0; 458 459 if (nvlist_alloc(&config, NV_UNIQUE_NAME, 0) != 0) 460 goto nomem; 461 config_seen = B_FALSE; 462 463 /* 464 * Iterate over all toplevel vdevs. Grab the pool configuration 465 * from the first one we find, and then go through the rest and 466 * add them as necessary to the 'vdevs' member of the config. 467 */ 468 for (ve = pe->pe_vdevs; ve != NULL; ve = ve->ve_next) { 469 470 /* 471 * Determine the best configuration for this vdev by 472 * selecting the config with the latest transaction 473 * group. 474 */ 475 best_txg = 0; 476 for (ce = ve->ve_configs; ce != NULL; 477 ce = ce->ce_next) { 478 479 if (ce->ce_txg > best_txg) { 480 tmp = ce->ce_config; 481 best_txg = ce->ce_txg; 482 } 483 } 484 485 /* 486 * We rely on the fact that the max txg for the 487 * pool will contain the most up-to-date information 488 * about the valid top-levels in the vdev namespace. 489 */ 490 if (best_txg > max_txg) { 491 (void) nvlist_remove(config, 492 ZPOOL_CONFIG_VDEV_CHILDREN, 493 DATA_TYPE_UINT64); 494 (void) nvlist_remove(config, 495 ZPOOL_CONFIG_HOLE_ARRAY, 496 DATA_TYPE_UINT64_ARRAY); 497 498 max_txg = best_txg; 499 hole_array = NULL; 500 holes = 0; 501 max_id = 0; 502 valid_top_config = B_FALSE; 503 504 if (nvlist_lookup_uint64(tmp, 505 ZPOOL_CONFIG_VDEV_CHILDREN, &max_id) == 0) { 506 verify(nvlist_add_uint64(config, 507 ZPOOL_CONFIG_VDEV_CHILDREN, 508 max_id) == 0); 509 valid_top_config = B_TRUE; 510 } 511 512 if (nvlist_lookup_uint64_array(tmp, 513 ZPOOL_CONFIG_HOLE_ARRAY, &hole_array, 514 &holes) == 0) { 515 verify(nvlist_add_uint64_array(config, 516 ZPOOL_CONFIG_HOLE_ARRAY, 517 hole_array, holes) == 0); 518 } 519 } 520 521 if (!config_seen) { 522 /* 523 * Copy the relevant pieces of data to the pool 524 * configuration: 525 * 526 * version 527 * pool guid 528 * name 529 * pool state 530 * hostid (if available) 531 * hostname (if available) 532 */ 533 uint64_t state; 534 535 verify(nvlist_lookup_uint64(tmp, 536 ZPOOL_CONFIG_VERSION, &version) == 0); 537 if (nvlist_add_uint64(config, 538 ZPOOL_CONFIG_VERSION, version) != 0) 539 goto nomem; 540 verify(nvlist_lookup_uint64(tmp, 541 ZPOOL_CONFIG_POOL_GUID, &guid) == 0); 542 if (nvlist_add_uint64(config, 543 ZPOOL_CONFIG_POOL_GUID, guid) != 0) 544 goto nomem; 545 verify(nvlist_lookup_string(tmp, 546 ZPOOL_CONFIG_POOL_NAME, &name) == 0); 547 if (nvlist_add_string(config, 548 ZPOOL_CONFIG_POOL_NAME, name) != 0) 549 goto nomem; 550 verify(nvlist_lookup_uint64(tmp, 551 ZPOOL_CONFIG_POOL_STATE, &state) == 0); 552 if (nvlist_add_uint64(config, 553 ZPOOL_CONFIG_POOL_STATE, state) != 0) 554 goto nomem; 555 hostid = 0; 556 if (nvlist_lookup_uint64(tmp, 557 ZPOOL_CONFIG_HOSTID, &hostid) == 0) { 558 if (nvlist_add_uint64(config, 559 ZPOOL_CONFIG_HOSTID, hostid) != 0) 560 goto nomem; 561 verify(nvlist_lookup_string(tmp, 562 ZPOOL_CONFIG_HOSTNAME, 563 &hostname) == 0); 564 if (nvlist_add_string(config, 565 ZPOOL_CONFIG_HOSTNAME, 566 hostname) != 0) 567 goto nomem; 568 } 569 570 config_seen = B_TRUE; 571 } 572 573 /* 574 * Add this top-level vdev to the child array. 575 */ 576 verify(nvlist_lookup_nvlist(tmp, 577 ZPOOL_CONFIG_VDEV_TREE, &nvtop) == 0); 578 verify(nvlist_lookup_uint64(nvtop, ZPOOL_CONFIG_ID, 579 &id) == 0); 580 581 if (id >= children) { 582 nvlist_t **newchild; 583 584 newchild = zfs_alloc(hdl, (id + 1) * 585 sizeof (nvlist_t *)); 586 if (newchild == NULL) 587 goto nomem; 588 589 for (c = 0; c < children; c++) 590 newchild[c] = child[c]; 591 592 free(child); 593 child = newchild; 594 children = id + 1; 595 } 596 if (nvlist_dup(nvtop, &child[id], 0) != 0) 597 goto nomem; 598 599 } 600 601 /* 602 * If we have information about all the top-levels then 603 * clean up the nvlist which we've constructed. This 604 * means removing any extraneous devices that are 605 * beyond the valid range or adding devices to the end 606 * of our array which appear to be missing. 607 */ 608 if (valid_top_config) { 609 if (max_id < children) { 610 for (c = max_id; c < children; c++) 611 nvlist_free(child[c]); 612 children = max_id; 613 } else if (max_id > children) { 614 nvlist_t **newchild; 615 616 newchild = zfs_alloc(hdl, (max_id) * 617 sizeof (nvlist_t *)); 618 if (newchild == NULL) 619 goto nomem; 620 621 for (c = 0; c < children; c++) 622 newchild[c] = child[c]; 623 624 free(child); 625 child = newchild; 626 children = max_id; 627 } 628 } 629 630 verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, 631 &guid) == 0); 632 633 /* 634 * The vdev namespace may contain holes as a result of 635 * device removal. We must add them back into the vdev 636 * tree before we process any missing devices. 637 */ 638 if (holes > 0) { 639 ASSERT(valid_top_config); 640 641 for (c = 0; c < children; c++) { 642 nvlist_t *holey; 643 644 if (child[c] != NULL || 645 !vdev_is_hole(hole_array, holes, c)) 646 continue; 647 648 if (nvlist_alloc(&holey, NV_UNIQUE_NAME, 649 0) != 0) 650 goto nomem; 651 652 /* 653 * Holes in the namespace are treated as 654 * "hole" top-level vdevs and have a 655 * special flag set on them. 656 */ 657 if (nvlist_add_string(holey, 658 ZPOOL_CONFIG_TYPE, 659 VDEV_TYPE_HOLE) != 0 || 660 nvlist_add_uint64(holey, 661 ZPOOL_CONFIG_ID, c) != 0 || 662 nvlist_add_uint64(holey, 663 ZPOOL_CONFIG_GUID, 0ULL) != 0) 664 goto nomem; 665 child[c] = holey; 666 } 667 } 668 669 /* 670 * Look for any missing top-level vdevs. If this is the case, 671 * create a faked up 'missing' vdev as a placeholder. We cannot 672 * simply compress the child array, because the kernel performs 673 * certain checks to make sure the vdev IDs match their location 674 * in the configuration. 675 */ 676 for (c = 0; c < children; c++) { 677 if (child[c] == NULL) { 678 nvlist_t *missing; 679 if (nvlist_alloc(&missing, NV_UNIQUE_NAME, 680 0) != 0) 681 goto nomem; 682 if (nvlist_add_string(missing, 683 ZPOOL_CONFIG_TYPE, 684 VDEV_TYPE_MISSING) != 0 || 685 nvlist_add_uint64(missing, 686 ZPOOL_CONFIG_ID, c) != 0 || 687 nvlist_add_uint64(missing, 688 ZPOOL_CONFIG_GUID, 0ULL) != 0) { 689 nvlist_free(missing); 690 goto nomem; 691 } 692 child[c] = missing; 693 } 694 } 695 696 /* 697 * Put all of this pool's top-level vdevs into a root vdev. 698 */ 699 if (nvlist_alloc(&nvroot, NV_UNIQUE_NAME, 0) != 0) 700 goto nomem; 701 if (nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE, 702 VDEV_TYPE_ROOT) != 0 || 703 nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) != 0 || 704 nvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, guid) != 0 || 705 nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, 706 child, children) != 0) { 707 nvlist_free(nvroot); 708 goto nomem; 709 } 710 711 for (c = 0; c < children; c++) 712 nvlist_free(child[c]); 713 free(child); 714 children = 0; 715 child = NULL; 716 717 /* 718 * Go through and fix up any paths and/or devids based on our 719 * known list of vdev GUID -> path mappings. 720 */ 721 if (fix_paths(nvroot, pl->names) != 0) { 722 nvlist_free(nvroot); 723 goto nomem; 724 } 725 726 /* 727 * Add the root vdev to this pool's configuration. 728 */ 729 if (nvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, 730 nvroot) != 0) { 731 nvlist_free(nvroot); 732 goto nomem; 733 } 734 nvlist_free(nvroot); 735 736 /* 737 * zdb uses this path to report on active pools that were 738 * imported or created using -R. 739 */ 740 if (active_ok) 741 goto add_pool; 742 743 /* 744 * Determine if this pool is currently active, in which case we 745 * can't actually import it. 746 */ 747 verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, 748 &name) == 0); 749 verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, 750 &guid) == 0); 751 752 if (pool_active(hdl, name, guid, &isactive) != 0) 753 goto error; 754 755 if (isactive) { 756 nvlist_free(config); 757 config = NULL; 758 continue; 759 } 760 761 if ((nvl = refresh_config(hdl, config)) == NULL) { 762 nvlist_free(config); 763 config = NULL; 764 continue; 765 } 766 767 nvlist_free(config); 768 config = nvl; 769 770 /* 771 * Go through and update the paths for spares, now that we have 772 * them. 773 */ 774 verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, 775 &nvroot) == 0); 776 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES, 777 &spares, &nspares) == 0) { 778 for (i = 0; i < nspares; i++) { 779 if (fix_paths(spares[i], pl->names) != 0) 780 goto nomem; 781 } 782 } 783 784 /* 785 * Update the paths for l2cache devices. 786 */ 787 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE, 788 &l2cache, &nl2cache) == 0) { 789 for (i = 0; i < nl2cache; i++) { 790 if (fix_paths(l2cache[i], pl->names) != 0) 791 goto nomem; 792 } 793 } 794 795 /* 796 * Restore the original information read from the actual label. 797 */ 798 (void) nvlist_remove(config, ZPOOL_CONFIG_HOSTID, 799 DATA_TYPE_UINT64); 800 (void) nvlist_remove(config, ZPOOL_CONFIG_HOSTNAME, 801 DATA_TYPE_STRING); 802 if (hostid != 0) { 803 verify(nvlist_add_uint64(config, ZPOOL_CONFIG_HOSTID, 804 hostid) == 0); 805 verify(nvlist_add_string(config, ZPOOL_CONFIG_HOSTNAME, 806 hostname) == 0); 807 } 808 809 add_pool: 810 /* 811 * Add this pool to the list of configs. 812 */ 813 verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, 814 &name) == 0); 815 if (nvlist_add_nvlist(ret, name, config) != 0) 816 goto nomem; 817 818 found_one = B_TRUE; 819 nvlist_free(config); 820 config = NULL; 821 } 822 823 if (!found_one) { 824 nvlist_free(ret); 825 ret = NULL; 826 } 827 828 return (ret); 829 830 nomem: 831 (void) no_memory(hdl); 832 error: 833 nvlist_free(config); 834 nvlist_free(ret); 835 for (c = 0; c < children; c++) 836 nvlist_free(child[c]); 837 free(child); 838 839 return (NULL); 840 } 841 842 /* 843 * Return the offset of the given label. 844 */ 845 static uint64_t 846 label_offset(uint64_t size, int l) 847 { 848 ASSERT(P2PHASE_TYPED(size, sizeof (vdev_label_t), uint64_t) == 0); 849 return (l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ? 850 0 : size - VDEV_LABELS * sizeof (vdev_label_t))); 851 } 852 853 /* 854 * Given a file descriptor, read the label information and return an nvlist 855 * describing the configuration, if there is one. 856 */ 857 int 858 zpool_read_label(int fd, nvlist_t **config) 859 { 860 struct stat64 statbuf; 861 int l; 862 vdev_label_t *label; 863 uint64_t state, txg, size; 864 865 *config = NULL; 866 867 if (fstat64(fd, &statbuf) == -1) 868 return (0); 869 size = P2ALIGN_TYPED(statbuf.st_size, sizeof (vdev_label_t), uint64_t); 870 871 if ((label = malloc(sizeof (vdev_label_t))) == NULL) 872 return (-1); 873 874 for (l = 0; l < VDEV_LABELS; l++) { 875 if (pread64(fd, label, sizeof (vdev_label_t), 876 label_offset(size, l)) != sizeof (vdev_label_t)) 877 continue; 878 879 if (nvlist_unpack(label->vl_vdev_phys.vp_nvlist, 880 sizeof (label->vl_vdev_phys.vp_nvlist), config, 0) != 0) 881 continue; 882 883 if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_POOL_STATE, 884 &state) != 0 || state > POOL_STATE_L2CACHE) { 885 nvlist_free(*config); 886 continue; 887 } 888 889 if (state != POOL_STATE_SPARE && state != POOL_STATE_L2CACHE && 890 (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_POOL_TXG, 891 &txg) != 0 || txg == 0)) { 892 nvlist_free(*config); 893 continue; 894 } 895 896 free(label); 897 return (0); 898 } 899 900 free(label); 901 *config = NULL; 902 return (0); 903 } 904 905 typedef struct rdsk_node { 906 char *rn_name; 907 int rn_dfd; 908 libzfs_handle_t *rn_hdl; 909 nvlist_t *rn_config; 910 avl_tree_t *rn_avl; 911 avl_node_t rn_node; 912 boolean_t rn_nozpool; 913 } rdsk_node_t; 914 915 static int 916 slice_cache_compare(const void *arg1, const void *arg2) 917 { 918 const char *nm1 = ((rdsk_node_t *)arg1)->rn_name; 919 const char *nm2 = ((rdsk_node_t *)arg2)->rn_name; 920 char *nm1slice, *nm2slice; 921 int rv; 922 923 /* 924 * slices zero and two are the most likely to provide results, 925 * so put those first 926 */ 927 nm1slice = strstr(nm1, "s0"); 928 nm2slice = strstr(nm2, "s0"); 929 if (nm1slice && !nm2slice) { 930 return (-1); 931 } 932 if (!nm1slice && nm2slice) { 933 return (1); 934 } 935 nm1slice = strstr(nm1, "s2"); 936 nm2slice = strstr(nm2, "s2"); 937 if (nm1slice && !nm2slice) { 938 return (-1); 939 } 940 if (!nm1slice && nm2slice) { 941 return (1); 942 } 943 944 rv = strcmp(nm1, nm2); 945 if (rv == 0) 946 return (0); 947 return (rv > 0 ? 1 : -1); 948 } 949 950 static void 951 check_one_slice(avl_tree_t *r, char *diskname, uint_t partno, 952 diskaddr_t size, uint_t blksz) 953 { 954 rdsk_node_t tmpnode; 955 rdsk_node_t *node; 956 char sname[MAXNAMELEN]; 957 958 tmpnode.rn_name = &sname[0]; 959 (void) snprintf(tmpnode.rn_name, MAXNAMELEN, "%s%u", 960 diskname, partno); 961 /* 962 * protect against division by zero for disk labels that 963 * contain a bogus sector size 964 */ 965 if (blksz == 0) 966 blksz = DEV_BSIZE; 967 /* too small to contain a zpool? */ 968 if ((size < (SPA_MINDEVSIZE / blksz)) && 969 (node = avl_find(r, &tmpnode, NULL))) 970 node->rn_nozpool = B_TRUE; 971 } 972 973 static void 974 nozpool_all_slices(avl_tree_t *r, const char *sname) 975 { 976 char diskname[MAXNAMELEN]; 977 char *ptr; 978 int i; 979 980 (void) strncpy(diskname, sname, MAXNAMELEN); 981 if (((ptr = strrchr(diskname, 's')) == NULL) && 982 ((ptr = strrchr(diskname, 'p')) == NULL)) 983 return; 984 ptr[0] = 's'; 985 ptr[1] = '\0'; 986 for (i = 0; i < NDKMAP; i++) 987 check_one_slice(r, diskname, i, 0, 1); 988 ptr[0] = 'p'; 989 for (i = 0; i <= FD_NUMPART; i++) 990 check_one_slice(r, diskname, i, 0, 1); 991 } 992 993 static void 994 check_slices(avl_tree_t *r, int fd, const char *sname) 995 { 996 struct extvtoc vtoc; 997 struct dk_gpt *gpt; 998 char diskname[MAXNAMELEN]; 999 char *ptr; 1000 int i; 1001 1002 (void) strncpy(diskname, sname, MAXNAMELEN); 1003 if ((ptr = strrchr(diskname, 's')) == NULL || !isdigit(ptr[1])) 1004 return; 1005 ptr[1] = '\0'; 1006 1007 if (read_extvtoc(fd, &vtoc) >= 0) { 1008 for (i = 0; i < NDKMAP; i++) 1009 check_one_slice(r, diskname, i, 1010 vtoc.v_part[i].p_size, vtoc.v_sectorsz); 1011 } else if (efi_alloc_and_read(fd, &gpt) >= 0) { 1012 /* 1013 * on x86 we'll still have leftover links that point 1014 * to slices s[9-15], so use NDKMAP instead 1015 */ 1016 for (i = 0; i < NDKMAP; i++) 1017 check_one_slice(r, diskname, i, 1018 gpt->efi_parts[i].p_size, gpt->efi_lbasize); 1019 /* nodes p[1-4] are never used with EFI labels */ 1020 ptr[0] = 'p'; 1021 for (i = 1; i <= FD_NUMPART; i++) 1022 check_one_slice(r, diskname, i, 0, 1); 1023 efi_free(gpt); 1024 } 1025 } 1026 1027 static void 1028 zpool_open_func(void *arg) 1029 { 1030 rdsk_node_t *rn = arg; 1031 struct stat64 statbuf; 1032 nvlist_t *config; 1033 int fd; 1034 1035 if (rn->rn_nozpool) 1036 return; 1037 if ((fd = openat64(rn->rn_dfd, rn->rn_name, O_RDONLY)) < 0) { 1038 /* symlink to a device that's no longer there */ 1039 if (errno == ENOENT) 1040 nozpool_all_slices(rn->rn_avl, rn->rn_name); 1041 return; 1042 } 1043 /* 1044 * Ignore failed stats. We only want regular 1045 * files, character devs and block devs. 1046 */ 1047 if (fstat64(fd, &statbuf) != 0 || 1048 (!S_ISREG(statbuf.st_mode) && 1049 !S_ISCHR(statbuf.st_mode) && 1050 !S_ISBLK(statbuf.st_mode))) { 1051 (void) close(fd); 1052 return; 1053 } 1054 /* this file is too small to hold a zpool */ 1055 if (S_ISREG(statbuf.st_mode) && 1056 statbuf.st_size < SPA_MINDEVSIZE) { 1057 (void) close(fd); 1058 return; 1059 } else if (!S_ISREG(statbuf.st_mode)) { 1060 /* 1061 * Try to read the disk label first so we don't have to 1062 * open a bunch of minor nodes that can't have a zpool. 1063 */ 1064 check_slices(rn->rn_avl, fd, rn->rn_name); 1065 } 1066 1067 if ((zpool_read_label(fd, &config)) != 0) { 1068 (void) close(fd); 1069 (void) no_memory(rn->rn_hdl); 1070 return; 1071 } 1072 (void) close(fd); 1073 1074 1075 rn->rn_config = config; 1076 if (config != NULL) { 1077 assert(rn->rn_nozpool == B_FALSE); 1078 } 1079 } 1080 1081 /* 1082 * Given a file descriptor, clear (zero) the label information. This function 1083 * is currently only used in the appliance stack as part of the ZFS sysevent 1084 * module. 1085 */ 1086 int 1087 zpool_clear_label(int fd) 1088 { 1089 struct stat64 statbuf; 1090 int l; 1091 vdev_label_t *label; 1092 uint64_t size; 1093 1094 if (fstat64(fd, &statbuf) == -1) 1095 return (0); 1096 size = P2ALIGN_TYPED(statbuf.st_size, sizeof (vdev_label_t), uint64_t); 1097 1098 if ((label = calloc(sizeof (vdev_label_t), 1)) == NULL) 1099 return (-1); 1100 1101 for (l = 0; l < VDEV_LABELS; l++) { 1102 if (pwrite64(fd, label, sizeof (vdev_label_t), 1103 label_offset(size, l)) != sizeof (vdev_label_t)) 1104 return (-1); 1105 } 1106 1107 free(label); 1108 return (0); 1109 } 1110 1111 /* 1112 * Given a list of directories to search, find all pools stored on disk. This 1113 * includes partial pools which are not available to import. If no args are 1114 * given (argc is 0), then the default directory (/dev/dsk) is searched. 1115 * poolname or guid (but not both) are provided by the caller when trying 1116 * to import a specific pool. 1117 */ 1118 static nvlist_t * 1119 zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg) 1120 { 1121 int i, dirs = iarg->paths; 1122 DIR *dirp = NULL; 1123 struct dirent64 *dp; 1124 char path[MAXPATHLEN]; 1125 char *end, **dir = iarg->path; 1126 size_t pathleft; 1127 nvlist_t *ret = NULL; 1128 static char *default_dir = "/dev/dsk"; 1129 pool_list_t pools = { 0 }; 1130 pool_entry_t *pe, *penext; 1131 vdev_entry_t *ve, *venext; 1132 config_entry_t *ce, *cenext; 1133 name_entry_t *ne, *nenext; 1134 avl_tree_t slice_cache; 1135 rdsk_node_t *slice; 1136 void *cookie; 1137 1138 if (dirs == 0) { 1139 dirs = 1; 1140 dir = &default_dir; 1141 } 1142 1143 /* 1144 * Go through and read the label configuration information from every 1145 * possible device, organizing the information according to pool GUID 1146 * and toplevel GUID. 1147 */ 1148 for (i = 0; i < dirs; i++) { 1149 tpool_t *t; 1150 char *rdsk; 1151 int dfd; 1152 1153 /* use realpath to normalize the path */ 1154 if (realpath(dir[i], path) == 0) { 1155 (void) zfs_error_fmt(hdl, EZFS_BADPATH, 1156 dgettext(TEXT_DOMAIN, "cannot open '%s'"), dir[i]); 1157 goto error; 1158 } 1159 end = &path[strlen(path)]; 1160 *end++ = '/'; 1161 *end = 0; 1162 pathleft = &path[sizeof (path)] - end; 1163 1164 /* 1165 * Using raw devices instead of block devices when we're 1166 * reading the labels skips a bunch of slow operations during 1167 * close(2) processing, so we replace /dev/dsk with /dev/rdsk. 1168 */ 1169 if (strcmp(path, "/dev/dsk/") == 0) 1170 rdsk = "/dev/rdsk/"; 1171 else 1172 rdsk = path; 1173 1174 if ((dfd = open64(rdsk, O_RDONLY)) < 0 || 1175 (dirp = fdopendir(dfd)) == NULL) { 1176 zfs_error_aux(hdl, strerror(errno)); 1177 (void) zfs_error_fmt(hdl, EZFS_BADPATH, 1178 dgettext(TEXT_DOMAIN, "cannot open '%s'"), 1179 rdsk); 1180 goto error; 1181 } 1182 1183 avl_create(&slice_cache, slice_cache_compare, 1184 sizeof (rdsk_node_t), offsetof(rdsk_node_t, rn_node)); 1185 /* 1186 * This is not MT-safe, but we have no MT consumers of libzfs 1187 */ 1188 while ((dp = readdir64(dirp)) != NULL) { 1189 const char *name = dp->d_name; 1190 if (name[0] == '.' && 1191 (name[1] == 0 || (name[1] == '.' && name[2] == 0))) 1192 continue; 1193 1194 slice = zfs_alloc(hdl, sizeof (rdsk_node_t)); 1195 slice->rn_name = zfs_strdup(hdl, name); 1196 slice->rn_avl = &slice_cache; 1197 slice->rn_dfd = dfd; 1198 slice->rn_hdl = hdl; 1199 slice->rn_nozpool = B_FALSE; 1200 avl_add(&slice_cache, slice); 1201 } 1202 /* 1203 * create a thread pool to do all of this in parallel; 1204 * rn_nozpool is not protected, so this is racy in that 1205 * multiple tasks could decide that the same slice can 1206 * not hold a zpool, which is benign. Also choose 1207 * double the number of processors; we hold a lot of 1208 * locks in the kernel, so going beyond this doesn't 1209 * buy us much. 1210 */ 1211 t = tpool_create(1, 2 * sysconf(_SC_NPROCESSORS_ONLN), 1212 0, NULL); 1213 for (slice = avl_first(&slice_cache); slice; 1214 (slice = avl_walk(&slice_cache, slice, 1215 AVL_AFTER))) 1216 (void) tpool_dispatch(t, zpool_open_func, slice); 1217 tpool_wait(t); 1218 tpool_destroy(t); 1219 1220 cookie = NULL; 1221 while ((slice = avl_destroy_nodes(&slice_cache, 1222 &cookie)) != NULL) { 1223 if (slice->rn_config != NULL) { 1224 nvlist_t *config = slice->rn_config; 1225 boolean_t matched = B_TRUE; 1226 1227 if (iarg->poolname != NULL) { 1228 char *pname; 1229 1230 matched = nvlist_lookup_string(config, 1231 ZPOOL_CONFIG_POOL_NAME, 1232 &pname) == 0 && 1233 strcmp(iarg->poolname, pname) == 0; 1234 } else if (iarg->guid != 0) { 1235 uint64_t this_guid; 1236 1237 matched = nvlist_lookup_uint64(config, 1238 ZPOOL_CONFIG_POOL_GUID, 1239 &this_guid) == 0 && 1240 iarg->guid == this_guid; 1241 } 1242 if (!matched) { 1243 nvlist_free(config); 1244 config = NULL; 1245 continue; 1246 } 1247 /* use the non-raw path for the config */ 1248 (void) strlcpy(end, slice->rn_name, pathleft); 1249 if (add_config(hdl, &pools, path, config) != 0) 1250 goto error; 1251 } 1252 free(slice->rn_name); 1253 free(slice); 1254 } 1255 avl_destroy(&slice_cache); 1256 1257 (void) closedir(dirp); 1258 dirp = NULL; 1259 } 1260 1261 ret = get_configs(hdl, &pools, iarg->can_be_active); 1262 1263 error: 1264 for (pe = pools.pools; pe != NULL; pe = penext) { 1265 penext = pe->pe_next; 1266 for (ve = pe->pe_vdevs; ve != NULL; ve = venext) { 1267 venext = ve->ve_next; 1268 for (ce = ve->ve_configs; ce != NULL; ce = cenext) { 1269 cenext = ce->ce_next; 1270 if (ce->ce_config) 1271 nvlist_free(ce->ce_config); 1272 free(ce); 1273 } 1274 free(ve); 1275 } 1276 free(pe); 1277 } 1278 1279 for (ne = pools.names; ne != NULL; ne = nenext) { 1280 nenext = ne->ne_next; 1281 if (ne->ne_name) 1282 free(ne->ne_name); 1283 free(ne); 1284 } 1285 1286 if (dirp) 1287 (void) closedir(dirp); 1288 1289 return (ret); 1290 } 1291 1292 nvlist_t * 1293 zpool_find_import(libzfs_handle_t *hdl, int argc, char **argv) 1294 { 1295 importargs_t iarg = { 0 }; 1296 1297 iarg.paths = argc; 1298 iarg.path = argv; 1299 1300 return (zpool_find_import_impl(hdl, &iarg)); 1301 } 1302 1303 /* 1304 * Given a cache file, return the contents as a list of importable pools. 1305 * poolname or guid (but not both) are provided by the caller when trying 1306 * to import a specific pool. 1307 */ 1308 nvlist_t * 1309 zpool_find_import_cached(libzfs_handle_t *hdl, const char *cachefile, 1310 char *poolname, uint64_t guid) 1311 { 1312 char *buf; 1313 int fd; 1314 struct stat64 statbuf; 1315 nvlist_t *raw, *src, *dst; 1316 nvlist_t *pools; 1317 nvpair_t *elem; 1318 char *name; 1319 uint64_t this_guid; 1320 boolean_t active; 1321 1322 verify(poolname == NULL || guid == 0); 1323 1324 if ((fd = open(cachefile, O_RDONLY)) < 0) { 1325 zfs_error_aux(hdl, "%s", strerror(errno)); 1326 (void) zfs_error(hdl, EZFS_BADCACHE, 1327 dgettext(TEXT_DOMAIN, "failed to open cache file")); 1328 return (NULL); 1329 } 1330 1331 if (fstat64(fd, &statbuf) != 0) { 1332 zfs_error_aux(hdl, "%s", strerror(errno)); 1333 (void) close(fd); 1334 (void) zfs_error(hdl, EZFS_BADCACHE, 1335 dgettext(TEXT_DOMAIN, "failed to get size of cache file")); 1336 return (NULL); 1337 } 1338 1339 if ((buf = zfs_alloc(hdl, statbuf.st_size)) == NULL) { 1340 (void) close(fd); 1341 return (NULL); 1342 } 1343 1344 if (read(fd, buf, statbuf.st_size) != statbuf.st_size) { 1345 (void) close(fd); 1346 free(buf); 1347 (void) zfs_error(hdl, EZFS_BADCACHE, 1348 dgettext(TEXT_DOMAIN, 1349 "failed to read cache file contents")); 1350 return (NULL); 1351 } 1352 1353 (void) close(fd); 1354 1355 if (nvlist_unpack(buf, statbuf.st_size, &raw, 0) != 0) { 1356 free(buf); 1357 (void) zfs_error(hdl, EZFS_BADCACHE, 1358 dgettext(TEXT_DOMAIN, 1359 "invalid or corrupt cache file contents")); 1360 return (NULL); 1361 } 1362 1363 free(buf); 1364 1365 /* 1366 * Go through and get the current state of the pools and refresh their 1367 * state. 1368 */ 1369 if (nvlist_alloc(&pools, 0, 0) != 0) { 1370 (void) no_memory(hdl); 1371 nvlist_free(raw); 1372 return (NULL); 1373 } 1374 1375 elem = NULL; 1376 while ((elem = nvlist_next_nvpair(raw, elem)) != NULL) { 1377 verify(nvpair_value_nvlist(elem, &src) == 0); 1378 1379 verify(nvlist_lookup_string(src, ZPOOL_CONFIG_POOL_NAME, 1380 &name) == 0); 1381 if (poolname != NULL && strcmp(poolname, name) != 0) 1382 continue; 1383 1384 verify(nvlist_lookup_uint64(src, ZPOOL_CONFIG_POOL_GUID, 1385 &this_guid) == 0); 1386 if (guid != 0) { 1387 verify(nvlist_lookup_uint64(src, ZPOOL_CONFIG_POOL_GUID, 1388 &this_guid) == 0); 1389 if (guid != this_guid) 1390 continue; 1391 } 1392 1393 if (pool_active(hdl, name, this_guid, &active) != 0) { 1394 nvlist_free(raw); 1395 nvlist_free(pools); 1396 return (NULL); 1397 } 1398 1399 if (active) 1400 continue; 1401 1402 if ((dst = refresh_config(hdl, src)) == NULL) { 1403 nvlist_free(raw); 1404 nvlist_free(pools); 1405 return (NULL); 1406 } 1407 1408 if (nvlist_add_nvlist(pools, nvpair_name(elem), dst) != 0) { 1409 (void) no_memory(hdl); 1410 nvlist_free(dst); 1411 nvlist_free(raw); 1412 nvlist_free(pools); 1413 return (NULL); 1414 } 1415 nvlist_free(dst); 1416 } 1417 1418 nvlist_free(raw); 1419 return (pools); 1420 } 1421 1422 static int 1423 name_or_guid_exists(zpool_handle_t *zhp, void *data) 1424 { 1425 importargs_t *import = data; 1426 int found = 0; 1427 1428 if (import->poolname != NULL) { 1429 char *pool_name; 1430 1431 verify(nvlist_lookup_string(zhp->zpool_config, 1432 ZPOOL_CONFIG_POOL_NAME, &pool_name) == 0); 1433 if (strcmp(pool_name, import->poolname) == 0) 1434 found = 1; 1435 } else { 1436 uint64_t pool_guid; 1437 1438 verify(nvlist_lookup_uint64(zhp->zpool_config, 1439 ZPOOL_CONFIG_POOL_GUID, &pool_guid) == 0); 1440 if (pool_guid == import->guid) 1441 found = 1; 1442 } 1443 1444 zpool_close(zhp); 1445 return (found); 1446 } 1447 1448 nvlist_t * 1449 zpool_search_import(libzfs_handle_t *hdl, importargs_t *import) 1450 { 1451 verify(import->poolname == NULL || import->guid == 0); 1452 1453 if (import->unique) 1454 import->exists = zpool_iter(hdl, name_or_guid_exists, import); 1455 1456 if (import->cachefile != NULL) 1457 return (zpool_find_import_cached(hdl, import->cachefile, 1458 import->poolname, import->guid)); 1459 1460 return (zpool_find_import_impl(hdl, import)); 1461 } 1462 1463 boolean_t 1464 find_guid(nvlist_t *nv, uint64_t guid) 1465 { 1466 uint64_t tmp; 1467 nvlist_t **child; 1468 uint_t c, children; 1469 1470 verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &tmp) == 0); 1471 if (tmp == guid) 1472 return (B_TRUE); 1473 1474 if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, 1475 &child, &children) == 0) { 1476 for (c = 0; c < children; c++) 1477 if (find_guid(child[c], guid)) 1478 return (B_TRUE); 1479 } 1480 1481 return (B_FALSE); 1482 } 1483 1484 typedef struct aux_cbdata { 1485 const char *cb_type; 1486 uint64_t cb_guid; 1487 zpool_handle_t *cb_zhp; 1488 } aux_cbdata_t; 1489 1490 static int 1491 find_aux(zpool_handle_t *zhp, void *data) 1492 { 1493 aux_cbdata_t *cbp = data; 1494 nvlist_t **list; 1495 uint_t i, count; 1496 uint64_t guid; 1497 nvlist_t *nvroot; 1498 1499 verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE, 1500 &nvroot) == 0); 1501 1502 if (nvlist_lookup_nvlist_array(nvroot, cbp->cb_type, 1503 &list, &count) == 0) { 1504 for (i = 0; i < count; i++) { 1505 verify(nvlist_lookup_uint64(list[i], 1506 ZPOOL_CONFIG_GUID, &guid) == 0); 1507 if (guid == cbp->cb_guid) { 1508 cbp->cb_zhp = zhp; 1509 return (1); 1510 } 1511 } 1512 } 1513 1514 zpool_close(zhp); 1515 return (0); 1516 } 1517 1518 /* 1519 * Determines if the pool is in use. If so, it returns true and the state of 1520 * the pool as well as the name of the pool. Both strings are allocated and 1521 * must be freed by the caller. 1522 */ 1523 int 1524 zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr, 1525 boolean_t *inuse) 1526 { 1527 nvlist_t *config; 1528 char *name; 1529 boolean_t ret; 1530 uint64_t guid, vdev_guid; 1531 zpool_handle_t *zhp; 1532 nvlist_t *pool_config; 1533 uint64_t stateval, isspare; 1534 aux_cbdata_t cb = { 0 }; 1535 boolean_t isactive; 1536 1537 *inuse = B_FALSE; 1538 1539 if (zpool_read_label(fd, &config) != 0) { 1540 (void) no_memory(hdl); 1541 return (-1); 1542 } 1543 1544 if (config == NULL) 1545 return (0); 1546 1547 verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, 1548 &stateval) == 0); 1549 verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, 1550 &vdev_guid) == 0); 1551 1552 if (stateval != POOL_STATE_SPARE && stateval != POOL_STATE_L2CACHE) { 1553 verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, 1554 &name) == 0); 1555 verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, 1556 &guid) == 0); 1557 } 1558 1559 switch (stateval) { 1560 case POOL_STATE_EXPORTED: 1561 /* 1562 * A pool with an exported state may in fact be imported 1563 * read-only, so check the in-core state to see if it's 1564 * active and imported read-only. If it is, set 1565 * its state to active. 1566 */ 1567 if (pool_active(hdl, name, guid, &isactive) == 0 && isactive && 1568 (zhp = zpool_open_canfail(hdl, name)) != NULL && 1569 zpool_get_prop_int(zhp, ZPOOL_PROP_READONLY, NULL)) 1570 stateval = POOL_STATE_ACTIVE; 1571 1572 ret = B_TRUE; 1573 break; 1574 1575 case POOL_STATE_ACTIVE: 1576 /* 1577 * For an active pool, we have to determine if it's really part 1578 * of a currently active pool (in which case the pool will exist 1579 * and the guid will be the same), or whether it's part of an 1580 * active pool that was disconnected without being explicitly 1581 * exported. 1582 */ 1583 if (pool_active(hdl, name, guid, &isactive) != 0) { 1584 nvlist_free(config); 1585 return (-1); 1586 } 1587 1588 if (isactive) { 1589 /* 1590 * Because the device may have been removed while 1591 * offlined, we only report it as active if the vdev is 1592 * still present in the config. Otherwise, pretend like 1593 * it's not in use. 1594 */ 1595 if ((zhp = zpool_open_canfail(hdl, name)) != NULL && 1596 (pool_config = zpool_get_config(zhp, NULL)) 1597 != NULL) { 1598 nvlist_t *nvroot; 1599 1600 verify(nvlist_lookup_nvlist(pool_config, 1601 ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); 1602 ret = find_guid(nvroot, vdev_guid); 1603 } else { 1604 ret = B_FALSE; 1605 } 1606 1607 /* 1608 * If this is an active spare within another pool, we 1609 * treat it like an unused hot spare. This allows the 1610 * user to create a pool with a hot spare that currently 1611 * in use within another pool. Since we return B_TRUE, 1612 * libdiskmgt will continue to prevent generic consumers 1613 * from using the device. 1614 */ 1615 if (ret && nvlist_lookup_uint64(config, 1616 ZPOOL_CONFIG_IS_SPARE, &isspare) == 0 && isspare) 1617 stateval = POOL_STATE_SPARE; 1618 1619 if (zhp != NULL) 1620 zpool_close(zhp); 1621 } else { 1622 stateval = POOL_STATE_POTENTIALLY_ACTIVE; 1623 ret = B_TRUE; 1624 } 1625 break; 1626 1627 case POOL_STATE_SPARE: 1628 /* 1629 * For a hot spare, it can be either definitively in use, or 1630 * potentially active. To determine if it's in use, we iterate 1631 * over all pools in the system and search for one with a spare 1632 * with a matching guid. 1633 * 1634 * Due to the shared nature of spares, we don't actually report 1635 * the potentially active case as in use. This means the user 1636 * can freely create pools on the hot spares of exported pools, 1637 * but to do otherwise makes the resulting code complicated, and 1638 * we end up having to deal with this case anyway. 1639 */ 1640 cb.cb_zhp = NULL; 1641 cb.cb_guid = vdev_guid; 1642 cb.cb_type = ZPOOL_CONFIG_SPARES; 1643 if (zpool_iter(hdl, find_aux, &cb) == 1) { 1644 name = (char *)zpool_get_name(cb.cb_zhp); 1645 ret = TRUE; 1646 } else { 1647 ret = FALSE; 1648 } 1649 break; 1650 1651 case POOL_STATE_L2CACHE: 1652 1653 /* 1654 * Check if any pool is currently using this l2cache device. 1655 */ 1656 cb.cb_zhp = NULL; 1657 cb.cb_guid = vdev_guid; 1658 cb.cb_type = ZPOOL_CONFIG_L2CACHE; 1659 if (zpool_iter(hdl, find_aux, &cb) == 1) { 1660 name = (char *)zpool_get_name(cb.cb_zhp); 1661 ret = TRUE; 1662 } else { 1663 ret = FALSE; 1664 } 1665 break; 1666 1667 default: 1668 ret = B_FALSE; 1669 } 1670 1671 1672 if (ret) { 1673 if ((*namestr = zfs_strdup(hdl, name)) == NULL) { 1674 if (cb.cb_zhp) 1675 zpool_close(cb.cb_zhp); 1676 nvlist_free(config); 1677 return (-1); 1678 } 1679 *state = (pool_state_t)stateval; 1680 } 1681 1682 if (cb.cb_zhp) 1683 zpool_close(cb.cb_zhp); 1684 1685 nvlist_free(config); 1686 *inuse = ret; 1687 return (0); 1688 } 1689