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 <libdevinfo.h> 33 #include <libintl.h> 34 #include <math.h> 35 #include <stdio.h> 36 #include <stdlib.h> 37 #include <strings.h> 38 #include <unistd.h> 39 #include <zone.h> 40 #include <sys/mntent.h> 41 #include <sys/mnttab.h> 42 43 #include <sys/spa.h> 44 #include <sys/zio.h> 45 #include <libzfs.h> 46 47 #include "zfs_namecheck.h" 48 #include "zfs_prop.h" 49 #include "libzfs_impl.h" 50 51 /* 52 * Given a single type (not a mask of types), return the type in a human 53 * readable form. 54 */ 55 const char * 56 zfs_type_to_name(zfs_type_t type) 57 { 58 switch (type) { 59 case ZFS_TYPE_FILESYSTEM: 60 return (dgettext(TEXT_DOMAIN, "filesystem")); 61 case ZFS_TYPE_SNAPSHOT: 62 return (dgettext(TEXT_DOMAIN, "snapshot")); 63 case ZFS_TYPE_VOLUME: 64 return (dgettext(TEXT_DOMAIN, "volume")); 65 } 66 67 zfs_baderror(type); 68 return (NULL); 69 } 70 71 /* 72 * Given a path and mask of ZFS types, return a string describing this dataset. 73 * This is used when we fail to open a dataset and we cannot get an exact type. 74 * We guess what the type would have been based on the path and the mask of 75 * acceptable types. 76 */ 77 static const char * 78 path_to_str(const char *path, int types) 79 { 80 /* 81 * When given a single type, always report the exact type. 82 */ 83 if (types == ZFS_TYPE_SNAPSHOT) 84 return (dgettext(TEXT_DOMAIN, "snapshot")); 85 if (types == ZFS_TYPE_FILESYSTEM) 86 return (dgettext(TEXT_DOMAIN, "filesystem")); 87 if (types == ZFS_TYPE_VOLUME) 88 return (dgettext(TEXT_DOMAIN, "volume")); 89 90 /* 91 * The user is requesting more than one type of dataset. If this is the 92 * case, consult the path itself. If we're looking for a snapshot, and 93 * a '@' is found, then report it as "snapshot". Otherwise, remove the 94 * snapshot attribute and try again. 95 */ 96 if (types & ZFS_TYPE_SNAPSHOT) { 97 if (strchr(path, '@') != NULL) 98 return (dgettext(TEXT_DOMAIN, "snapshot")); 99 return (path_to_str(path, types & ~ZFS_TYPE_SNAPSHOT)); 100 } 101 102 103 /* 104 * The user has requested either filesystems or volumes. 105 * We have no way of knowing a priori what type this would be, so always 106 * report it as "filesystem" or "volume", our two primitive types. 107 */ 108 if (types & ZFS_TYPE_FILESYSTEM) 109 return (dgettext(TEXT_DOMAIN, "filesystem")); 110 111 assert(types & ZFS_TYPE_VOLUME); 112 return (dgettext(TEXT_DOMAIN, "volume")); 113 } 114 115 /* 116 * Validate a ZFS path. This is used even before trying to open the dataset, to 117 * provide a more meaningful error message. We place a more useful message in 118 * 'buf' detailing exactly why the name was not valid. 119 */ 120 static int 121 zfs_validate_name(const char *path, int type, char *buf, size_t buflen) 122 { 123 namecheck_err_t why; 124 char what; 125 126 if (dataset_namecheck(path, &why, &what) != 0) { 127 if (buf != NULL) { 128 switch (why) { 129 case NAME_ERR_TOOLONG: 130 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 131 "name is too long"), buflen); 132 break; 133 134 case NAME_ERR_LEADING_SLASH: 135 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 136 "leading slash"), buflen); 137 break; 138 139 case NAME_ERR_EMPTY_COMPONENT: 140 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 141 "empty component"), buflen); 142 break; 143 144 case NAME_ERR_TRAILING_SLASH: 145 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 146 "trailing slash"), buflen); 147 break; 148 149 case NAME_ERR_INVALCHAR: 150 (void) snprintf(buf, buflen, 151 dgettext(TEXT_DOMAIN, "invalid character " 152 "'%c'"), what); 153 break; 154 155 case NAME_ERR_MULTIPLE_AT: 156 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 157 "multiple '@' delimiters"), buflen); 158 break; 159 } 160 } 161 162 return (0); 163 } 164 165 if (!(type & ZFS_TYPE_SNAPSHOT) && strchr(path, '@') != NULL) { 166 if (buf != NULL) 167 (void) strlcpy(buf, 168 dgettext(TEXT_DOMAIN, 169 "snapshot delimiter '@'"), buflen); 170 return (0); 171 } 172 173 return (1); 174 } 175 176 int 177 zfs_name_valid(const char *name, zfs_type_t type) 178 { 179 return (zfs_validate_name(name, type, NULL, NULL)); 180 } 181 182 /* 183 * Utility function to gather stats (objset and zpl) for the given object. 184 */ 185 static int 186 get_stats(zfs_handle_t *zhp) 187 { 188 zfs_cmd_t zc = { 0 }; 189 190 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 191 192 /* 193 * get the generic DMU stats and per-type (zfs, zvol) stats 194 */ 195 if (ioctl(zfs_fd, ZFS_IOC_OBJSET_STATS, &zc) != 0) 196 return (-1); 197 198 bcopy(&zc.zc_objset_stats, &zhp->zfs_dmustats, 199 sizeof (zc.zc_objset_stats)); 200 201 bcopy(&zc.zc_zfs_stats, &zhp->zfs_zplstats, sizeof (zc.zc_zfs_stats)); 202 203 zhp->zfs_volsize = zc.zc_volsize; 204 zhp->zfs_volblocksize = zc.zc_volblocksize; 205 206 return (0); 207 } 208 209 /* 210 * Refresh the properties currently stored in the handle. 211 */ 212 void 213 zfs_refresh_properties(zfs_handle_t *zhp) 214 { 215 (void) get_stats(zhp); 216 } 217 218 /* 219 * Makes a handle from the given dataset name. Used by zfs_open() and 220 * zfs_iter_* to create child handles on the fly. 221 */ 222 zfs_handle_t * 223 make_dataset_handle(const char *path) 224 { 225 zfs_handle_t *zhp = zfs_malloc(sizeof (zfs_handle_t)); 226 227 (void) strlcpy(zhp->zfs_name, path, sizeof (zhp->zfs_name)); 228 229 if (get_stats(zhp) != 0) { 230 free(zhp); 231 return (NULL); 232 } 233 234 /* 235 * We've managed to open the dataset and gather statistics. Determine 236 * the high-level type. 237 */ 238 if (zhp->zfs_dmustats.dds_is_snapshot) 239 zhp->zfs_type = ZFS_TYPE_SNAPSHOT; 240 else if (zhp->zfs_dmustats.dds_type == DMU_OST_ZVOL) 241 zhp->zfs_type = ZFS_TYPE_VOLUME; 242 else if (zhp->zfs_dmustats.dds_type == DMU_OST_ZFS) 243 zhp->zfs_type = ZFS_TYPE_FILESYSTEM; 244 else 245 /* we should never see any other dataset types */ 246 zfs_baderror(zhp->zfs_dmustats.dds_type); 247 248 return (zhp); 249 } 250 251 /* 252 * Opens the given snapshot, filesystem, or volume. The 'types' 253 * argument is a mask of acceptable types. The function will print an 254 * appropriate error message and return NULL if it can't be opened. 255 */ 256 zfs_handle_t * 257 zfs_open(const char *path, int types) 258 { 259 zfs_handle_t *zhp; 260 261 /* 262 * Validate the name before we even try to open it. We don't care about 263 * the verbose invalid messages here; just report a generic error. 264 */ 265 if (!zfs_validate_name(path, types, NULL, 0)) { 266 zfs_error(dgettext(TEXT_DOMAIN, 267 "cannot open '%s': invalid %s name"), path, 268 path_to_str(path, types)); 269 return (NULL); 270 } 271 272 /* 273 * Try to get stats for the dataset, which will tell us if it exists. 274 */ 275 errno = 0; 276 if ((zhp = make_dataset_handle(path)) == NULL) { 277 switch (errno) { 278 case ENOENT: 279 /* 280 * The dataset doesn't exist. 281 */ 282 zfs_error(dgettext(TEXT_DOMAIN, 283 "cannot open '%s': no such %s"), path, 284 path_to_str(path, types)); 285 break; 286 287 case EBUSY: 288 /* 289 * We were able to open the dataset but couldn't 290 * get the stats. 291 */ 292 zfs_error(dgettext(TEXT_DOMAIN, 293 "cannot open '%s': %s is busy"), path, 294 path_to_str(path, types)); 295 break; 296 297 default: 298 zfs_baderror(errno); 299 300 } 301 return (NULL); 302 } 303 304 if (!(types & zhp->zfs_type)) { 305 zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': operation " 306 "not supported for %ss"), path, 307 zfs_type_to_name(zhp->zfs_type)); 308 free(zhp); 309 return (NULL); 310 } 311 312 return (zhp); 313 } 314 315 /* 316 * Release a ZFS handle. Nothing to do but free the associated memory. 317 */ 318 void 319 zfs_close(zfs_handle_t *zhp) 320 { 321 if (zhp->zfs_mntopts) 322 free(zhp->zfs_mntopts); 323 free(zhp); 324 } 325 326 struct { 327 const char *name; 328 uint64_t value; 329 } checksum_table[] = { 330 { "on", ZIO_CHECKSUM_ON }, 331 { "off", ZIO_CHECKSUM_OFF }, 332 { "fletcher2", ZIO_CHECKSUM_FLETCHER_2 }, 333 { "fletcher4", ZIO_CHECKSUM_FLETCHER_4 }, 334 { "sha256", ZIO_CHECKSUM_SHA256 }, 335 { NULL } 336 }; 337 338 struct { 339 const char *name; 340 uint64_t value; 341 } compress_table[] = { 342 { "on", ZIO_COMPRESS_ON }, 343 { "off", ZIO_COMPRESS_OFF }, 344 { "lzjb", ZIO_COMPRESS_LZJB }, 345 { NULL } 346 }; 347 348 struct { 349 const char *name; 350 uint64_t value; 351 } snapdir_table[] = { 352 { "hidden", ZFS_SNAPDIR_HIDDEN }, 353 { "visible", ZFS_SNAPDIR_VISIBLE }, 354 { NULL } 355 }; 356 357 struct { 358 const char *name; 359 uint64_t value; 360 } acl_mode_table[] = { 361 { "discard", DISCARD }, 362 { "groupmask", GROUPMASK }, 363 { "passthrough", PASSTHROUGH }, 364 { NULL } 365 }; 366 367 struct { 368 const char *name; 369 uint64_t value; 370 } acl_inherit_table[] = { 371 { "discard", DISCARD }, 372 { "noallow", NOALLOW }, 373 { "secure", SECURE }, 374 { "passthrough", PASSTHROUGH }, 375 { NULL } 376 }; 377 378 379 /* 380 * Given a numeric suffix, convert the value into a number of bits that the 381 * resulting value must be shifted. 382 */ 383 static int 384 str2shift(const char *buf, char *reason, size_t len) 385 { 386 const char *ends = "BKMGTPEZ"; 387 int i; 388 389 if (buf[0] == '\0') 390 return (0); 391 for (i = 0; i < strlen(ends); i++) { 392 if (toupper(buf[0]) == ends[i]) 393 break; 394 } 395 if (i == strlen(ends)) { 396 (void) snprintf(reason, len, dgettext(TEXT_DOMAIN, "invalid " 397 "numeric suffix '%s'"), buf); 398 return (-1); 399 } 400 401 /* 402 * We want to allow trailing 'b' characters for 'GB' or 'Mb'. But don't 403 * allow 'BB' - that's just weird. 404 */ 405 if (buf[1] == '\0' || (toupper(buf[1]) == 'B' && buf[2] == '\0' && 406 toupper(buf[0]) != 'B')) { 407 return (10*i); 408 } 409 410 (void) snprintf(reason, len, dgettext(TEXT_DOMAIN, "invalid numeric " 411 "suffix '%s'"), buf); 412 return (-1); 413 } 414 415 /* 416 * Convert a string of the form '100G' into a real number. Used when setting 417 * properties or creating a volume. 'buf' is used to place an extended error 418 * message for the caller to use. 419 */ 420 static int 421 nicestrtonum(const char *value, uint64_t *num, char *buf, size_t buflen) 422 { 423 char *end; 424 int shift; 425 426 *num = 0; 427 428 /* Check to see if this looks like a number. */ 429 if ((value[0] < '0' || value[0] > '9') && value[0] != '.') { 430 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 431 "must be a numeric value"), buflen); 432 return (-1); 433 } 434 435 /* Rely on stroll() to process the numeric portion. */ 436 errno = 0; 437 *num = strtoll(value, &end, 10); 438 439 /* 440 * Check for ERANGE, which indicates that the value is too large to fit 441 * in a 64-bit value. 442 */ 443 if (errno == ERANGE) { 444 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 445 "value is too large"), buflen); 446 return (-1); 447 } 448 449 /* 450 * If we have a decimal value, then do the computation with floating 451 * point arithmetic. Otherwise, use standard arithmetic. 452 */ 453 if (*end == '.') { 454 double fval = strtod(value, &end); 455 456 if ((shift = str2shift(end, buf, buflen)) == -1) 457 return (-1); 458 459 fval *= pow(2, shift); 460 461 if (fval > UINT64_MAX) { 462 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 463 "value is too large"), buflen); 464 return (-1); 465 } 466 467 *num = (uint64_t)fval; 468 } else { 469 if ((shift = str2shift(end, buf, buflen)) == -1) 470 return (-1); 471 472 /* Check for overflow */ 473 if (shift >= 64 || (*num << shift) >> shift != *num) { 474 (void) strlcpy(buf, dgettext(TEXT_DOMAIN, 475 "value is too large"), buflen); 476 return (-1); 477 } 478 479 *num <<= shift; 480 } 481 482 return (0); 483 } 484 485 int 486 zfs_nicestrtonum(const char *str, uint64_t *val) 487 { 488 char buf[1]; 489 490 return (nicestrtonum(str, val, buf, sizeof (buf))); 491 } 492 493 /* 494 * Given a property type and value, verify that the value is appropriate. Used 495 * by zfs_prop_set() and some libzfs consumers. 496 */ 497 int 498 zfs_prop_validate(zfs_prop_t prop, const char *value, uint64_t *intval) 499 { 500 const char *propname = zfs_prop_to_name(prop); 501 uint64_t number; 502 char reason[64]; 503 int i; 504 505 /* 506 * Check to see if this a read-only property. 507 */ 508 if (zfs_prop_readonly(prop)) { 509 zfs_error(dgettext(TEXT_DOMAIN, 510 "cannot set %s property: read-only property"), propname); 511 return (-1); 512 } 513 514 /* See if the property value is too long */ 515 if (strlen(value) >= ZFS_MAXPROPLEN) { 516 zfs_error(dgettext(TEXT_DOMAIN, 517 "bad %s value '%s': value is too long"), propname, 518 value); 519 return (-1); 520 } 521 522 /* Perform basic checking based on property type */ 523 switch (zfs_prop_get_type(prop)) { 524 case prop_type_boolean: 525 if (strcmp(value, "on") == 0) { 526 number = 1; 527 } else if (strcmp(value, "off") == 0) { 528 number = 0; 529 } else { 530 zfs_error(dgettext(TEXT_DOMAIN, 531 "bad %s value '%s': must be 'on' or 'off'"), 532 propname, value); 533 return (-1); 534 } 535 break; 536 537 case prop_type_number: 538 /* treat 'none' as 0 */ 539 if (strcmp(value, "none") == 0) { 540 number = 0; 541 break; 542 } 543 544 if (nicestrtonum(value, &number, reason, 545 sizeof (reason)) != 0) { 546 zfs_error(dgettext(TEXT_DOMAIN, 547 "bad %s value '%s': %s"), propname, value, 548 reason); 549 return (-1); 550 } 551 552 /* don't allow 0 for quota, use 'none' instead */ 553 if (prop == ZFS_PROP_QUOTA && number == 0 && 554 strcmp(value, "none") != 0) { 555 zfs_error(dgettext(TEXT_DOMAIN, 556 "bad %s value '%s': use '%s=none' to disable"), 557 propname, value, propname); 558 return (-1); 559 } 560 561 /* must be power of two within SPA_{MIN,MAX}BLOCKSIZE */ 562 if (prop == ZFS_PROP_RECORDSIZE || 563 prop == ZFS_PROP_VOLBLOCKSIZE) { 564 if (number < SPA_MINBLOCKSIZE || 565 number > SPA_MAXBLOCKSIZE || !ISP2(number)) { 566 zfs_error(dgettext(TEXT_DOMAIN, 567 "bad %s value '%s': " 568 "must be power of 2 from %u to %uk"), 569 propname, value, 570 (uint_t)SPA_MINBLOCKSIZE, 571 (uint_t)SPA_MAXBLOCKSIZE >> 10); 572 return (-1); 573 } 574 } 575 576 break; 577 578 case prop_type_string: 579 case prop_type_index: 580 /* 581 * The two writable string values, 'mountpoint' and 582 * 'checksum' need special consideration. The 'index' types are 583 * specified as strings by the user, but passed to the kernel as 584 * integers. 585 */ 586 switch (prop) { 587 case ZFS_PROP_MOUNTPOINT: 588 if (strcmp(value, ZFS_MOUNTPOINT_NONE) == 0 || 589 strcmp(value, ZFS_MOUNTPOINT_LEGACY) == 0) 590 break; 591 592 if (value[0] != '/') { 593 zfs_error(dgettext(TEXT_DOMAIN, 594 "bad %s value '%s': must be an absolute " 595 "path, 'none', or 'legacy'"), 596 propname, value); 597 return (-1); 598 } 599 break; 600 601 case ZFS_PROP_CHECKSUM: 602 for (i = 0; checksum_table[i].name != NULL; i++) { 603 if (strcmp(value, checksum_table[i].name) 604 == 0) { 605 number = checksum_table[i].value; 606 break; 607 } 608 } 609 610 if (checksum_table[i].name == NULL) { 611 zfs_error(dgettext(TEXT_DOMAIN, 612 "bad %s value '%s': must be 'on', 'off', " 613 "'fletcher2', 'fletcher4', or 'sha256'"), 614 propname, value); 615 return (-1); 616 } 617 break; 618 619 case ZFS_PROP_COMPRESSION: 620 for (i = 0; compress_table[i].name != NULL; i++) { 621 if (strcmp(value, compress_table[i].name) 622 == 0) { 623 number = compress_table[i].value; 624 break; 625 } 626 } 627 628 if (compress_table[i].name == NULL) { 629 zfs_error(dgettext(TEXT_DOMAIN, 630 "bad %s value '%s': must be 'on', 'off', " 631 "or 'lzjb'"), 632 propname, value); 633 return (-1); 634 } 635 break; 636 637 case ZFS_PROP_SNAPDIR: 638 for (i = 0; snapdir_table[i].name != NULL; i++) { 639 if (strcmp(value, snapdir_table[i].name) == 0) { 640 number = snapdir_table[i].value; 641 break; 642 } 643 } 644 645 if (snapdir_table[i].name == NULL) { 646 zfs_error(dgettext(TEXT_DOMAIN, 647 "bad %s value '%s': must be 'hidden' " 648 "or 'visible'"), 649 propname, value); 650 return (-1); 651 } 652 break; 653 654 case ZFS_PROP_ACLMODE: 655 for (i = 0; acl_mode_table[i].name != NULL; i++) { 656 if (strcmp(value, acl_mode_table[i].name) 657 == 0) { 658 number = acl_mode_table[i].value; 659 break; 660 } 661 } 662 663 if (acl_mode_table[i].name == NULL) { 664 zfs_error(dgettext(TEXT_DOMAIN, 665 "bad %s value '%s': must be 'discard', " 666 "'groupmask' or 'passthrough'"), 667 propname, value); 668 return (-1); 669 } 670 break; 671 672 case ZFS_PROP_ACLINHERIT: 673 for (i = 0; acl_inherit_table[i].name != NULL; i++) { 674 if (strcmp(value, acl_inherit_table[i].name) 675 == 0) { 676 number = acl_inherit_table[i].value; 677 break; 678 } 679 } 680 681 if (acl_inherit_table[i].name == NULL) { 682 zfs_error(dgettext(TEXT_DOMAIN, 683 "bad %s value '%s': must be 'discard', " 684 "'noallow', 'secure' or 'passthrough'"), 685 propname, value); 686 return (-1); 687 } 688 break; 689 690 case ZFS_PROP_SHARENFS: 691 /* 692 * Nothing to do for 'sharenfs', this gets passed on to 693 * share(1M) verbatim. 694 */ 695 break; 696 } 697 } 698 699 if (intval != NULL) 700 *intval = number; 701 702 return (0); 703 } 704 705 /* 706 * Given a property name and value, set the property for the given dataset. 707 */ 708 int 709 zfs_prop_set(zfs_handle_t *zhp, zfs_prop_t prop, const char *propval) 710 { 711 const char *propname = zfs_prop_to_name(prop); 712 uint64_t number; 713 zfs_cmd_t zc = { 0 }; 714 int ret; 715 prop_changelist_t *cl; 716 717 if (zfs_prop_validate(prop, propval, &number) != 0) 718 return (-1); 719 720 /* 721 * Check to see if the value applies to this type 722 */ 723 if (!zfs_prop_valid_for_type(prop, zhp->zfs_type)) { 724 zfs_error(dgettext(TEXT_DOMAIN, 725 "cannot set %s for '%s': property does not apply to %ss"), 726 propname, zhp->zfs_name, zfs_type_to_name(zhp->zfs_type)); 727 return (-1); 728 } 729 730 /* 731 * For the mountpoint and sharenfs properties, check if it can be set 732 * in a global/non-global zone based on the zoned property value: 733 * 734 * global zone non-global zone 735 * ----------------------------------------------------- 736 * zoned=on mountpoint (no) mountpoint (yes) 737 * sharenfs (no) sharenfs (no) 738 * 739 * zoned=off mountpoint (yes) N/A 740 * sharenfs (yes) 741 */ 742 if (prop == ZFS_PROP_MOUNTPOINT || prop == ZFS_PROP_SHARENFS) { 743 if (zfs_prop_get_int(zhp, ZFS_PROP_ZONED)) { 744 if (getzoneid() == GLOBAL_ZONEID) { 745 zfs_error(dgettext(TEXT_DOMAIN, 746 "cannot set %s for '%s', " 747 "dataset is used in a non-global zone"), 748 propname, zhp->zfs_name); 749 return (-1); 750 } else if (prop == ZFS_PROP_SHARENFS) { 751 zfs_error(dgettext(TEXT_DOMAIN, 752 "cannot set %s for '%s', filesystems " 753 "cannot be shared in a non-global zone"), 754 propname, zhp->zfs_name); 755 return (-1); 756 } 757 } else if (getzoneid() != GLOBAL_ZONEID) { 758 /* 759 * If zoned property is 'off', this must be in 760 * a globle zone. If not, something is wrong. 761 */ 762 zfs_error(dgettext(TEXT_DOMAIN, 763 "cannot set %s for '%s', dataset is " 764 "used in a non-global zone, but 'zoned' " 765 "property is not set"), 766 propname, zhp->zfs_name); 767 return (-1); 768 } 769 } 770 771 if ((cl = changelist_gather(zhp, prop, 0)) == NULL) 772 return (-1); 773 774 if (prop == ZFS_PROP_MOUNTPOINT && changelist_haszonedchild(cl)) { 775 zfs_error(dgettext(TEXT_DOMAIN, "cannot set %s for '%s', " 776 "child dataset with inherited mountpoint is used " 777 "in a non-global zone"), 778 propname, zhp->zfs_name); 779 ret = -1; 780 goto error; 781 } 782 783 if ((ret = changelist_prefix(cl)) != 0) 784 goto error; 785 786 /* 787 * Execute the corresponding ioctl() to set this property. 788 */ 789 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 790 791 switch (prop) { 792 case ZFS_PROP_QUOTA: 793 zc.zc_cookie = number; 794 ret = ioctl(zfs_fd, ZFS_IOC_SET_QUOTA, &zc); 795 break; 796 case ZFS_PROP_RESERVATION: 797 zc.zc_cookie = number; 798 ret = ioctl(zfs_fd, ZFS_IOC_SET_RESERVATION, &zc); 799 break; 800 case ZFS_PROP_MOUNTPOINT: 801 case ZFS_PROP_SHARENFS: 802 /* 803 * These properties are passed down as real strings. 804 */ 805 (void) strlcpy(zc.zc_prop_name, propname, 806 sizeof (zc.zc_prop_name)); 807 (void) strlcpy(zc.zc_prop_value, propval, 808 sizeof (zc.zc_prop_value)); 809 zc.zc_intsz = 1; 810 zc.zc_numints = strlen(propval) + 1; 811 ret = ioctl(zfs_fd, ZFS_IOC_SET_PROP, &zc); 812 break; 813 case ZFS_PROP_VOLSIZE: 814 zc.zc_volsize = number; 815 ret = ioctl(zfs_fd, ZFS_IOC_SET_VOLSIZE, &zc); 816 break; 817 case ZFS_PROP_VOLBLOCKSIZE: 818 zc.zc_volblocksize = number; 819 ret = ioctl(zfs_fd, ZFS_IOC_SET_VOLBLOCKSIZE, &zc); 820 break; 821 default: 822 (void) strlcpy(zc.zc_prop_name, propname, 823 sizeof (zc.zc_prop_name)); 824 /* LINTED - alignment */ 825 *(uint64_t *)zc.zc_prop_value = number; 826 zc.zc_intsz = 8; 827 zc.zc_numints = 1; 828 ret = ioctl(zfs_fd, ZFS_IOC_SET_PROP, &zc); 829 break; 830 } 831 832 if (ret != 0) { 833 switch (errno) { 834 835 case EPERM: 836 zfs_error(dgettext(TEXT_DOMAIN, 837 "cannot set %s for '%s': permission " 838 "denied"), propname, zhp->zfs_name); 839 break; 840 841 case ENOENT: 842 zfs_error(dgettext(TEXT_DOMAIN, 843 "cannot open '%s': no such %s"), zhp->zfs_name, 844 zfs_type_to_name(zhp->zfs_type)); 845 break; 846 847 case ENOSPC: 848 /* 849 * For quotas and reservations, ENOSPC indicates 850 * something different; setting a quota or reservation 851 * doesn't use any disk space. 852 */ 853 switch (prop) { 854 case ZFS_PROP_QUOTA: 855 zfs_error(dgettext(TEXT_DOMAIN, "cannot set %s " 856 "for '%s': size is less than current " 857 "used or reserved space"), propname, 858 zhp->zfs_name); 859 break; 860 861 case ZFS_PROP_RESERVATION: 862 zfs_error(dgettext(TEXT_DOMAIN, "cannot set %s " 863 "for '%s': size is greater than available " 864 "space"), propname, zhp->zfs_name); 865 break; 866 867 default: 868 zfs_error(dgettext(TEXT_DOMAIN, 869 "cannot set %s for '%s': out of space"), 870 propname, zhp->zfs_name); 871 break; 872 } 873 break; 874 875 case EBUSY: 876 if (prop == ZFS_PROP_VOLBLOCKSIZE) { 877 zfs_error(dgettext(TEXT_DOMAIN, 878 "cannot set %s for '%s': " 879 "volume already contains data"), 880 propname, zhp->zfs_name); 881 } else { 882 zfs_baderror(errno); 883 } 884 break; 885 886 case EOVERFLOW: 887 /* 888 * This platform can't address a volume this big. 889 */ 890 #ifdef _ILP32 891 if (prop == ZFS_PROP_VOLSIZE) { 892 zfs_error(dgettext(TEXT_DOMAIN, 893 "cannot set %s for '%s': " 894 "max volume size is 1TB on 32-bit systems"), 895 propname, zhp->zfs_name); 896 break; 897 } 898 #endif 899 zfs_baderror(errno); 900 default: 901 zfs_baderror(errno); 902 } 903 } else { 904 /* 905 * Refresh the statistics so the new property value 906 * is reflected. 907 */ 908 if ((ret = changelist_postfix(cl)) != 0) 909 goto error; 910 911 (void) get_stats(zhp); 912 } 913 914 error: 915 changelist_free(cl); 916 return (ret); 917 } 918 919 /* 920 * Given a property, inherit the value from the parent dataset. 921 */ 922 int 923 zfs_prop_inherit(zfs_handle_t *zhp, zfs_prop_t prop) 924 { 925 const char *propname = zfs_prop_to_name(prop); 926 zfs_cmd_t zc = { 0 }; 927 int ret; 928 prop_changelist_t *cl; 929 930 /* 931 * Verify that this property is inheritable. 932 */ 933 if (zfs_prop_readonly(prop)) { 934 zfs_error(dgettext(TEXT_DOMAIN, 935 "cannot inherit %s for '%s': property is read-only"), 936 propname, zhp->zfs_name); 937 return (-1); 938 } 939 940 if (!zfs_prop_inheritable(prop)) { 941 zfs_error(dgettext(TEXT_DOMAIN, 942 "cannot inherit %s for '%s': property is not inheritable"), 943 propname, zhp->zfs_name); 944 return (-1); 945 } 946 947 /* 948 * Check to see if the value applies to this type 949 */ 950 if (!zfs_prop_valid_for_type(prop, zhp->zfs_type)) { 951 zfs_error(dgettext(TEXT_DOMAIN, 952 "cannot inherit %s for '%s': property does " 953 "not apply to %ss"), propname, zhp->zfs_name, 954 zfs_type_to_name(zhp->zfs_type)); 955 return (-1); 956 } 957 958 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 959 (void) strlcpy(zc.zc_prop_name, propname, sizeof (zc.zc_prop_name)); 960 961 if (prop == ZFS_PROP_MOUNTPOINT && getzoneid() == GLOBAL_ZONEID && 962 zfs_prop_get_int(zhp, ZFS_PROP_ZONED)) { 963 zfs_error(dgettext(TEXT_DOMAIN, "cannot inherit %s for '%s', " 964 "dataset is used in a non-global zone"), propname, 965 zhp->zfs_name); 966 return (-1); 967 } 968 969 /* 970 * Determine datasets which will be affected by this change, if any. 971 */ 972 if ((cl = changelist_gather(zhp, prop, 0)) == NULL) 973 return (-1); 974 975 if (prop == ZFS_PROP_MOUNTPOINT && changelist_haszonedchild(cl)) { 976 zfs_error(dgettext(TEXT_DOMAIN, "cannot inherit %s for '%s', " 977 "child dataset with inherited mountpoint is " 978 "used in a non-global zone"), 979 propname, zhp->zfs_name); 980 ret = -1; 981 goto error; 982 } 983 984 if ((ret = changelist_prefix(cl)) != 0) 985 goto error; 986 987 zc.zc_numints = 0; 988 989 if ((ret = ioctl(zfs_fd, ZFS_IOC_SET_PROP, &zc)) != 0) { 990 switch (errno) { 991 case EPERM: 992 zfs_error(dgettext(TEXT_DOMAIN, 993 "cannot inherit %s for '%s': permission " 994 "denied"), propname, zhp->zfs_name); 995 break; 996 case ENOENT: 997 zfs_error(dgettext(TEXT_DOMAIN, 998 "cannot open '%s': no such %s"), zhp->zfs_name, 999 zfs_type_to_name(zhp->zfs_type)); 1000 break; 1001 case ENOSPC: 1002 zfs_error(dgettext(TEXT_DOMAIN, 1003 "cannot inherit %s for '%s': " 1004 "out of space"), propname, zhp->zfs_name); 1005 break; 1006 default: 1007 zfs_baderror(errno); 1008 } 1009 1010 } else { 1011 1012 if ((ret = changelist_postfix(cl)) != 0) 1013 goto error; 1014 1015 /* 1016 * Refresh the statistics so the new property is reflected. 1017 */ 1018 (void) get_stats(zhp); 1019 } 1020 1021 1022 error: 1023 changelist_free(cl); 1024 return (ret); 1025 } 1026 1027 static void 1028 nicebool(int value, char *buf, size_t buflen) 1029 { 1030 if (value) 1031 (void) strlcpy(buf, "on", buflen); 1032 else 1033 (void) strlcpy(buf, "off", buflen); 1034 } 1035 1036 /* 1037 * Internal function for getting a numeric property. Both zfs_prop_get() and 1038 * zfs_prop_get_int() are built using this interface. 1039 * 1040 * Certain properties can be overridden using 'mount -o'. In this case, scan 1041 * the contents of the /etc/mnttab entry, searching for the appropriate options. 1042 * If they differ from the on-disk values, report the current values and mark 1043 * the source "temporary". 1044 */ 1045 static uint64_t 1046 get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zfs_source_t *src, 1047 char **source) 1048 { 1049 uint64_t val; 1050 struct mnttab mnt; 1051 1052 *source = NULL; 1053 1054 if (zhp->zfs_mntopts == NULL) 1055 mnt.mnt_mntopts = ""; 1056 else 1057 mnt.mnt_mntopts = zhp->zfs_mntopts; 1058 1059 switch (prop) { 1060 case ZFS_PROP_ATIME: 1061 *source = zhp->zfs_zplstats.zs_atime_setpoint; 1062 val = zhp->zfs_zplstats.zs_devices; 1063 1064 if (hasmntopt(&mnt, MNTOPT_ATIME) && !val) { 1065 val = TRUE; 1066 if (src) 1067 *src = ZFS_SRC_TEMPORARY; 1068 } else if (hasmntopt(&mnt, MNTOPT_NOATIME) && val) { 1069 val = FALSE; 1070 if (src) 1071 *src = ZFS_SRC_TEMPORARY; 1072 } 1073 return (zhp->zfs_zplstats.zs_atime); 1074 1075 case ZFS_PROP_AVAILABLE: 1076 return (zhp->zfs_dmustats.dds_available); 1077 1078 case ZFS_PROP_DEVICES: 1079 *source = zhp->zfs_zplstats.zs_devices_setpoint; 1080 val = zhp->zfs_zplstats.zs_devices; 1081 1082 if (hasmntopt(&mnt, MNTOPT_DEVICES) && !val) { 1083 val = TRUE; 1084 if (src) 1085 *src = ZFS_SRC_TEMPORARY; 1086 } else if (hasmntopt(&mnt, MNTOPT_NODEVICES) && val) { 1087 val = FALSE; 1088 if (src) 1089 *src = ZFS_SRC_TEMPORARY; 1090 } 1091 return (val); 1092 1093 case ZFS_PROP_EXEC: 1094 *source = zhp->zfs_zplstats.zs_exec_setpoint; 1095 val = zhp->zfs_zplstats.zs_exec; 1096 1097 if (hasmntopt(&mnt, MNTOPT_EXEC) && !val) { 1098 val = TRUE; 1099 if (src) 1100 *src = ZFS_SRC_TEMPORARY; 1101 } else if (hasmntopt(&mnt, MNTOPT_NOEXEC) && val) { 1102 val = FALSE; 1103 if (src) 1104 *src = ZFS_SRC_TEMPORARY; 1105 } 1106 return (val); 1107 1108 case ZFS_PROP_RECORDSIZE: 1109 *source = zhp->zfs_zplstats.zs_recordsize_setpoint; 1110 return (zhp->zfs_zplstats.zs_recordsize); 1111 1112 case ZFS_PROP_COMPRESSION: 1113 *source = zhp->zfs_dmustats.dds_compression_setpoint; 1114 return (zhp->zfs_dmustats.dds_compression); 1115 1116 case ZFS_PROP_READONLY: 1117 *source = zhp->zfs_zplstats.zs_readonly_setpoint; 1118 val = zhp->zfs_zplstats.zs_readonly; 1119 1120 if (hasmntopt(&mnt, MNTOPT_RO) && !val) { 1121 val = TRUE; 1122 if (src) 1123 *src = ZFS_SRC_TEMPORARY; 1124 } else if (hasmntopt(&mnt, MNTOPT_RW) && val) { 1125 val = FALSE; 1126 if (src) 1127 *src = ZFS_SRC_TEMPORARY; 1128 } 1129 return (val); 1130 1131 case ZFS_PROP_QUOTA: 1132 if (zhp->zfs_dmustats.dds_quota == 0) 1133 *source = ""; /* default */ 1134 else 1135 *source = zhp->zfs_name; 1136 return (zhp->zfs_dmustats.dds_quota); 1137 1138 case ZFS_PROP_RESERVATION: 1139 if (zhp->zfs_dmustats.dds_reserved == 0) 1140 *source = ""; /* default */ 1141 else 1142 *source = zhp->zfs_name; 1143 return (zhp->zfs_dmustats.dds_reserved); 1144 1145 case ZFS_PROP_COMPRESSRATIO: 1146 /* 1147 * Using physical space and logical space, calculate the 1148 * compression ratio. We return the number as a multiple of 1149 * 100, so '2.5x' would be returned as 250. 1150 */ 1151 if (zhp->zfs_dmustats.dds_compressed_bytes == 0) 1152 return (100ULL); 1153 else 1154 return (zhp->zfs_dmustats.dds_uncompressed_bytes * 100 / 1155 zhp->zfs_dmustats.dds_compressed_bytes); 1156 1157 case ZFS_PROP_REFERENCED: 1158 /* 1159 * 'referenced' refers to the amount of physical space 1160 * referenced (possibly shared) by this object. 1161 */ 1162 return (zhp->zfs_dmustats.dds_space_refd); 1163 1164 case ZFS_PROP_SETUID: 1165 *source = zhp->zfs_zplstats.zs_setuid_setpoint; 1166 val = zhp->zfs_zplstats.zs_setuid; 1167 1168 if (hasmntopt(&mnt, MNTOPT_SETUID) && !val) { 1169 val = TRUE; 1170 if (src) 1171 *src = ZFS_SRC_TEMPORARY; 1172 } else if (hasmntopt(&mnt, MNTOPT_NOSETUID) && val) { 1173 val = FALSE; 1174 if (src) 1175 *src = ZFS_SRC_TEMPORARY; 1176 } 1177 return (val); 1178 1179 case ZFS_PROP_VOLSIZE: 1180 return (zhp->zfs_volsize); 1181 1182 case ZFS_PROP_VOLBLOCKSIZE: 1183 return (zhp->zfs_volblocksize); 1184 1185 case ZFS_PROP_ZONED: 1186 *source = zhp->zfs_dmustats.dds_zoned_setpoint; 1187 return (zhp->zfs_dmustats.dds_zoned); 1188 1189 case ZFS_PROP_USED: 1190 return (zhp->zfs_dmustats.dds_space_used); 1191 1192 case ZFS_PROP_CREATETXG: 1193 return (zhp->zfs_dmustats.dds_creation_txg); 1194 1195 case ZFS_PROP_MOUNTED: 1196 /* 1197 * Unlike other properties, we defer calculation of 'MOUNTED' 1198 * until actually requested. This is because the getmntany() 1199 * call can be extremely expensive on systems with a large 1200 * number of filesystems, and the property isn't needed in 1201 * normal use cases. 1202 */ 1203 if (zhp->zfs_mntopts == NULL) { 1204 struct mnttab search = { 0 }, entry; 1205 1206 search.mnt_special = (char *)zhp->zfs_name; 1207 rewind(mnttab_file); 1208 1209 if (getmntany(mnttab_file, &entry, &search) == 0) 1210 zhp->zfs_mntopts = 1211 zfs_strdup(entry.mnt_mntopts); 1212 } 1213 return (zhp->zfs_mntopts != NULL); 1214 1215 default: 1216 zfs_baderror(EINVAL); 1217 } 1218 1219 return (0); 1220 } 1221 1222 /* 1223 * Calculate the source type, given the raw source string. 1224 */ 1225 static void 1226 get_source(zfs_handle_t *zhp, zfs_source_t *srctype, char *source, 1227 char *statbuf, size_t statlen) 1228 { 1229 if (statbuf == NULL || *srctype == ZFS_SRC_TEMPORARY) 1230 return; 1231 1232 if (source == NULL) { 1233 *srctype = ZFS_SRC_NONE; 1234 } else if (source[0] == '\0') { 1235 *srctype = ZFS_SRC_DEFAULT; 1236 } else { 1237 if (strcmp(source, zhp->zfs_name) == 0) { 1238 *srctype = ZFS_SRC_LOCAL; 1239 } else { 1240 (void) strlcpy(statbuf, source, statlen); 1241 *srctype = ZFS_SRC_INHERITED; 1242 } 1243 } 1244 1245 } 1246 1247 /* 1248 * Retrieve a property from the given object. If 'literal' is specified, then 1249 * numbers are left as exact values. Otherwise, numbers are converted to a 1250 * human-readable form. 1251 * 1252 * Returns 0 on success, or -1 on error. 1253 */ 1254 int 1255 zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, 1256 zfs_source_t *src, char *statbuf, size_t statlen, int literal) 1257 { 1258 char *source = NULL; 1259 uint64_t val; 1260 char *str; 1261 int i; 1262 const char *root; 1263 1264 /* 1265 * Check to see if this property applies to our object 1266 */ 1267 if (!zfs_prop_valid_for_type(prop, zhp->zfs_type)) 1268 return (-1); 1269 1270 if (src) 1271 *src = ZFS_SRC_NONE; 1272 1273 switch (prop) { 1274 case ZFS_PROP_ATIME: 1275 case ZFS_PROP_READONLY: 1276 case ZFS_PROP_SETUID: 1277 case ZFS_PROP_ZONED: 1278 case ZFS_PROP_DEVICES: 1279 case ZFS_PROP_EXEC: 1280 /* 1281 * Basic boolean values are built on top of 1282 * get_numeric_property(). 1283 */ 1284 nicebool(get_numeric_property(zhp, prop, src, &source), 1285 propbuf, proplen); 1286 1287 break; 1288 1289 case ZFS_PROP_AVAILABLE: 1290 case ZFS_PROP_RECORDSIZE: 1291 case ZFS_PROP_CREATETXG: 1292 case ZFS_PROP_REFERENCED: 1293 case ZFS_PROP_USED: 1294 case ZFS_PROP_VOLSIZE: 1295 case ZFS_PROP_VOLBLOCKSIZE: 1296 /* 1297 * Basic numeric values are built on top of 1298 * get_numeric_property(). 1299 */ 1300 val = get_numeric_property(zhp, prop, src, &source); 1301 if (literal) 1302 (void) snprintf(propbuf, proplen, "%llu", val); 1303 else 1304 zfs_nicenum(val, propbuf, proplen); 1305 break; 1306 1307 case ZFS_PROP_COMPRESSION: 1308 for (i = 0; compress_table[i].name != NULL; i++) { 1309 if (compress_table[i].value == 1310 zhp->zfs_dmustats.dds_compression) 1311 break; 1312 } 1313 assert(compress_table[i].name != NULL); 1314 (void) strlcpy(propbuf, compress_table[i].name, proplen); 1315 source = zhp->zfs_dmustats.dds_compression_setpoint; 1316 break; 1317 1318 case ZFS_PROP_CHECKSUM: 1319 for (i = 0; checksum_table[i].name != NULL; i++) { 1320 if (checksum_table[i].value == 1321 zhp->zfs_dmustats.dds_checksum) 1322 break; 1323 } 1324 assert(checksum_table[i].name != NULL); 1325 (void) strlcpy(propbuf, checksum_table[i].name, proplen); 1326 source = zhp->zfs_dmustats.dds_checksum_setpoint; 1327 break; 1328 1329 case ZFS_PROP_SNAPDIR: 1330 for (i = 0; snapdir_table[i].name != NULL; i++) { 1331 if (snapdir_table[i].value == 1332 zhp->zfs_zplstats.zs_snapdir) 1333 break; 1334 } 1335 assert(snapdir_table[i].name != NULL); 1336 (void) strlcpy(propbuf, snapdir_table[i].name, proplen); 1337 source = zhp->zfs_zplstats.zs_snapdir_setpoint; 1338 break; 1339 1340 case ZFS_PROP_ACLMODE: 1341 for (i = 0; acl_mode_table[i].name != NULL; i++) { 1342 if (acl_mode_table[i].value == 1343 zhp->zfs_zplstats.zs_acl_mode) 1344 break; 1345 } 1346 assert(acl_mode_table[i].name != NULL); 1347 (void) strlcpy(propbuf, acl_mode_table[i].name, proplen); 1348 source = zhp->zfs_zplstats.zs_acl_mode_setpoint; 1349 break; 1350 1351 case ZFS_PROP_ACLINHERIT: 1352 for (i = 0; acl_inherit_table[i].name != NULL; i++) { 1353 if (acl_inherit_table[i].value == 1354 zhp->zfs_zplstats.zs_acl_inherit) 1355 break; 1356 } 1357 assert(acl_inherit_table[i].name != NULL); 1358 (void) strlcpy(propbuf, acl_inherit_table[i].name, proplen); 1359 source = zhp->zfs_zplstats.zs_acl_inherit_setpoint; 1360 break; 1361 1362 case ZFS_PROP_CREATION: 1363 /* 1364 * 'creation' is a time_t stored in the statistics. We convert 1365 * this into a string unless 'literal' is specified. 1366 */ 1367 { 1368 time_t time = (time_t) 1369 zhp->zfs_dmustats.dds_creation_time; 1370 struct tm t; 1371 1372 if (literal || 1373 localtime_r(&time, &t) == NULL || 1374 strftime(propbuf, proplen, "%a %b %e %k:%M %Y", 1375 &t) == 0) 1376 (void) snprintf(propbuf, proplen, "%llu", 1377 zhp->zfs_dmustats.dds_creation_time); 1378 } 1379 break; 1380 1381 case ZFS_PROP_MOUNTPOINT: 1382 /* 1383 * Getting the precise mountpoint can be tricky. 1384 * 1385 * - for 'none' or 'legacy', return those values. 1386 * - for default mountpoints, construct it as /zfs/<dataset> 1387 * - for inherited mountpoints, we want to take everything 1388 * after our ancestor and append it to the inherited value. 1389 * 1390 * If the pool has an alternate root, we want to prepend that 1391 * root to any values we return. 1392 */ 1393 root = zhp->zfs_dmustats.dds_altroot; 1394 1395 if (zhp->zfs_zplstats.zs_mountpoint[0] == '\0') { 1396 (void) snprintf(propbuf, proplen, "%s/zfs/%s", 1397 root, zhp->zfs_name); 1398 } else if (zhp->zfs_zplstats.zs_mountpoint[0] == '/') { 1399 const char *relpath = zhp->zfs_name + 1400 strlen(zhp->zfs_zplstats.zs_mountpoint_setpoint); 1401 const char *mntpoint = zhp->zfs_zplstats.zs_mountpoint; 1402 1403 if (relpath[0] == '/') 1404 relpath++; 1405 if (mntpoint[1] == '\0') 1406 mntpoint++; 1407 1408 if (relpath[0] == '\0') 1409 (void) snprintf(propbuf, proplen, "%s%s", 1410 root, mntpoint); 1411 else 1412 (void) snprintf(propbuf, proplen, "%s%s%s%s", 1413 root, mntpoint, 1414 relpath[0] == '@' ? "" : "/", 1415 relpath); 1416 } else { 1417 /* 'legacy' or 'none' */ 1418 (void) strlcpy(propbuf, zhp->zfs_zplstats.zs_mountpoint, 1419 proplen); 1420 } 1421 1422 source = zhp->zfs_zplstats.zs_mountpoint_setpoint; 1423 break; 1424 1425 case ZFS_PROP_SHARENFS: 1426 (void) strlcpy(propbuf, zhp->zfs_zplstats.zs_sharenfs, proplen); 1427 source = zhp->zfs_zplstats.zs_sharenfs_setpoint; 1428 break; 1429 1430 case ZFS_PROP_ORIGIN: 1431 (void) strlcpy(propbuf, zhp->zfs_dmustats.dds_clone_of, 1432 proplen); 1433 /* 1434 * If there is no parent at all, return failure to indicate that 1435 * it doesn't apply to this dataset. 1436 */ 1437 if (propbuf[0] == '\0') 1438 return (-1); 1439 break; 1440 1441 case ZFS_PROP_QUOTA: 1442 case ZFS_PROP_RESERVATION: 1443 val = get_numeric_property(zhp, prop, src, &source); 1444 1445 /* 1446 * If quota or reservation is 0, we translate this into 'none' 1447 * (unless literal is set), and indicate that it's the default 1448 * value. Otherwise, we print the number nicely and indicate 1449 * that its set locally. 1450 */ 1451 if (val == 0) { 1452 if (literal) 1453 (void) strlcpy(propbuf, "0", proplen); 1454 else 1455 (void) strlcpy(propbuf, "none", proplen); 1456 } else { 1457 if (literal) 1458 (void) snprintf(propbuf, proplen, "%llu", val); 1459 else 1460 zfs_nicenum(val, propbuf, proplen); 1461 } 1462 break; 1463 1464 case ZFS_PROP_COMPRESSRATIO: 1465 val = get_numeric_property(zhp, prop, src, &source); 1466 (void) snprintf(propbuf, proplen, "%lld.%02lldx", val / 100, 1467 val % 100); 1468 break; 1469 1470 case ZFS_PROP_TYPE: 1471 switch (zhp->zfs_type) { 1472 case ZFS_TYPE_FILESYSTEM: 1473 str = "filesystem"; 1474 break; 1475 case ZFS_TYPE_VOLUME: 1476 str = "volume"; 1477 break; 1478 case ZFS_TYPE_SNAPSHOT: 1479 str = "snapshot"; 1480 break; 1481 default: 1482 zfs_baderror(zhp->zfs_type); 1483 } 1484 (void) snprintf(propbuf, proplen, "%s", str); 1485 break; 1486 1487 case ZFS_PROP_MOUNTED: 1488 /* 1489 * The 'mounted' property is a pseudo-property that described 1490 * whether the filesystem is currently mounted. Even though 1491 * it's a boolean value, the typical values of "on" and "off" 1492 * don't make sense, so we translate to "yes" and "no". 1493 */ 1494 if (get_numeric_property(zhp, ZFS_PROP_MOUNTED, src, &source)) 1495 (void) strlcpy(propbuf, "yes", proplen); 1496 else 1497 (void) strlcpy(propbuf, "no", proplen); 1498 break; 1499 1500 case ZFS_PROP_NAME: 1501 /* 1502 * The 'name' property is a pseudo-property derived from the 1503 * dataset name. It is presented as a real property to simplify 1504 * consumers. 1505 */ 1506 (void) strlcpy(propbuf, zhp->zfs_name, proplen); 1507 break; 1508 1509 default: 1510 zfs_baderror(EINVAL); 1511 } 1512 1513 get_source(zhp, src, source, statbuf, statlen); 1514 1515 return (0); 1516 } 1517 1518 /* 1519 * Utility function to get the given numeric property. Does no validation that 1520 * the given property is the appropriate type; should only be used with 1521 * hard-coded property types. 1522 */ 1523 uint64_t 1524 zfs_prop_get_int(zfs_handle_t *zhp, zfs_prop_t prop) 1525 { 1526 char *source; 1527 zfs_source_t sourcetype = ZFS_SRC_NONE; 1528 1529 return (get_numeric_property(zhp, prop, &sourcetype, &source)); 1530 } 1531 1532 /* 1533 * Similar to zfs_prop_get(), but returns the value as an integer. 1534 */ 1535 int 1536 zfs_prop_get_numeric(zfs_handle_t *zhp, zfs_prop_t prop, uint64_t *value, 1537 zfs_source_t *src, char *statbuf, size_t statlen) 1538 { 1539 char *source; 1540 1541 /* 1542 * Check to see if this property applies to our object 1543 */ 1544 if (!zfs_prop_valid_for_type(prop, zhp->zfs_type)) 1545 return (-1); 1546 1547 if (src) 1548 *src = ZFS_SRC_NONE; 1549 1550 *value = get_numeric_property(zhp, prop, src, &source); 1551 1552 get_source(zhp, src, source, statbuf, statlen); 1553 1554 return (0); 1555 } 1556 1557 /* 1558 * Returns the name of the given zfs handle. 1559 */ 1560 const char * 1561 zfs_get_name(const zfs_handle_t *zhp) 1562 { 1563 return (zhp->zfs_name); 1564 } 1565 1566 /* 1567 * Returns the type of the given zfs handle. 1568 */ 1569 zfs_type_t 1570 zfs_get_type(const zfs_handle_t *zhp) 1571 { 1572 return (zhp->zfs_type); 1573 } 1574 1575 /* 1576 * Iterate over all children, datasets and snapshots. 1577 */ 1578 int 1579 zfs_iter_children(zfs_handle_t *zhp, zfs_iter_f func, void *data) 1580 { 1581 zfs_cmd_t zc = { 0 }; 1582 zfs_handle_t *nzhp; 1583 int ret; 1584 1585 for ((void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 1586 ioctl(zfs_fd, ZFS_IOC_DATASET_LIST_NEXT, &zc) == 0; 1587 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name))) { 1588 /* 1589 * Ignore private dataset names. 1590 */ 1591 if (dataset_name_hidden(zc.zc_name)) 1592 continue; 1593 1594 /* 1595 * Silently ignore errors, as the only plausible explanation is 1596 * that the pool has since been removed. 1597 */ 1598 if ((nzhp = make_dataset_handle(zc.zc_name)) == NULL) 1599 continue; 1600 1601 if ((ret = func(nzhp, data)) != 0) 1602 return (ret); 1603 } 1604 1605 /* 1606 * An errno value of ESRCH indicates normal completion. If ENOENT is 1607 * returned, then the underlying dataset has been removed since we 1608 * obtained the handle. 1609 */ 1610 if (errno != ESRCH && errno != ENOENT) 1611 zfs_baderror(errno); 1612 1613 bzero(&zc, sizeof (zc)); 1614 1615 for ((void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 1616 ioctl(zfs_fd, ZFS_IOC_SNAPSHOT_LIST_NEXT, &zc) == 0; 1617 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name))) { 1618 1619 if ((nzhp = make_dataset_handle(zc.zc_name)) == NULL) 1620 continue; 1621 1622 if ((ret = func(nzhp, data)) != 0) 1623 return (ret); 1624 } 1625 1626 /* 1627 * An errno value of ESRCH indicates normal completion. If ENOENT is 1628 * returned, then the underlying dataset has been removed since we 1629 * obtained the handle. Silently ignore this case, and return success. 1630 */ 1631 if (errno != ESRCH && errno != ENOENT) 1632 zfs_baderror(errno); 1633 1634 return (0); 1635 } 1636 1637 /* 1638 * Given a complete name, return just the portion that refers to the parent. 1639 * Can return NULL if this is a pool. 1640 */ 1641 static int 1642 parent_name(const char *path, char *buf, size_t buflen) 1643 { 1644 char *loc; 1645 1646 if ((loc = strrchr(path, '/')) == NULL) 1647 return (-1); 1648 1649 (void) strncpy(buf, path, MIN(buflen, loc - path)); 1650 buf[loc - path] = '\0'; 1651 1652 return (0); 1653 } 1654 1655 /* 1656 * Checks to make sure that the given path has a parent, and that it exists. 1657 */ 1658 static int 1659 check_parents(const char *path, zfs_type_t type) 1660 { 1661 zfs_cmd_t zc = { 0 }; 1662 char parent[ZFS_MAXNAMELEN]; 1663 char *slash; 1664 1665 /* get parent, and check to see if this is just a pool */ 1666 if (parent_name(path, parent, sizeof (parent)) != 0) { 1667 zfs_error(dgettext(TEXT_DOMAIN, 1668 "cannot create '%s': missing dataset name"), 1669 path, zfs_type_to_name(type)); 1670 zfs_error(dgettext(TEXT_DOMAIN, 1671 "use 'zpool create' to create a storage pool")); 1672 return (-1); 1673 } 1674 1675 /* check to see if the pool exists */ 1676 if ((slash = strchr(parent, '/')) == NULL) 1677 slash = parent + strlen(parent); 1678 (void) strncpy(zc.zc_name, parent, slash - parent); 1679 zc.zc_name[slash - parent] = '\0'; 1680 if (ioctl(zfs_fd, ZFS_IOC_OBJSET_STATS, &zc) != 0 && 1681 errno == ENOENT) { 1682 zfs_error(dgettext(TEXT_DOMAIN, 1683 "cannot create '%s': no such pool '%s'"), path, zc.zc_name); 1684 return (-1); 1685 } 1686 1687 /* check to see if the parent dataset exists */ 1688 (void) strlcpy(zc.zc_name, parent, sizeof (zc.zc_name)); 1689 if (ioctl(zfs_fd, ZFS_IOC_OBJSET_STATS, &zc) != 0) { 1690 switch (errno) { 1691 case ENOENT: 1692 zfs_error(dgettext(TEXT_DOMAIN, 1693 "cannot create '%s': parent does not exist"), path); 1694 return (-1); 1695 1696 default: 1697 zfs_baderror(errno); 1698 } 1699 } 1700 1701 /* we are in a non-global zone, but parent is in the global zone */ 1702 if (getzoneid() != GLOBAL_ZONEID && !zc.zc_objset_stats.dds_zoned) { 1703 zfs_error(dgettext(TEXT_DOMAIN, 1704 "cannot create '%s': permission denied"), path); 1705 return (-1); 1706 } 1707 1708 /* make sure parent is a filesystem */ 1709 if (zc.zc_objset_stats.dds_type != DMU_OST_ZFS) { 1710 zfs_error(dgettext(TEXT_DOMAIN, 1711 "cannot create '%s': parent is not a filesystem"), 1712 path); 1713 return (-1); 1714 } 1715 1716 return (0); 1717 } 1718 1719 /* 1720 * Create a new filesystem or volume. 'sizestr' and 'blocksizestr' are used 1721 * only for volumes, and indicate the size and blocksize of the volume. 1722 */ 1723 int 1724 zfs_create(const char *path, zfs_type_t type, 1725 const char *sizestr, const char *blocksizestr) 1726 { 1727 char reason[64]; 1728 zfs_cmd_t zc = { 0 }; 1729 int ret; 1730 uint64_t size = 0; 1731 uint64_t blocksize = zfs_prop_default_numeric(ZFS_PROP_VOLBLOCKSIZE); 1732 1733 /* convert sizestr into integer size */ 1734 if (sizestr != NULL && nicestrtonum(sizestr, &size, 1735 reason, sizeof (reason)) != 0) { 1736 zfs_error(dgettext(TEXT_DOMAIN, 1737 "bad volume size '%s': %s"), sizestr, reason); 1738 return (-1); 1739 } 1740 1741 /* convert blocksizestr into integer blocksize */ 1742 if (blocksizestr != NULL && nicestrtonum(blocksizestr, &blocksize, 1743 reason, sizeof (reason)) != 0) { 1744 zfs_error(dgettext(TEXT_DOMAIN, 1745 "bad volume blocksize '%s': %s"), blocksizestr, reason); 1746 return (-1); 1747 } 1748 1749 /* validate the path, taking care to note the extended error message */ 1750 if (!zfs_validate_name(path, type, reason, sizeof (reason))) { 1751 zfs_error(dgettext(TEXT_DOMAIN, 1752 "cannot create '%s': %s in %s name"), path, reason, 1753 zfs_type_to_name(type)); 1754 if (strstr(reason, "snapshot") != NULL) 1755 zfs_error(dgettext(TEXT_DOMAIN, 1756 "use 'zfs snapshot' to create a snapshot")); 1757 return (-1); 1758 } 1759 1760 /* validate parents exist */ 1761 if (check_parents(path, type) != 0) 1762 return (-1); 1763 1764 /* 1765 * The failure modes when creating a dataset of a different type over 1766 * one that already exists is a little strange. In particular, if you 1767 * try to create a dataset on top of an existing dataset, the ioctl() 1768 * will return ENOENT, not EEXIST. To prevent this from happening, we 1769 * first try to see if the dataset exists. 1770 */ 1771 (void) strlcpy(zc.zc_name, path, sizeof (zc.zc_name)); 1772 if (ioctl(zfs_fd, ZFS_IOC_OBJSET_STATS, &zc) == 0) { 1773 zfs_error(dgettext(TEXT_DOMAIN, 1774 "cannot create '%s': dataset exists"), path); 1775 return (-1); 1776 } 1777 1778 if (type == ZFS_TYPE_VOLUME) 1779 zc.zc_objset_type = DMU_OST_ZVOL; 1780 else 1781 zc.zc_objset_type = DMU_OST_ZFS; 1782 1783 if (type == ZFS_TYPE_VOLUME) { 1784 if (size == 0) { 1785 zfs_error(dgettext(TEXT_DOMAIN, 1786 "bad volume size '%s': cannot be zero"), sizestr); 1787 return (-1); 1788 } 1789 1790 zc.zc_volsize = size; 1791 zc.zc_volblocksize = blocksize; 1792 } 1793 1794 /* create the dataset */ 1795 1796 ret = ioctl(zfs_fd, ZFS_IOC_CREATE, &zc); 1797 1798 if (ret == 0 && type == ZFS_TYPE_VOLUME) 1799 ret = zvol_create_link(path); 1800 1801 /* check for failure */ 1802 if (ret != 0) { 1803 char parent[ZFS_MAXNAMELEN]; 1804 (void) parent_name(path, parent, sizeof (parent)); 1805 1806 switch (errno) { 1807 case ENOENT: 1808 /* 1809 * The parent dataset has been deleted since our 1810 * previous check. 1811 */ 1812 zfs_error(dgettext(TEXT_DOMAIN, 1813 "cannot create '%s': no such parent '%s'"), 1814 path, parent); 1815 break; 1816 1817 case EPERM: 1818 /* 1819 * The user doesn't have permission to create a new 1820 * dataset here. 1821 */ 1822 zfs_error(dgettext(TEXT_DOMAIN, 1823 "cannot create '%s': permission denied"), path); 1824 break; 1825 1826 case EDQUOT: 1827 case ENOSPC: 1828 /* 1829 * The parent dataset does not have enough free space 1830 * to create a new dataset. 1831 */ 1832 zfs_error(dgettext(TEXT_DOMAIN, 1833 "cannot create '%s': not enough space in '%s'"), 1834 path, parent); 1835 break; 1836 1837 case EEXIST: 1838 /* 1839 * The target dataset already exists. We should have 1840 * caught this above, but there may be some unexplained 1841 * race condition. 1842 */ 1843 zfs_error(dgettext(TEXT_DOMAIN, 1844 "cannot create '%s': dataset exists"), path); 1845 break; 1846 1847 case EINVAL: 1848 /* 1849 * The target dataset does not support children. 1850 */ 1851 zfs_error(dgettext(TEXT_DOMAIN, 1852 "cannot create '%s': children unsupported in '%s'"), 1853 path, parent); 1854 break; 1855 1856 case EDOM: 1857 zfs_error(dgettext(TEXT_DOMAIN, "bad %s value '%s': " 1858 "must be power of 2 from %u to %uk"), 1859 zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE), 1860 blocksizestr ? blocksizestr : "<unknown>", 1861 (uint_t)SPA_MINBLOCKSIZE, 1862 (uint_t)SPA_MAXBLOCKSIZE >> 10); 1863 break; 1864 #ifdef _ILP32 1865 case EOVERFLOW: 1866 /* 1867 * This platform can't address a volume this big. 1868 */ 1869 if (type == ZFS_TYPE_VOLUME) { 1870 zfs_error(dgettext(TEXT_DOMAIN, 1871 "cannot create '%s': " 1872 "max volume size is 1TB on 32-bit systems"), 1873 path); 1874 break; 1875 } 1876 #endif 1877 1878 default: 1879 zfs_baderror(errno); 1880 } 1881 1882 return (-1); 1883 } 1884 1885 return (0); 1886 } 1887 1888 /* 1889 * Destroys the given dataset. The caller must make sure that the filesystem 1890 * isn't mounted, and that there are no active dependents. 1891 */ 1892 int 1893 zfs_destroy(zfs_handle_t *zhp) 1894 { 1895 zfs_cmd_t zc = { 0 }; 1896 int ret; 1897 1898 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 1899 1900 /* 1901 * We use the check for 'zfs_volblocksize' instead of ZFS_TYPE_VOLUME 1902 * so that we do the right thing for snapshots of volumes. 1903 */ 1904 if (zhp->zfs_volblocksize != 0) { 1905 if (zvol_remove_link(zhp->zfs_name) != 0) 1906 return (-1); 1907 1908 zc.zc_objset_type = DMU_OST_ZVOL; 1909 } else { 1910 zc.zc_objset_type = DMU_OST_ZFS; 1911 } 1912 1913 ret = ioctl(zfs_fd, ZFS_IOC_DESTROY, &zc); 1914 1915 if (ret != 0) { 1916 switch (errno) { 1917 1918 case EPERM: 1919 /* 1920 * We don't have permission to destroy this dataset. 1921 */ 1922 zfs_error(dgettext(TEXT_DOMAIN, 1923 "cannot destroy '%s': permission denied"), 1924 zhp->zfs_name); 1925 break; 1926 1927 case ENOENT: 1928 /* 1929 * We've hit a race condition where the dataset has been 1930 * destroyed since we opened it. 1931 */ 1932 zfs_error(dgettext(TEXT_DOMAIN, 1933 "cannot destroy '%s': no such %s"), 1934 zhp->zfs_name, zfs_type_to_name(zhp->zfs_type)); 1935 break; 1936 1937 case EBUSY: 1938 /* 1939 * Even if we destroy all children, there is a chance we 1940 * can hit this case if: 1941 * 1942 * - A child dataset has since been created 1943 * - A filesystem is mounted 1944 * 1945 * This error message is awful, but hopefully we've 1946 * already caught the common cases (and aborted more 1947 * appropriately) before calling this function. There's 1948 * nothing else we can do at this point. 1949 */ 1950 zfs_error(dgettext(TEXT_DOMAIN, 1951 "cannot destroy '%s': %s is busy"), 1952 zhp->zfs_name, zfs_type_to_name(zhp->zfs_type)); 1953 break; 1954 1955 default: 1956 zfs_baderror(errno); 1957 } 1958 1959 return (-1); 1960 } 1961 1962 remove_mountpoint(zhp); 1963 1964 return (0); 1965 } 1966 1967 /* 1968 * Clones the given dataset. The target must be of the same type as the source. 1969 */ 1970 int 1971 zfs_clone(zfs_handle_t *zhp, const char *target) 1972 { 1973 char reason[64]; 1974 zfs_cmd_t zc = { 0 }; 1975 char parent[ZFS_MAXNAMELEN]; 1976 int ret; 1977 1978 assert(zhp->zfs_type == ZFS_TYPE_SNAPSHOT); 1979 1980 /* validate the target name */ 1981 if (!zfs_validate_name(target, ZFS_TYPE_FILESYSTEM, reason, 1982 sizeof (reason))) { 1983 zfs_error(dgettext(TEXT_DOMAIN, 1984 "cannot create '%s': %s in filesystem name"), target, 1985 reason, zfs_type_to_name(ZFS_TYPE_FILESYSTEM)); 1986 return (-1); 1987 } 1988 1989 /* validate parents exist */ 1990 if (check_parents(target, zhp->zfs_type) != 0) 1991 return (-1); 1992 1993 (void) parent_name(target, parent, sizeof (parent)); 1994 1995 /* do the clone */ 1996 if (zhp->zfs_volblocksize != 0) 1997 zc.zc_objset_type = DMU_OST_ZVOL; 1998 else 1999 zc.zc_objset_type = DMU_OST_ZFS; 2000 2001 (void) strlcpy(zc.zc_name, target, sizeof (zc.zc_name)); 2002 (void) strlcpy(zc.zc_filename, zhp->zfs_name, sizeof (zc.zc_filename)); 2003 ret = ioctl(zfs_fd, ZFS_IOC_CREATE, &zc); 2004 2005 if (ret != 0) { 2006 switch (errno) { 2007 case EPERM: 2008 /* 2009 * The user doesn't have permission to create the clone. 2010 */ 2011 zfs_error(dgettext(TEXT_DOMAIN, 2012 "cannot create '%s': permission denied"), 2013 target); 2014 break; 2015 2016 case ENOENT: 2017 /* 2018 * The parent doesn't exist. We should have caught this 2019 * above, but there may a race condition that has since 2020 * destroyed the parent. 2021 * 2022 * At this point, we don't know whether it's the source 2023 * that doesn't exist anymore, or whether the target 2024 * dataset doesn't exist. 2025 */ 2026 zfs_error(dgettext(TEXT_DOMAIN, 2027 "cannot create '%s': no such parent '%s'"), 2028 target, parent); 2029 break; 2030 2031 case EDQUOT: 2032 case ENOSPC: 2033 /* 2034 * There is not enough space in the target dataset 2035 */ 2036 zfs_error(dgettext(TEXT_DOMAIN, 2037 "cannot create '%s': not enough space in '%s'"), 2038 target, parent); 2039 break; 2040 2041 case EEXIST: 2042 /* 2043 * The target already exists. 2044 */ 2045 zfs_error(dgettext(TEXT_DOMAIN, 2046 "cannot create '%s': dataset exists"), target); 2047 break; 2048 2049 case EXDEV: 2050 /* 2051 * The source and target pools differ. 2052 */ 2053 zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': " 2054 "source and target pools differ"), target); 2055 break; 2056 2057 default: 2058 zfs_baderror(errno); 2059 } 2060 } else if (zhp->zfs_volblocksize != 0) { 2061 ret = zvol_create_link(target); 2062 } 2063 2064 return (ret); 2065 } 2066 2067 /* 2068 * Takes a snapshot of the given dataset 2069 */ 2070 int 2071 zfs_snapshot(const char *path) 2072 { 2073 char reason[64]; 2074 const char *delim; 2075 char *parent; 2076 zfs_handle_t *zhp; 2077 zfs_cmd_t zc = { 0 }; 2078 int ret; 2079 2080 /* validate the snapshot name */ 2081 if (!zfs_validate_name(path, ZFS_TYPE_SNAPSHOT, reason, 2082 sizeof (reason))) { 2083 zfs_error(dgettext(TEXT_DOMAIN, 2084 "cannot snapshot '%s': %s in snapshot name"), path, 2085 reason); 2086 return (-1); 2087 } 2088 2089 /* make sure we have a snapshot */ 2090 if ((delim = strchr(path, '@')) == NULL) { 2091 zfs_error(dgettext(TEXT_DOMAIN, 2092 "cannot snapshot '%s': missing '@' delim in snapshot " 2093 "name"), path); 2094 zfs_error(dgettext(TEXT_DOMAIN, 2095 "use 'zfs create' to create a filesystem")); 2096 return (-1); 2097 } 2098 2099 /* make sure the parent exists and is of the appropriate type */ 2100 parent = zfs_malloc(delim - path + 1); 2101 (void) strncpy(parent, path, delim - path); 2102 parent[delim - path] = '\0'; 2103 2104 if ((zhp = zfs_open(parent, ZFS_TYPE_FILESYSTEM | 2105 ZFS_TYPE_VOLUME)) == NULL) { 2106 free(parent); 2107 return (-1); 2108 } 2109 2110 (void) strlcpy(zc.zc_name, path, sizeof (zc.zc_name)); 2111 2112 if (zhp->zfs_type == ZFS_TYPE_VOLUME) 2113 zc.zc_objset_type = DMU_OST_ZVOL; 2114 else 2115 zc.zc_objset_type = DMU_OST_ZFS; 2116 2117 ret = ioctl(zfs_fd, ZFS_IOC_CREATE, &zc); 2118 2119 if (ret == 0 && zhp->zfs_type == ZFS_TYPE_VOLUME) { 2120 ret = zvol_create_link(path); 2121 if (ret != 0) 2122 (void) ioctl(zfs_fd, ZFS_IOC_DESTROY, &zc); 2123 } 2124 2125 if (ret != 0) { 2126 switch (errno) { 2127 case EPERM: 2128 /* 2129 * User doesn't have permission to create a snapshot 2130 */ 2131 zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': " 2132 "permission denied"), path); 2133 break; 2134 2135 case EDQUOT: 2136 case ENOSPC: 2137 /* 2138 * Out of space in parent. 2139 */ 2140 zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': " 2141 "not enough space in '%s'"), path, parent); 2142 break; 2143 2144 case EEXIST: 2145 /* 2146 * Snapshot already exists. 2147 */ 2148 zfs_error(dgettext(TEXT_DOMAIN, "cannot create '%s': " 2149 "snapshot exists"), path); 2150 break; 2151 2152 case ENOENT: 2153 /* 2154 * Shouldn't happen because we verified the parent 2155 * above. But there may be a race condition where it 2156 * has since been removed. 2157 */ 2158 zfs_error(dgettext(TEXT_DOMAIN, "cannot open '%s': " 2159 "no such %s"), parent, 2160 zfs_type_to_name(zhp->zfs_type)); 2161 break; 2162 2163 default: 2164 zfs_baderror(errno); 2165 } 2166 } 2167 2168 free(parent); 2169 zfs_close(zhp); 2170 2171 return (ret); 2172 } 2173 2174 /* 2175 * Dumps a backup of tosnap, incremental from fromsnap if it isn't NULL. 2176 */ 2177 int 2178 zfs_backup(zfs_handle_t *zhp_to, zfs_handle_t *zhp_from) 2179 { 2180 zfs_cmd_t zc = { 0 }; 2181 int ret; 2182 2183 /* do the ioctl() */ 2184 (void) strlcpy(zc.zc_name, zhp_to->zfs_name, sizeof (zc.zc_name)); 2185 if (zhp_from) { 2186 (void) strlcpy(zc.zc_prop_value, zhp_from->zfs_name, 2187 sizeof (zc.zc_name)); 2188 } else { 2189 zc.zc_prop_value[0] = '\0'; 2190 } 2191 zc.zc_cookie = STDOUT_FILENO; 2192 2193 ret = ioctl(zfs_fd, ZFS_IOC_SENDBACKUP, &zc); 2194 if (ret != 0) { 2195 switch (errno) { 2196 case EPERM: 2197 /* 2198 * User doesn't have permission to do a backup 2199 */ 2200 zfs_error(dgettext(TEXT_DOMAIN, "cannot backup '%s': " 2201 "permission denied"), zhp_to->zfs_name); 2202 break; 2203 2204 case EXDEV: 2205 zfs_error(dgettext(TEXT_DOMAIN, 2206 "cannot do incremental backup from %s:\n" 2207 "it is not an earlier snapshot from the " 2208 "same fs as %s"), 2209 zhp_from->zfs_name, zhp_to->zfs_name); 2210 break; 2211 2212 case ENOENT: 2213 /* 2214 * Shouldn't happen because we verified the parent 2215 * above. But there may be a race condition where it 2216 * has since been removed. 2217 */ 2218 zfs_error(dgettext(TEXT_DOMAIN, "cannot open: " 2219 "no such snapshot")); 2220 break; 2221 2222 case EDQUOT: 2223 case EFBIG: 2224 case EIO: 2225 case ENOLINK: 2226 case ENOSPC: 2227 case ENOSTR: 2228 case ENXIO: 2229 case EPIPE: 2230 case ERANGE: 2231 case EFAULT: 2232 case EROFS: 2233 zfs_error(dgettext(TEXT_DOMAIN, 2234 "cannot write backup stream: %s"), 2235 strerror(errno)); 2236 break; 2237 2238 case EINTR: 2239 zfs_error(dgettext(TEXT_DOMAIN, 2240 "backup failed: signal recieved")); 2241 break; 2242 2243 default: 2244 zfs_baderror(errno); 2245 } 2246 } 2247 2248 return (ret); 2249 } 2250 2251 /* 2252 * Restores a backup of tosnap from stdin. 2253 */ 2254 int 2255 zfs_restore(const char *tosnap, int isprefix, int verbose, int dryrun) 2256 { 2257 zfs_cmd_t zc = { 0 }; 2258 time_t begin_time; 2259 int ioctl_err, err, bytes, size; 2260 char *cp; 2261 dmu_replay_record_t drr; 2262 struct drr_begin *drrb = &zc.zc_begin_record; 2263 2264 begin_time = time(NULL); 2265 2266 /* trim off snapname, if any */ 2267 (void) strcpy(zc.zc_name, tosnap); 2268 cp = strchr(zc.zc_name, '@'); 2269 if (cp) 2270 *cp = '\0'; 2271 2272 /* read in the BEGIN record */ 2273 cp = (char *)&drr; 2274 bytes = 0; 2275 do { 2276 size = read(STDIN_FILENO, cp, sizeof (drr) - bytes); 2277 cp += size; 2278 bytes += size; 2279 } while (size > 0); 2280 2281 if (size < 0 || bytes != sizeof (drr)) { 2282 zfs_error(dgettext(TEXT_DOMAIN, 2283 "cannot restore: invalid backup stream " 2284 "(couldn't read first record)")); 2285 return (-1); 2286 } 2287 2288 zc.zc_begin_record = drr.drr_u.drr_begin; 2289 2290 if (drrb->drr_magic != DMU_BACKUP_MAGIC && 2291 drrb->drr_magic != BSWAP_64(DMU_BACKUP_MAGIC)) { 2292 zfs_error(dgettext(TEXT_DOMAIN, 2293 "cannot restore: invalid backup stream " 2294 "(invalid magic number)")); 2295 return (-1); 2296 } 2297 2298 if (drrb->drr_version != DMU_BACKUP_VERSION && 2299 drrb->drr_version != BSWAP_64(DMU_BACKUP_VERSION)) { 2300 if (drrb->drr_magic == BSWAP_64(DMU_BACKUP_MAGIC)) 2301 drrb->drr_version = BSWAP_64(drrb->drr_version); 2302 zfs_error(dgettext(TEXT_DOMAIN, 2303 "cannot restore: only backup version 0x%llx is supported, " 2304 "stream is version %llx."), 2305 DMU_BACKUP_VERSION, drrb->drr_version); 2306 return (-1); 2307 } 2308 2309 /* 2310 * Determine name of destination snapshot. 2311 */ 2312 (void) strcpy(drrb->drr_toname, tosnap); 2313 if (isprefix) { 2314 if (strchr(tosnap, '@') != NULL) { 2315 zfs_error(dgettext(TEXT_DOMAIN, 2316 "cannot restore: " 2317 "argument to -d must be a filesystem")); 2318 return (-1); 2319 } 2320 2321 cp = strchr(drr.drr_u.drr_begin.drr_toname, '/'); 2322 if (cp == NULL) 2323 cp = drr.drr_u.drr_begin.drr_toname; 2324 else 2325 cp++; 2326 2327 (void) strcat(drrb->drr_toname, "/"); 2328 (void) strcat(drrb->drr_toname, cp); 2329 } else if (strchr(tosnap, '@') == NULL) { 2330 /* 2331 * they specified just a filesystem; tack on the 2332 * snapname from the backup. 2333 */ 2334 cp = strchr(drr.drr_u.drr_begin.drr_toname, '@'); 2335 if (cp == NULL || strlen(tosnap) + strlen(cp) >= MAXNAMELEN) { 2336 zfs_error(dgettext(TEXT_DOMAIN, 2337 "cannot restore: invalid backup stream " 2338 "(invalid snapshot name)")); 2339 return (-1); 2340 } 2341 (void) strcat(drrb->drr_toname, cp); 2342 } 2343 2344 if (drrb->drr_fromguid) { 2345 zfs_handle_t *h; 2346 /* incremental backup stream */ 2347 2348 /* do the ioctl to the containing fs */ 2349 (void) strcpy(zc.zc_name, drrb->drr_toname); 2350 cp = strchr(zc.zc_name, '@'); 2351 *cp = '\0'; 2352 2353 /* make sure destination fs exists */ 2354 h = zfs_open(zc.zc_name, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME); 2355 if (h == NULL) { 2356 zfs_error(dgettext(TEXT_DOMAIN, 2357 "cannot restore incrememtal backup: destination\n" 2358 "filesystem %s does not exist"), 2359 zc.zc_name); 2360 return (-1); 2361 } 2362 if (!dryrun) { 2363 /* unmount destination fs or remove device link. */ 2364 if (h->zfs_type == ZFS_TYPE_FILESYSTEM) { 2365 (void) zfs_unmount(h, NULL, 0); 2366 } else { 2367 (void) zvol_remove_link(h->zfs_name); 2368 } 2369 } 2370 zfs_close(h); 2371 } else { 2372 /* full backup stream */ 2373 2374 (void) strcpy(zc.zc_name, drrb->drr_toname); 2375 2376 /* make sure they aren't trying to restore into the root */ 2377 if (strchr(zc.zc_name, '/') == NULL) { 2378 cp = strchr(zc.zc_name, '@'); 2379 if (cp) 2380 *cp = '\0'; 2381 zfs_error(dgettext(TEXT_DOMAIN, 2382 "cannot restore: destination fs %s already exists"), 2383 zc.zc_name); 2384 return (-1); 2385 } 2386 2387 if (isprefix) { 2388 zfs_handle_t *h; 2389 2390 /* make sure prefix exists */ 2391 h = zfs_open(tosnap, ZFS_TYPE_FILESYSTEM | 2392 ZFS_TYPE_VOLUME); 2393 if (h == NULL) { 2394 zfs_error(dgettext(TEXT_DOMAIN, 2395 "cannot restore: " 2396 "filesystem %s does not exist"), 2397 tosnap); 2398 return (-1); 2399 } 2400 2401 /* create any necessary ancestors up to prefix */ 2402 zc.zc_objset_type = DMU_OST_ZFS; 2403 /* 2404 * zc.zc_name is now the full name of the snap 2405 * we're restoring into 2406 */ 2407 cp = zc.zc_name + strlen(tosnap) + 1; 2408 while (cp = strchr(cp, '/')) { 2409 *cp = '\0'; 2410 err = ioctl(zfs_fd, ZFS_IOC_CREATE, &zc); 2411 if (err && errno != ENOENT && errno != EEXIST) { 2412 zfs_error(dgettext(TEXT_DOMAIN, 2413 "cannot restore: " 2414 "couldn't create ancestor %s"), 2415 zc.zc_name); 2416 return (-1); 2417 } 2418 *cp = '/'; 2419 cp++; 2420 } 2421 } 2422 2423 /* Make sure destination fs does not exist */ 2424 cp = strchr(zc.zc_name, '@'); 2425 *cp = '\0'; 2426 if (ioctl(zfs_fd, ZFS_IOC_OBJSET_STATS, &zc) == 0) { 2427 zfs_error(dgettext(TEXT_DOMAIN, 2428 "cannot restore full backup: " 2429 "destination filesystem %s already exists"), 2430 zc.zc_name); 2431 return (-1); 2432 } 2433 2434 /* Do the recvbackup ioctl to the fs's parent. */ 2435 cp = strrchr(zc.zc_name, '/'); 2436 *cp = '\0'; 2437 } 2438 2439 (void) strcpy(zc.zc_prop_value, tosnap); 2440 zc.zc_cookie = STDIN_FILENO; 2441 zc.zc_intsz = isprefix; 2442 if (verbose) { 2443 (void) printf("%s %s backup of %s into %s\n", 2444 dryrun ? "would restore" : "restoring", 2445 drrb->drr_fromguid ? "incremental" : "full", 2446 drr.drr_u.drr_begin.drr_toname, 2447 zc.zc_begin_record.drr_toname); 2448 (void) fflush(stdout); 2449 } 2450 if (dryrun) 2451 return (0); 2452 err = ioctl_err = ioctl(zfs_fd, ZFS_IOC_RECVBACKUP, &zc); 2453 if (ioctl_err != 0) { 2454 switch (errno) { 2455 case ENODEV: 2456 zfs_error(dgettext(TEXT_DOMAIN, 2457 "cannot restore: " 2458 "most recent snapshot does not " 2459 "match incremental backup source")); 2460 break; 2461 case ETXTBSY: 2462 zfs_error(dgettext(TEXT_DOMAIN, 2463 "cannot restore: " 2464 "destination has been modified since " 2465 "most recent snapshot --\n" 2466 "use 'zfs rollback' to discard changes")); 2467 break; 2468 case EEXIST: 2469 if (drrb->drr_fromguid == 0) { 2470 /* it's the containing fs that exists */ 2471 cp = strchr(drrb->drr_toname, '@'); 2472 *cp = '\0'; 2473 } 2474 zfs_error(dgettext(TEXT_DOMAIN, 2475 "cannot restore to %s: destination already exists"), 2476 drrb->drr_toname); 2477 break; 2478 case ENOENT: 2479 zfs_error(dgettext(TEXT_DOMAIN, 2480 "cannot restore: destination does not exist")); 2481 break; 2482 case EBUSY: 2483 zfs_error(dgettext(TEXT_DOMAIN, 2484 "cannot restore: destination is in use")); 2485 break; 2486 case ENOSPC: 2487 zfs_error(dgettext(TEXT_DOMAIN, 2488 "cannot restore: out of space")); 2489 break; 2490 case EDQUOT: 2491 zfs_error(dgettext(TEXT_DOMAIN, 2492 "cannot restore: quota exceeded")); 2493 break; 2494 case EINTR: 2495 zfs_error(dgettext(TEXT_DOMAIN, 2496 "restore failed: signal recieved")); 2497 break; 2498 case EINVAL: 2499 zfs_error(dgettext(TEXT_DOMAIN, 2500 "cannot restore: invalid backup stream")); 2501 break; 2502 case EPERM: 2503 zfs_error(dgettext(TEXT_DOMAIN, 2504 "cannot restore: permission denied")); 2505 break; 2506 default: 2507 zfs_baderror(errno); 2508 } 2509 } 2510 2511 /* 2512 * Mount or recreate the /dev links for the target filesystem 2513 * (if created, or if we tore them down to do an incremental 2514 * restore), and the /dev links for the new snapshot (if 2515 * created). 2516 */ 2517 cp = strchr(drrb->drr_toname, '@'); 2518 if (cp && (ioctl_err == 0 || drrb->drr_fromguid)) { 2519 zfs_handle_t *h; 2520 2521 *cp = '\0'; 2522 h = zfs_open(drrb->drr_toname, 2523 ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME); 2524 *cp = '@'; 2525 if (h) { 2526 if (h->zfs_type == ZFS_TYPE_FILESYSTEM) { 2527 err = zfs_mount(h, NULL, 0); 2528 } else { 2529 err = zvol_create_link(h->zfs_name); 2530 if (err == 0 && ioctl_err == 0) { 2531 err = 2532 zvol_create_link(drrb->drr_toname); 2533 } 2534 } 2535 zfs_close(h); 2536 } 2537 } 2538 2539 if (err || ioctl_err) 2540 return (-1); 2541 2542 if (verbose) { 2543 char buf1[64]; 2544 char buf2[64]; 2545 uint64_t bytes = zc.zc_cookie; 2546 time_t delta = time(NULL) - begin_time; 2547 if (delta == 0) 2548 delta = 1; 2549 zfs_nicenum(bytes, buf1, sizeof (buf1)); 2550 zfs_nicenum(bytes/delta, buf2, sizeof (buf1)); 2551 2552 (void) printf("restored %sb backup in %lu seconds (%sb/sec)\n", 2553 buf1, delta, buf2); 2554 } 2555 return (0); 2556 } 2557 2558 /* 2559 * Rollback the given dataset to the previous snapshot. It is up to the caller 2560 * to verify that there is a previous snapshot available. 2561 */ 2562 int 2563 zfs_rollback(zfs_handle_t *zhp) 2564 { 2565 int ret; 2566 zfs_cmd_t zc = { 0 }; 2567 2568 assert(zhp->zfs_type == ZFS_TYPE_FILESYSTEM || 2569 zhp->zfs_type == ZFS_TYPE_VOLUME); 2570 2571 if (zhp->zfs_type == ZFS_TYPE_VOLUME && 2572 zvol_remove_link(zhp->zfs_name) != 0) 2573 return (-1); 2574 2575 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 2576 2577 if (zhp->zfs_volblocksize != 0) 2578 zc.zc_objset_type = DMU_OST_ZVOL; 2579 else 2580 zc.zc_objset_type = DMU_OST_ZFS; 2581 2582 /* 2583 * We rely on the consumer to verify that there are no newer snapshots 2584 * for the given dataset. Given these constraints, we can simply pass 2585 * the name on to the ioctl() call. There is still an unlikely race 2586 * condition where the user has taken a snapshot since we verified that 2587 * this was the most recent. 2588 */ 2589 if ((ret = ioctl(zfs_fd, ZFS_IOC_ROLLBACK, &zc)) != 0) { 2590 switch (errno) { 2591 case EPERM: 2592 /* 2593 * The user doesn't have permission to rollback the 2594 * given dataset. 2595 */ 2596 zfs_error(dgettext(TEXT_DOMAIN, "cannot rollback '%s': " 2597 "permission denied"), zhp->zfs_name); 2598 break; 2599 2600 case EDQUOT: 2601 case ENOSPC: 2602 /* 2603 * The parent dataset doesn't have enough space to 2604 * rollback to the last snapshot. 2605 */ 2606 { 2607 char parent[ZFS_MAXNAMELEN]; 2608 (void) parent_name(zhp->zfs_name, parent, 2609 sizeof (parent)); 2610 zfs_error(dgettext(TEXT_DOMAIN, "cannot " 2611 "rollback '%s': out of space"), parent); 2612 } 2613 break; 2614 2615 case ENOENT: 2616 /* 2617 * The dataset doesn't exist. This shouldn't happen 2618 * except in race conditions. 2619 */ 2620 zfs_error(dgettext(TEXT_DOMAIN, "cannot rollback '%s': " 2621 "no such %s"), zhp->zfs_name, 2622 zfs_type_to_name(zhp->zfs_type)); 2623 break; 2624 2625 case EBUSY: 2626 /* 2627 * The filesystem is busy. This should have been caught 2628 * by the caller before getting here, but there may be 2629 * an unexpected problem. 2630 */ 2631 zfs_error(dgettext(TEXT_DOMAIN, "cannot rollback '%s': " 2632 "%s is busy"), zhp->zfs_name, 2633 zfs_type_to_name(zhp->zfs_type)); 2634 break; 2635 2636 default: 2637 zfs_baderror(errno); 2638 } 2639 } else if (zhp->zfs_type == ZFS_TYPE_VOLUME) { 2640 ret = zvol_create_link(zhp->zfs_name); 2641 } 2642 2643 return (ret); 2644 } 2645 2646 /* 2647 * Iterate over all dependents for a given dataset. This includes both 2648 * hierarchical dependents (children) and data dependents (snapshots and 2649 * clones). The bulk of the processing occurs in get_dependents() in 2650 * libzfs_graph.c. 2651 */ 2652 int 2653 zfs_iter_dependents(zfs_handle_t *zhp, zfs_iter_f func, void *data) 2654 { 2655 char **dependents; 2656 size_t count; 2657 int i; 2658 zfs_handle_t *child; 2659 int ret = 0; 2660 2661 dependents = get_dependents(zhp->zfs_name, &count); 2662 for (i = 0; i < count; i++) { 2663 if ((child = make_dataset_handle(dependents[i])) == NULL) 2664 continue; 2665 2666 if ((ret = func(child, data)) != 0) 2667 break; 2668 } 2669 2670 for (i = 0; i < count; i++) 2671 free(dependents[i]); 2672 free(dependents); 2673 2674 return (ret); 2675 } 2676 2677 /* 2678 * Renames the given dataset. 2679 */ 2680 int 2681 zfs_rename(zfs_handle_t *zhp, const char *target) 2682 { 2683 int ret; 2684 zfs_cmd_t zc = { 0 }; 2685 char reason[64]; 2686 char *delim; 2687 prop_changelist_t *cl; 2688 char parent[ZFS_MAXNAMELEN]; 2689 2690 (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); 2691 (void) strlcpy(zc.zc_prop_value, target, sizeof (zc.zc_prop_value)); 2692 2693 /* if we have the same exact name, just return success */ 2694 if (strcmp(zhp->zfs_name, target) == 0) 2695 return (0); 2696 2697 /* 2698 * Make sure the target name is valid 2699 */ 2700 if (!zfs_validate_name(target, zhp->zfs_type, reason, 2701 sizeof (reason))) { 2702 zfs_error(dgettext(TEXT_DOMAIN, 2703 "cannot create '%s': %s in %s name"), target, reason, 2704 zfs_type_to_name(zhp->zfs_type)); 2705 return (-1); 2706 } 2707 2708 if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) { 2709 if ((delim = strchr(target, '@')) == NULL) { 2710 zfs_error(dgettext(TEXT_DOMAIN, 2711 "cannot rename to '%s': not a snapshot"), target); 2712 return (-1); 2713 } 2714 2715 /* 2716 * Make sure we're renaming within the same dataset. 2717 */ 2718 if (strncmp(zhp->zfs_name, target, delim - target) != 0 || 2719 zhp->zfs_name[delim - target] != '@') { 2720 zfs_error(dgettext(TEXT_DOMAIN, 2721 "cannot rename to '%s': snapshots must be part " 2722 "of same dataset"), target); 2723 return (-1); 2724 } 2725 2726 (void) strncpy(parent, target, delim - target); 2727 parent[delim - target] = '\0'; 2728 } else { 2729 /* validate parents */ 2730 if (check_parents(target, zhp->zfs_type) != 0) 2731 return (-1); 2732 2733 (void) parent_name(target, parent, sizeof (parent)); 2734 2735 /* make sure we're in the same pool */ 2736 verify((delim = strchr(target, '/')) != NULL); 2737 if (strncmp(zhp->zfs_name, target, delim - target) != 0 || 2738 zhp->zfs_name[delim - target] != '/') { 2739 zfs_error(dgettext(TEXT_DOMAIN, 2740 "cannot rename to '%s': " 2741 "datasets must be within same pool"), target); 2742 return (-1); 2743 } 2744 } 2745 2746 if (getzoneid() == GLOBAL_ZONEID && 2747 zfs_prop_get_int(zhp, ZFS_PROP_ZONED)) { 2748 zfs_error(dgettext(TEXT_DOMAIN, "cannot rename %s, " 2749 "dataset is used in a non-global zone"), zhp->zfs_name); 2750 return (-1); 2751 } 2752 2753 if ((cl = changelist_gather(zhp, ZFS_PROP_NAME, 0)) == NULL) 2754 return (1); 2755 2756 if (changelist_haszonedchild(cl)) { 2757 zfs_error(dgettext(TEXT_DOMAIN, 2758 "cannot rename '%s': child dataset with inherited " 2759 "mountpoint is used in a non-global zone"), zhp->zfs_name); 2760 ret = -1; 2761 goto error; 2762 } 2763 2764 if ((ret = changelist_prefix(cl)) != 0) 2765 goto error; 2766 2767 if (zhp->zfs_volblocksize != 0) 2768 zc.zc_objset_type = DMU_OST_ZVOL; 2769 else 2770 zc.zc_objset_type = DMU_OST_ZFS; 2771 2772 if ((ret = ioctl(zfs_fd, ZFS_IOC_RENAME, &zc)) != 0) { 2773 switch (errno) { 2774 case EPERM: 2775 /* 2776 * The user doesn't have permission to rename the 2777 * given dataset. 2778 */ 2779 zfs_error(dgettext(TEXT_DOMAIN, "cannot rename '%s': " 2780 "permission denied"), zhp->zfs_name); 2781 break; 2782 2783 case EDQUOT: 2784 case ENOSPC: 2785 /* 2786 * Not enough space in the parent dataset. 2787 */ 2788 zfs_error(dgettext(TEXT_DOMAIN, "cannot " 2789 "rename '%s': not enough space in '%s'"), 2790 zhp->zfs_name, parent); 2791 break; 2792 2793 case ENOENT: 2794 /* 2795 * The destination doesn't exist. 2796 */ 2797 zfs_error(dgettext(TEXT_DOMAIN, "cannot rename '%s' " 2798 "to '%s': destination doesn't exist"), 2799 zhp->zfs_name, target); 2800 break; 2801 2802 case EEXIST: 2803 /* 2804 * The destination already exists. 2805 */ 2806 zfs_error(dgettext(TEXT_DOMAIN, "cannot rename '%s' " 2807 "to '%s': destination already exists"), 2808 zhp->zfs_name, target); 2809 break; 2810 2811 case EBUSY: 2812 /* 2813 * The filesystem is busy. This should have been caught 2814 * by the caller before getting here, but there may be 2815 * an unexpected problem. 2816 */ 2817 zfs_error(dgettext(TEXT_DOMAIN, "cannot rename '%s': " 2818 "%s is busy"), zhp->zfs_name, 2819 zfs_type_to_name(zhp->zfs_type)); 2820 break; 2821 2822 default: 2823 zfs_baderror(errno); 2824 } 2825 2826 /* 2827 * On failure, we still want to remount any filesystems that 2828 * were previously mounted, so we don't alter the system state. 2829 */ 2830 (void) changelist_postfix(cl); 2831 } else { 2832 changelist_rename(cl, zfs_get_name(zhp), target); 2833 2834 ret = changelist_postfix(cl); 2835 } 2836 2837 error: 2838 changelist_free(cl); 2839 return (ret); 2840 } 2841 2842 /* 2843 * Given a zvol dataset, issue the ioctl to create the appropriate minor node, 2844 * poke devfsadm to create the /dev link, and then wait for the link to appear. 2845 */ 2846 int 2847 zvol_create_link(const char *dataset) 2848 { 2849 zfs_cmd_t zc = { 0 }; 2850 di_devlink_handle_t hdl; 2851 2852 (void) strlcpy(zc.zc_name, dataset, sizeof (zc.zc_name)); 2853 2854 /* 2855 * Issue the appropriate ioctl. 2856 */ 2857 if (ioctl(zfs_fd, ZFS_IOC_CREATE_MINOR, &zc) != 0) { 2858 switch (errno) { 2859 case EPERM: 2860 zfs_error(dgettext(TEXT_DOMAIN, "cannot create " 2861 "device links for '%s': permission denied"), 2862 dataset); 2863 break; 2864 2865 case EEXIST: 2866 /* 2867 * Silently ignore the case where the link already 2868 * exists. This allows 'zfs volinit' to be run multiple 2869 * times without errors. 2870 */ 2871 return (0); 2872 2873 default: 2874 zfs_baderror(errno); 2875 } 2876 2877 return (-1); 2878 } 2879 2880 /* 2881 * Call devfsadm and wait for the links to magically appear. 2882 */ 2883 if ((hdl = di_devlink_init(ZFS_DRIVER, DI_MAKE_LINK)) == NULL) { 2884 zfs_error(dgettext(TEXT_DOMAIN, 2885 "cannot create device links for '%s'"), dataset); 2886 (void) ioctl(zfs_fd, ZFS_IOC_REMOVE_MINOR, &zc); 2887 return (-1); 2888 } else { 2889 (void) di_devlink_fini(&hdl); 2890 } 2891 2892 return (0); 2893 } 2894 2895 /* 2896 * Remove a minor node for the given zvol and the associated /dev links. 2897 */ 2898 int 2899 zvol_remove_link(const char *dataset) 2900 { 2901 zfs_cmd_t zc = { 0 }; 2902 2903 (void) strlcpy(zc.zc_name, dataset, sizeof (zc.zc_name)); 2904 2905 if (ioctl(zfs_fd, ZFS_IOC_REMOVE_MINOR, &zc) != 0) { 2906 switch (errno) { 2907 case EPERM: 2908 zfs_error(dgettext(TEXT_DOMAIN, "cannot remove " 2909 "device links for '%s': permission denied"), 2910 dataset); 2911 break; 2912 2913 case EBUSY: 2914 zfs_error(dgettext(TEXT_DOMAIN, "cannot remove " 2915 "device links for '%s': volume is in use"), 2916 dataset); 2917 break; 2918 2919 case ENXIO: 2920 /* 2921 * Silently ignore the case where the link no longer 2922 * exists, so that 'zfs volfini' can be run multiple 2923 * times without errors. 2924 */ 2925 return (0); 2926 2927 default: 2928 zfs_baderror(errno); 2929 } 2930 2931 return (-1); 2932 } 2933 2934 return (0); 2935 } 2936