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 * Copyright (c) 2012, 2014 by Delphix. All rights reserved. 24 * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. 25 * Copyright (c) 2013, Joyent, Inc. All rights reserved. 26 * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved. 27 * Copyright 2015 Nexenta Systems, Inc. All rights reserved. 28 */ 29 30 /* Portions Copyright 2010 Robert Milkowski */ 31 32 #include <sys/cred.h> 33 #include <sys/zfs_context.h> 34 #include <sys/dmu_objset.h> 35 #include <sys/dsl_dir.h> 36 #include <sys/dsl_dataset.h> 37 #include <sys/dsl_prop.h> 38 #include <sys/dsl_pool.h> 39 #include <sys/dsl_synctask.h> 40 #include <sys/dsl_deleg.h> 41 #include <sys/dnode.h> 42 #include <sys/dbuf.h> 43 #include <sys/zvol.h> 44 #include <sys/dmu_tx.h> 45 #include <sys/zap.h> 46 #include <sys/zil.h> 47 #include <sys/dmu_impl.h> 48 #include <sys/zfs_ioctl.h> 49 #include <sys/sa.h> 50 #include <sys/zfs_onexit.h> 51 #include <sys/dsl_destroy.h> 52 53 /* 54 * Needed to close a window in dnode_move() that allows the objset to be freed 55 * before it can be safely accessed. 56 */ 57 krwlock_t os_lock; 58 59 void 60 dmu_objset_init(void) 61 { 62 rw_init(&os_lock, NULL, RW_DEFAULT, NULL); 63 } 64 65 void 66 dmu_objset_fini(void) 67 { 68 rw_destroy(&os_lock); 69 } 70 71 spa_t * 72 dmu_objset_spa(objset_t *os) 73 { 74 return (os->os_spa); 75 } 76 77 zilog_t * 78 dmu_objset_zil(objset_t *os) 79 { 80 return (os->os_zil); 81 } 82 83 dsl_pool_t * 84 dmu_objset_pool(objset_t *os) 85 { 86 dsl_dataset_t *ds; 87 88 if ((ds = os->os_dsl_dataset) != NULL && ds->ds_dir) 89 return (ds->ds_dir->dd_pool); 90 else 91 return (spa_get_dsl(os->os_spa)); 92 } 93 94 dsl_dataset_t * 95 dmu_objset_ds(objset_t *os) 96 { 97 return (os->os_dsl_dataset); 98 } 99 100 dmu_objset_type_t 101 dmu_objset_type(objset_t *os) 102 { 103 return (os->os_phys->os_type); 104 } 105 106 void 107 dmu_objset_name(objset_t *os, char *buf) 108 { 109 dsl_dataset_name(os->os_dsl_dataset, buf); 110 } 111 112 uint64_t 113 dmu_objset_id(objset_t *os) 114 { 115 dsl_dataset_t *ds = os->os_dsl_dataset; 116 117 return (ds ? ds->ds_object : 0); 118 } 119 120 zfs_sync_type_t 121 dmu_objset_syncprop(objset_t *os) 122 { 123 return (os->os_sync); 124 } 125 126 zfs_logbias_op_t 127 dmu_objset_logbias(objset_t *os) 128 { 129 return (os->os_logbias); 130 } 131 132 static void 133 checksum_changed_cb(void *arg, uint64_t newval) 134 { 135 objset_t *os = arg; 136 137 /* 138 * Inheritance should have been done by now. 139 */ 140 ASSERT(newval != ZIO_CHECKSUM_INHERIT); 141 142 os->os_checksum = zio_checksum_select(newval, ZIO_CHECKSUM_ON_VALUE); 143 } 144 145 static void 146 compression_changed_cb(void *arg, uint64_t newval) 147 { 148 objset_t *os = arg; 149 150 /* 151 * Inheritance and range checking should have been done by now. 152 */ 153 ASSERT(newval != ZIO_COMPRESS_INHERIT); 154 155 os->os_compress = zio_compress_select(os->os_spa, newval, 156 ZIO_COMPRESS_ON); 157 } 158 159 static void 160 copies_changed_cb(void *arg, uint64_t newval) 161 { 162 objset_t *os = arg; 163 164 /* 165 * Inheritance and range checking should have been done by now. 166 */ 167 ASSERT(newval > 0); 168 ASSERT(newval <= spa_max_replication(os->os_spa)); 169 170 os->os_copies = newval; 171 } 172 173 static void 174 dedup_changed_cb(void *arg, uint64_t newval) 175 { 176 objset_t *os = arg; 177 spa_t *spa = os->os_spa; 178 enum zio_checksum checksum; 179 180 /* 181 * Inheritance should have been done by now. 182 */ 183 ASSERT(newval != ZIO_CHECKSUM_INHERIT); 184 185 checksum = zio_checksum_dedup_select(spa, newval, ZIO_CHECKSUM_OFF); 186 187 os->os_dedup_checksum = checksum & ZIO_CHECKSUM_MASK; 188 os->os_dedup_verify = !!(checksum & ZIO_CHECKSUM_VERIFY); 189 } 190 191 static void 192 primary_cache_changed_cb(void *arg, uint64_t newval) 193 { 194 objset_t *os = arg; 195 196 /* 197 * Inheritance and range checking should have been done by now. 198 */ 199 ASSERT(newval == ZFS_CACHE_ALL || newval == ZFS_CACHE_NONE || 200 newval == ZFS_CACHE_METADATA); 201 202 os->os_primary_cache = newval; 203 } 204 205 static void 206 secondary_cache_changed_cb(void *arg, uint64_t newval) 207 { 208 objset_t *os = arg; 209 210 /* 211 * Inheritance and range checking should have been done by now. 212 */ 213 ASSERT(newval == ZFS_CACHE_ALL || newval == ZFS_CACHE_NONE || 214 newval == ZFS_CACHE_METADATA); 215 216 os->os_secondary_cache = newval; 217 } 218 219 static void 220 sync_changed_cb(void *arg, uint64_t newval) 221 { 222 objset_t *os = arg; 223 224 /* 225 * Inheritance and range checking should have been done by now. 226 */ 227 ASSERT(newval == ZFS_SYNC_STANDARD || newval == ZFS_SYNC_ALWAYS || 228 newval == ZFS_SYNC_DISABLED); 229 230 os->os_sync = newval; 231 if (os->os_zil) 232 zil_set_sync(os->os_zil, newval); 233 } 234 235 static void 236 redundant_metadata_changed_cb(void *arg, uint64_t newval) 237 { 238 objset_t *os = arg; 239 240 /* 241 * Inheritance and range checking should have been done by now. 242 */ 243 ASSERT(newval == ZFS_REDUNDANT_METADATA_ALL || 244 newval == ZFS_REDUNDANT_METADATA_MOST); 245 246 os->os_redundant_metadata = newval; 247 } 248 249 static void 250 logbias_changed_cb(void *arg, uint64_t newval) 251 { 252 objset_t *os = arg; 253 254 ASSERT(newval == ZFS_LOGBIAS_LATENCY || 255 newval == ZFS_LOGBIAS_THROUGHPUT); 256 os->os_logbias = newval; 257 if (os->os_zil) 258 zil_set_logbias(os->os_zil, newval); 259 } 260 261 static void 262 recordsize_changed_cb(void *arg, uint64_t newval) 263 { 264 objset_t *os = arg; 265 266 os->os_recordsize = newval; 267 } 268 269 void 270 dmu_objset_byteswap(void *buf, size_t size) 271 { 272 objset_phys_t *osp = buf; 273 274 ASSERT(size == OBJSET_OLD_PHYS_SIZE || size == sizeof (objset_phys_t)); 275 dnode_byteswap(&osp->os_meta_dnode); 276 byteswap_uint64_array(&osp->os_zil_header, sizeof (zil_header_t)); 277 osp->os_type = BSWAP_64(osp->os_type); 278 osp->os_flags = BSWAP_64(osp->os_flags); 279 if (size == sizeof (objset_phys_t)) { 280 dnode_byteswap(&osp->os_userused_dnode); 281 dnode_byteswap(&osp->os_groupused_dnode); 282 } 283 } 284 285 int 286 dmu_objset_open_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp, 287 objset_t **osp) 288 { 289 objset_t *os; 290 int i, err; 291 292 ASSERT(ds == NULL || MUTEX_HELD(&ds->ds_opening_lock)); 293 294 os = kmem_zalloc(sizeof (objset_t), KM_SLEEP); 295 os->os_dsl_dataset = ds; 296 os->os_spa = spa; 297 os->os_rootbp = bp; 298 if (!BP_IS_HOLE(os->os_rootbp)) { 299 arc_flags_t aflags = ARC_FLAG_WAIT; 300 zbookmark_phys_t zb; 301 SET_BOOKMARK(&zb, ds ? ds->ds_object : DMU_META_OBJSET, 302 ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID); 303 304 if (DMU_OS_IS_L2CACHEABLE(os)) 305 aflags |= ARC_FLAG_L2CACHE; 306 if (DMU_OS_IS_L2COMPRESSIBLE(os)) 307 aflags |= ARC_FLAG_L2COMPRESS; 308 309 dprintf_bp(os->os_rootbp, "reading %s", ""); 310 err = arc_read(NULL, spa, os->os_rootbp, 311 arc_getbuf_func, &os->os_phys_buf, 312 ZIO_PRIORITY_SYNC_READ, ZIO_FLAG_CANFAIL, &aflags, &zb); 313 if (err != 0) { 314 kmem_free(os, sizeof (objset_t)); 315 /* convert checksum errors into IO errors */ 316 if (err == ECKSUM) 317 err = SET_ERROR(EIO); 318 return (err); 319 } 320 321 /* Increase the blocksize if we are permitted. */ 322 if (spa_version(spa) >= SPA_VERSION_USERSPACE && 323 arc_buf_size(os->os_phys_buf) < sizeof (objset_phys_t)) { 324 arc_buf_t *buf = arc_buf_alloc(spa, 325 sizeof (objset_phys_t), &os->os_phys_buf, 326 ARC_BUFC_METADATA); 327 bzero(buf->b_data, sizeof (objset_phys_t)); 328 bcopy(os->os_phys_buf->b_data, buf->b_data, 329 arc_buf_size(os->os_phys_buf)); 330 (void) arc_buf_remove_ref(os->os_phys_buf, 331 &os->os_phys_buf); 332 os->os_phys_buf = buf; 333 } 334 335 os->os_phys = os->os_phys_buf->b_data; 336 os->os_flags = os->os_phys->os_flags; 337 } else { 338 int size = spa_version(spa) >= SPA_VERSION_USERSPACE ? 339 sizeof (objset_phys_t) : OBJSET_OLD_PHYS_SIZE; 340 os->os_phys_buf = arc_buf_alloc(spa, size, 341 &os->os_phys_buf, ARC_BUFC_METADATA); 342 os->os_phys = os->os_phys_buf->b_data; 343 bzero(os->os_phys, size); 344 } 345 346 /* 347 * Note: the changed_cb will be called once before the register 348 * func returns, thus changing the checksum/compression from the 349 * default (fletcher2/off). Snapshots don't need to know about 350 * checksum/compression/copies. 351 */ 352 if (ds != NULL) { 353 err = dsl_prop_register(ds, 354 zfs_prop_to_name(ZFS_PROP_PRIMARYCACHE), 355 primary_cache_changed_cb, os); 356 if (err == 0) { 357 err = dsl_prop_register(ds, 358 zfs_prop_to_name(ZFS_PROP_SECONDARYCACHE), 359 secondary_cache_changed_cb, os); 360 } 361 if (!ds->ds_is_snapshot) { 362 if (err == 0) { 363 err = dsl_prop_register(ds, 364 zfs_prop_to_name(ZFS_PROP_CHECKSUM), 365 checksum_changed_cb, os); 366 } 367 if (err == 0) { 368 err = dsl_prop_register(ds, 369 zfs_prop_to_name(ZFS_PROP_COMPRESSION), 370 compression_changed_cb, os); 371 } 372 if (err == 0) { 373 err = dsl_prop_register(ds, 374 zfs_prop_to_name(ZFS_PROP_COPIES), 375 copies_changed_cb, os); 376 } 377 if (err == 0) { 378 err = dsl_prop_register(ds, 379 zfs_prop_to_name(ZFS_PROP_DEDUP), 380 dedup_changed_cb, os); 381 } 382 if (err == 0) { 383 err = dsl_prop_register(ds, 384 zfs_prop_to_name(ZFS_PROP_LOGBIAS), 385 logbias_changed_cb, os); 386 } 387 if (err == 0) { 388 err = dsl_prop_register(ds, 389 zfs_prop_to_name(ZFS_PROP_SYNC), 390 sync_changed_cb, os); 391 } 392 if (err == 0) { 393 err = dsl_prop_register(ds, 394 zfs_prop_to_name( 395 ZFS_PROP_REDUNDANT_METADATA), 396 redundant_metadata_changed_cb, os); 397 } 398 if (err == 0) { 399 err = dsl_prop_register(ds, 400 zfs_prop_to_name(ZFS_PROP_RECORDSIZE), 401 recordsize_changed_cb, os); 402 } 403 } 404 if (err != 0) { 405 VERIFY(arc_buf_remove_ref(os->os_phys_buf, 406 &os->os_phys_buf)); 407 kmem_free(os, sizeof (objset_t)); 408 return (err); 409 } 410 } else { 411 /* It's the meta-objset. */ 412 os->os_checksum = ZIO_CHECKSUM_FLETCHER_4; 413 os->os_compress = ZIO_COMPRESS_ON; 414 os->os_copies = spa_max_replication(spa); 415 os->os_dedup_checksum = ZIO_CHECKSUM_OFF; 416 os->os_dedup_verify = B_FALSE; 417 os->os_logbias = ZFS_LOGBIAS_LATENCY; 418 os->os_sync = ZFS_SYNC_STANDARD; 419 os->os_primary_cache = ZFS_CACHE_ALL; 420 os->os_secondary_cache = ZFS_CACHE_ALL; 421 } 422 423 if (ds == NULL || !ds->ds_is_snapshot) 424 os->os_zil_header = os->os_phys->os_zil_header; 425 os->os_zil = zil_alloc(os, &os->os_zil_header); 426 427 for (i = 0; i < TXG_SIZE; i++) { 428 list_create(&os->os_dirty_dnodes[i], sizeof (dnode_t), 429 offsetof(dnode_t, dn_dirty_link[i])); 430 list_create(&os->os_free_dnodes[i], sizeof (dnode_t), 431 offsetof(dnode_t, dn_dirty_link[i])); 432 } 433 list_create(&os->os_dnodes, sizeof (dnode_t), 434 offsetof(dnode_t, dn_link)); 435 list_create(&os->os_downgraded_dbufs, sizeof (dmu_buf_impl_t), 436 offsetof(dmu_buf_impl_t, db_link)); 437 438 mutex_init(&os->os_lock, NULL, MUTEX_DEFAULT, NULL); 439 mutex_init(&os->os_obj_lock, NULL, MUTEX_DEFAULT, NULL); 440 mutex_init(&os->os_user_ptr_lock, NULL, MUTEX_DEFAULT, NULL); 441 442 dnode_special_open(os, &os->os_phys->os_meta_dnode, 443 DMU_META_DNODE_OBJECT, &os->os_meta_dnode); 444 if (arc_buf_size(os->os_phys_buf) >= sizeof (objset_phys_t)) { 445 dnode_special_open(os, &os->os_phys->os_userused_dnode, 446 DMU_USERUSED_OBJECT, &os->os_userused_dnode); 447 dnode_special_open(os, &os->os_phys->os_groupused_dnode, 448 DMU_GROUPUSED_OBJECT, &os->os_groupused_dnode); 449 } 450 451 *osp = os; 452 return (0); 453 } 454 455 int 456 dmu_objset_from_ds(dsl_dataset_t *ds, objset_t **osp) 457 { 458 int err = 0; 459 460 mutex_enter(&ds->ds_opening_lock); 461 if (ds->ds_objset == NULL) { 462 objset_t *os; 463 err = dmu_objset_open_impl(dsl_dataset_get_spa(ds), 464 ds, dsl_dataset_get_blkptr(ds), &os); 465 466 if (err == 0) { 467 mutex_enter(&ds->ds_lock); 468 ASSERT(ds->ds_objset == NULL); 469 ds->ds_objset = os; 470 mutex_exit(&ds->ds_lock); 471 } 472 } 473 *osp = ds->ds_objset; 474 mutex_exit(&ds->ds_opening_lock); 475 return (err); 476 } 477 478 /* 479 * Holds the pool while the objset is held. Therefore only one objset 480 * can be held at a time. 481 */ 482 int 483 dmu_objset_hold(const char *name, void *tag, objset_t **osp) 484 { 485 dsl_pool_t *dp; 486 dsl_dataset_t *ds; 487 int err; 488 489 err = dsl_pool_hold(name, tag, &dp); 490 if (err != 0) 491 return (err); 492 err = dsl_dataset_hold(dp, name, tag, &ds); 493 if (err != 0) { 494 dsl_pool_rele(dp, tag); 495 return (err); 496 } 497 498 err = dmu_objset_from_ds(ds, osp); 499 if (err != 0) { 500 dsl_dataset_rele(ds, tag); 501 dsl_pool_rele(dp, tag); 502 } 503 504 return (err); 505 } 506 507 /* 508 * dsl_pool must not be held when this is called. 509 * Upon successful return, there will be a longhold on the dataset, 510 * and the dsl_pool will not be held. 511 */ 512 int 513 dmu_objset_own(const char *name, dmu_objset_type_t type, 514 boolean_t readonly, void *tag, objset_t **osp) 515 { 516 dsl_pool_t *dp; 517 dsl_dataset_t *ds; 518 int err; 519 520 err = dsl_pool_hold(name, FTAG, &dp); 521 if (err != 0) 522 return (err); 523 err = dsl_dataset_own(dp, name, tag, &ds); 524 if (err != 0) { 525 dsl_pool_rele(dp, FTAG); 526 return (err); 527 } 528 529 err = dmu_objset_from_ds(ds, osp); 530 dsl_pool_rele(dp, FTAG); 531 if (err != 0) { 532 dsl_dataset_disown(ds, tag); 533 } else if (type != DMU_OST_ANY && type != (*osp)->os_phys->os_type) { 534 dsl_dataset_disown(ds, tag); 535 return (SET_ERROR(EINVAL)); 536 } else if (!readonly && ds->ds_is_snapshot) { 537 dsl_dataset_disown(ds, tag); 538 return (SET_ERROR(EROFS)); 539 } 540 return (err); 541 } 542 543 void 544 dmu_objset_rele(objset_t *os, void *tag) 545 { 546 dsl_pool_t *dp = dmu_objset_pool(os); 547 dsl_dataset_rele(os->os_dsl_dataset, tag); 548 dsl_pool_rele(dp, tag); 549 } 550 551 /* 552 * When we are called, os MUST refer to an objset associated with a dataset 553 * that is owned by 'tag'; that is, is held and long held by 'tag' and ds_owner 554 * == tag. We will then release and reacquire ownership of the dataset while 555 * holding the pool config_rwlock to avoid intervening namespace or ownership 556 * changes may occur. 557 * 558 * This exists solely to accommodate zfs_ioc_userspace_upgrade()'s desire to 559 * release the hold on its dataset and acquire a new one on the dataset of the 560 * same name so that it can be partially torn down and reconstructed. 561 */ 562 void 563 dmu_objset_refresh_ownership(objset_t *os, void *tag) 564 { 565 dsl_pool_t *dp; 566 dsl_dataset_t *ds, *newds; 567 char name[MAXNAMELEN]; 568 569 ds = os->os_dsl_dataset; 570 VERIFY3P(ds, !=, NULL); 571 VERIFY3P(ds->ds_owner, ==, tag); 572 VERIFY(dsl_dataset_long_held(ds)); 573 574 dsl_dataset_name(ds, name); 575 dp = dmu_objset_pool(os); 576 dsl_pool_config_enter(dp, FTAG); 577 dmu_objset_disown(os, tag); 578 VERIFY0(dsl_dataset_own(dp, name, tag, &newds)); 579 VERIFY3P(newds, ==, os->os_dsl_dataset); 580 dsl_pool_config_exit(dp, FTAG); 581 } 582 583 void 584 dmu_objset_disown(objset_t *os, void *tag) 585 { 586 dsl_dataset_disown(os->os_dsl_dataset, tag); 587 } 588 589 void 590 dmu_objset_evict_dbufs(objset_t *os) 591 { 592 dnode_t dn_marker; 593 dnode_t *dn; 594 595 mutex_enter(&os->os_lock); 596 dn = list_head(&os->os_dnodes); 597 while (dn != NULL) { 598 /* 599 * Skip dnodes without holds. We have to do this dance 600 * because dnode_add_ref() only works if there is already a 601 * hold. If the dnode has no holds, then it has no dbufs. 602 */ 603 if (dnode_add_ref(dn, FTAG)) { 604 list_insert_after(&os->os_dnodes, dn, &dn_marker); 605 mutex_exit(&os->os_lock); 606 607 dnode_evict_dbufs(dn); 608 dnode_rele(dn, FTAG); 609 610 mutex_enter(&os->os_lock); 611 dn = list_next(&os->os_dnodes, &dn_marker); 612 list_remove(&os->os_dnodes, &dn_marker); 613 } else { 614 dn = list_next(&os->os_dnodes, dn); 615 } 616 } 617 mutex_exit(&os->os_lock); 618 619 if (DMU_USERUSED_DNODE(os) != NULL) { 620 dnode_evict_dbufs(DMU_GROUPUSED_DNODE(os)); 621 dnode_evict_dbufs(DMU_USERUSED_DNODE(os)); 622 } 623 dnode_evict_dbufs(DMU_META_DNODE(os)); 624 } 625 626 /* 627 * Objset eviction processing is split into into two pieces. 628 * The first marks the objset as evicting, evicts any dbufs that 629 * have a refcount of zero, and then queues up the objset for the 630 * second phase of eviction. Once os->os_dnodes has been cleared by 631 * dnode_buf_pageout()->dnode_destroy(), the second phase is executed. 632 * The second phase closes the special dnodes, dequeues the objset from 633 * the list of those undergoing eviction, and finally frees the objset. 634 * 635 * NOTE: Due to asynchronous eviction processing (invocation of 636 * dnode_buf_pageout()), it is possible for the meta dnode for the 637 * objset to have no holds even though os->os_dnodes is not empty. 638 */ 639 void 640 dmu_objset_evict(objset_t *os) 641 { 642 dsl_dataset_t *ds = os->os_dsl_dataset; 643 644 for (int t = 0; t < TXG_SIZE; t++) 645 ASSERT(!dmu_objset_is_dirty(os, t)); 646 647 if (ds) { 648 if (!ds->ds_is_snapshot) { 649 VERIFY0(dsl_prop_unregister(ds, 650 zfs_prop_to_name(ZFS_PROP_CHECKSUM), 651 checksum_changed_cb, os)); 652 VERIFY0(dsl_prop_unregister(ds, 653 zfs_prop_to_name(ZFS_PROP_COMPRESSION), 654 compression_changed_cb, os)); 655 VERIFY0(dsl_prop_unregister(ds, 656 zfs_prop_to_name(ZFS_PROP_COPIES), 657 copies_changed_cb, os)); 658 VERIFY0(dsl_prop_unregister(ds, 659 zfs_prop_to_name(ZFS_PROP_DEDUP), 660 dedup_changed_cb, os)); 661 VERIFY0(dsl_prop_unregister(ds, 662 zfs_prop_to_name(ZFS_PROP_LOGBIAS), 663 logbias_changed_cb, os)); 664 VERIFY0(dsl_prop_unregister(ds, 665 zfs_prop_to_name(ZFS_PROP_SYNC), 666 sync_changed_cb, os)); 667 VERIFY0(dsl_prop_unregister(ds, 668 zfs_prop_to_name(ZFS_PROP_REDUNDANT_METADATA), 669 redundant_metadata_changed_cb, os)); 670 VERIFY0(dsl_prop_unregister(ds, 671 zfs_prop_to_name(ZFS_PROP_RECORDSIZE), 672 recordsize_changed_cb, os)); 673 } 674 VERIFY0(dsl_prop_unregister(ds, 675 zfs_prop_to_name(ZFS_PROP_PRIMARYCACHE), 676 primary_cache_changed_cb, os)); 677 VERIFY0(dsl_prop_unregister(ds, 678 zfs_prop_to_name(ZFS_PROP_SECONDARYCACHE), 679 secondary_cache_changed_cb, os)); 680 } 681 682 if (os->os_sa) 683 sa_tear_down(os); 684 685 os->os_evicting = B_TRUE; 686 dmu_objset_evict_dbufs(os); 687 688 mutex_enter(&os->os_lock); 689 spa_evicting_os_register(os->os_spa, os); 690 if (list_is_empty(&os->os_dnodes)) { 691 mutex_exit(&os->os_lock); 692 dmu_objset_evict_done(os); 693 } else { 694 mutex_exit(&os->os_lock); 695 } 696 } 697 698 void 699 dmu_objset_evict_done(objset_t *os) 700 { 701 ASSERT3P(list_head(&os->os_dnodes), ==, NULL); 702 703 dnode_special_close(&os->os_meta_dnode); 704 if (DMU_USERUSED_DNODE(os)) { 705 dnode_special_close(&os->os_userused_dnode); 706 dnode_special_close(&os->os_groupused_dnode); 707 } 708 zil_free(os->os_zil); 709 710 VERIFY(arc_buf_remove_ref(os->os_phys_buf, &os->os_phys_buf)); 711 712 /* 713 * This is a barrier to prevent the objset from going away in 714 * dnode_move() until we can safely ensure that the objset is still in 715 * use. We consider the objset valid before the barrier and invalid 716 * after the barrier. 717 */ 718 rw_enter(&os_lock, RW_READER); 719 rw_exit(&os_lock); 720 721 mutex_destroy(&os->os_lock); 722 mutex_destroy(&os->os_obj_lock); 723 mutex_destroy(&os->os_user_ptr_lock); 724 spa_evicting_os_deregister(os->os_spa, os); 725 kmem_free(os, sizeof (objset_t)); 726 } 727 728 timestruc_t 729 dmu_objset_snap_cmtime(objset_t *os) 730 { 731 return (dsl_dir_snap_cmtime(os->os_dsl_dataset->ds_dir)); 732 } 733 734 /* called from dsl for meta-objset */ 735 objset_t * 736 dmu_objset_create_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp, 737 dmu_objset_type_t type, dmu_tx_t *tx) 738 { 739 objset_t *os; 740 dnode_t *mdn; 741 742 ASSERT(dmu_tx_is_syncing(tx)); 743 744 if (ds != NULL) 745 VERIFY0(dmu_objset_from_ds(ds, &os)); 746 else 747 VERIFY0(dmu_objset_open_impl(spa, NULL, bp, &os)); 748 749 mdn = DMU_META_DNODE(os); 750 751 dnode_allocate(mdn, DMU_OT_DNODE, 1 << DNODE_BLOCK_SHIFT, 752 DN_MAX_INDBLKSHIFT, DMU_OT_NONE, 0, tx); 753 754 /* 755 * We don't want to have to increase the meta-dnode's nlevels 756 * later, because then we could do it in quescing context while 757 * we are also accessing it in open context. 758 * 759 * This precaution is not necessary for the MOS (ds == NULL), 760 * because the MOS is only updated in syncing context. 761 * This is most fortunate: the MOS is the only objset that 762 * needs to be synced multiple times as spa_sync() iterates 763 * to convergence, so minimizing its dn_nlevels matters. 764 */ 765 if (ds != NULL) { 766 int levels = 1; 767 768 /* 769 * Determine the number of levels necessary for the meta-dnode 770 * to contain DN_MAX_OBJECT dnodes. 771 */ 772 while ((uint64_t)mdn->dn_nblkptr << (mdn->dn_datablkshift + 773 (levels - 1) * (mdn->dn_indblkshift - SPA_BLKPTRSHIFT)) < 774 DN_MAX_OBJECT * sizeof (dnode_phys_t)) 775 levels++; 776 777 mdn->dn_next_nlevels[tx->tx_txg & TXG_MASK] = 778 mdn->dn_nlevels = levels; 779 } 780 781 ASSERT(type != DMU_OST_NONE); 782 ASSERT(type != DMU_OST_ANY); 783 ASSERT(type < DMU_OST_NUMTYPES); 784 os->os_phys->os_type = type; 785 if (dmu_objset_userused_enabled(os)) { 786 os->os_phys->os_flags |= OBJSET_FLAG_USERACCOUNTING_COMPLETE; 787 os->os_flags = os->os_phys->os_flags; 788 } 789 790 dsl_dataset_dirty(ds, tx); 791 792 return (os); 793 } 794 795 typedef struct dmu_objset_create_arg { 796 const char *doca_name; 797 cred_t *doca_cred; 798 void (*doca_userfunc)(objset_t *os, void *arg, 799 cred_t *cr, dmu_tx_t *tx); 800 void *doca_userarg; 801 dmu_objset_type_t doca_type; 802 uint64_t doca_flags; 803 } dmu_objset_create_arg_t; 804 805 /*ARGSUSED*/ 806 static int 807 dmu_objset_create_check(void *arg, dmu_tx_t *tx) 808 { 809 dmu_objset_create_arg_t *doca = arg; 810 dsl_pool_t *dp = dmu_tx_pool(tx); 811 dsl_dir_t *pdd; 812 const char *tail; 813 int error; 814 815 if (strchr(doca->doca_name, '@') != NULL) 816 return (SET_ERROR(EINVAL)); 817 818 error = dsl_dir_hold(dp, doca->doca_name, FTAG, &pdd, &tail); 819 if (error != 0) 820 return (error); 821 if (tail == NULL) { 822 dsl_dir_rele(pdd, FTAG); 823 return (SET_ERROR(EEXIST)); 824 } 825 error = dsl_fs_ss_limit_check(pdd, 1, ZFS_PROP_FILESYSTEM_LIMIT, NULL, 826 doca->doca_cred); 827 dsl_dir_rele(pdd, FTAG); 828 829 return (error); 830 } 831 832 static void 833 dmu_objset_create_sync(void *arg, dmu_tx_t *tx) 834 { 835 dmu_objset_create_arg_t *doca = arg; 836 dsl_pool_t *dp = dmu_tx_pool(tx); 837 dsl_dir_t *pdd; 838 const char *tail; 839 dsl_dataset_t *ds; 840 uint64_t obj; 841 blkptr_t *bp; 842 objset_t *os; 843 844 VERIFY0(dsl_dir_hold(dp, doca->doca_name, FTAG, &pdd, &tail)); 845 846 obj = dsl_dataset_create_sync(pdd, tail, NULL, doca->doca_flags, 847 doca->doca_cred, tx); 848 849 VERIFY0(dsl_dataset_hold_obj(pdd->dd_pool, obj, FTAG, &ds)); 850 bp = dsl_dataset_get_blkptr(ds); 851 os = dmu_objset_create_impl(pdd->dd_pool->dp_spa, 852 ds, bp, doca->doca_type, tx); 853 854 if (doca->doca_userfunc != NULL) { 855 doca->doca_userfunc(os, doca->doca_userarg, 856 doca->doca_cred, tx); 857 } 858 859 spa_history_log_internal_ds(ds, "create", tx, ""); 860 dsl_dataset_rele(ds, FTAG); 861 dsl_dir_rele(pdd, FTAG); 862 } 863 864 int 865 dmu_objset_create(const char *name, dmu_objset_type_t type, uint64_t flags, 866 void (*func)(objset_t *os, void *arg, cred_t *cr, dmu_tx_t *tx), void *arg) 867 { 868 dmu_objset_create_arg_t doca; 869 870 doca.doca_name = name; 871 doca.doca_cred = CRED(); 872 doca.doca_flags = flags; 873 doca.doca_userfunc = func; 874 doca.doca_userarg = arg; 875 doca.doca_type = type; 876 877 return (dsl_sync_task(name, 878 dmu_objset_create_check, dmu_objset_create_sync, &doca, 879 5, ZFS_SPACE_CHECK_NORMAL)); 880 } 881 882 typedef struct dmu_objset_clone_arg { 883 const char *doca_clone; 884 const char *doca_origin; 885 cred_t *doca_cred; 886 } dmu_objset_clone_arg_t; 887 888 /*ARGSUSED*/ 889 static int 890 dmu_objset_clone_check(void *arg, dmu_tx_t *tx) 891 { 892 dmu_objset_clone_arg_t *doca = arg; 893 dsl_dir_t *pdd; 894 const char *tail; 895 int error; 896 dsl_dataset_t *origin; 897 dsl_pool_t *dp = dmu_tx_pool(tx); 898 899 if (strchr(doca->doca_clone, '@') != NULL) 900 return (SET_ERROR(EINVAL)); 901 902 error = dsl_dir_hold(dp, doca->doca_clone, FTAG, &pdd, &tail); 903 if (error != 0) 904 return (error); 905 if (tail == NULL) { 906 dsl_dir_rele(pdd, FTAG); 907 return (SET_ERROR(EEXIST)); 908 } 909 910 error = dsl_fs_ss_limit_check(pdd, 1, ZFS_PROP_FILESYSTEM_LIMIT, NULL, 911 doca->doca_cred); 912 if (error != 0) { 913 dsl_dir_rele(pdd, FTAG); 914 return (SET_ERROR(EDQUOT)); 915 } 916 dsl_dir_rele(pdd, FTAG); 917 918 error = dsl_dataset_hold(dp, doca->doca_origin, FTAG, &origin); 919 if (error != 0) 920 return (error); 921 922 /* You can only clone snapshots, not the head datasets. */ 923 if (!origin->ds_is_snapshot) { 924 dsl_dataset_rele(origin, FTAG); 925 return (SET_ERROR(EINVAL)); 926 } 927 dsl_dataset_rele(origin, FTAG); 928 929 return (0); 930 } 931 932 static void 933 dmu_objset_clone_sync(void *arg, dmu_tx_t *tx) 934 { 935 dmu_objset_clone_arg_t *doca = arg; 936 dsl_pool_t *dp = dmu_tx_pool(tx); 937 dsl_dir_t *pdd; 938 const char *tail; 939 dsl_dataset_t *origin, *ds; 940 uint64_t obj; 941 char namebuf[MAXNAMELEN]; 942 943 VERIFY0(dsl_dir_hold(dp, doca->doca_clone, FTAG, &pdd, &tail)); 944 VERIFY0(dsl_dataset_hold(dp, doca->doca_origin, FTAG, &origin)); 945 946 obj = dsl_dataset_create_sync(pdd, tail, origin, 0, 947 doca->doca_cred, tx); 948 949 VERIFY0(dsl_dataset_hold_obj(pdd->dd_pool, obj, FTAG, &ds)); 950 dsl_dataset_name(origin, namebuf); 951 spa_history_log_internal_ds(ds, "clone", tx, 952 "origin=%s (%llu)", namebuf, origin->ds_object); 953 dsl_dataset_rele(ds, FTAG); 954 dsl_dataset_rele(origin, FTAG); 955 dsl_dir_rele(pdd, FTAG); 956 } 957 958 int 959 dmu_objset_clone(const char *clone, const char *origin) 960 { 961 dmu_objset_clone_arg_t doca; 962 963 doca.doca_clone = clone; 964 doca.doca_origin = origin; 965 doca.doca_cred = CRED(); 966 967 return (dsl_sync_task(clone, 968 dmu_objset_clone_check, dmu_objset_clone_sync, &doca, 969 5, ZFS_SPACE_CHECK_NORMAL)); 970 } 971 972 int 973 dmu_objset_snapshot_one(const char *fsname, const char *snapname) 974 { 975 int err; 976 char *longsnap = kmem_asprintf("%s@%s", fsname, snapname); 977 nvlist_t *snaps = fnvlist_alloc(); 978 979 fnvlist_add_boolean(snaps, longsnap); 980 strfree(longsnap); 981 err = dsl_dataset_snapshot(snaps, NULL, NULL); 982 fnvlist_free(snaps); 983 return (err); 984 } 985 986 static void 987 dmu_objset_sync_dnodes(list_t *list, list_t *newlist, dmu_tx_t *tx) 988 { 989 dnode_t *dn; 990 991 while (dn = list_head(list)) { 992 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT); 993 ASSERT(dn->dn_dbuf->db_data_pending); 994 /* 995 * Initialize dn_zio outside dnode_sync() because the 996 * meta-dnode needs to set it ouside dnode_sync(). 997 */ 998 dn->dn_zio = dn->dn_dbuf->db_data_pending->dr_zio; 999 ASSERT(dn->dn_zio); 1000 1001 ASSERT3U(dn->dn_nlevels, <=, DN_MAX_LEVELS); 1002 list_remove(list, dn); 1003 1004 if (newlist) { 1005 (void) dnode_add_ref(dn, newlist); 1006 list_insert_tail(newlist, dn); 1007 } 1008 1009 dnode_sync(dn, tx); 1010 } 1011 } 1012 1013 /* ARGSUSED */ 1014 static void 1015 dmu_objset_write_ready(zio_t *zio, arc_buf_t *abuf, void *arg) 1016 { 1017 blkptr_t *bp = zio->io_bp; 1018 objset_t *os = arg; 1019 dnode_phys_t *dnp = &os->os_phys->os_meta_dnode; 1020 1021 ASSERT(!BP_IS_EMBEDDED(bp)); 1022 ASSERT3P(bp, ==, os->os_rootbp); 1023 ASSERT3U(BP_GET_TYPE(bp), ==, DMU_OT_OBJSET); 1024 ASSERT0(BP_GET_LEVEL(bp)); 1025 1026 /* 1027 * Update rootbp fill count: it should be the number of objects 1028 * allocated in the object set (not counting the "special" 1029 * objects that are stored in the objset_phys_t -- the meta 1030 * dnode and user/group accounting objects). 1031 */ 1032 bp->blk_fill = 0; 1033 for (int i = 0; i < dnp->dn_nblkptr; i++) 1034 bp->blk_fill += BP_GET_FILL(&dnp->dn_blkptr[i]); 1035 } 1036 1037 /* ARGSUSED */ 1038 static void 1039 dmu_objset_write_done(zio_t *zio, arc_buf_t *abuf, void *arg) 1040 { 1041 blkptr_t *bp = zio->io_bp; 1042 blkptr_t *bp_orig = &zio->io_bp_orig; 1043 objset_t *os = arg; 1044 1045 if (zio->io_flags & ZIO_FLAG_IO_REWRITE) { 1046 ASSERT(BP_EQUAL(bp, bp_orig)); 1047 } else { 1048 dsl_dataset_t *ds = os->os_dsl_dataset; 1049 dmu_tx_t *tx = os->os_synctx; 1050 1051 (void) dsl_dataset_block_kill(ds, bp_orig, tx, B_TRUE); 1052 dsl_dataset_block_born(ds, bp, tx); 1053 } 1054 } 1055 1056 /* called from dsl */ 1057 void 1058 dmu_objset_sync(objset_t *os, zio_t *pio, dmu_tx_t *tx) 1059 { 1060 int txgoff; 1061 zbookmark_phys_t zb; 1062 zio_prop_t zp; 1063 zio_t *zio; 1064 list_t *list; 1065 list_t *newlist = NULL; 1066 dbuf_dirty_record_t *dr; 1067 1068 dprintf_ds(os->os_dsl_dataset, "txg=%llu\n", tx->tx_txg); 1069 1070 ASSERT(dmu_tx_is_syncing(tx)); 1071 /* XXX the write_done callback should really give us the tx... */ 1072 os->os_synctx = tx; 1073 1074 if (os->os_dsl_dataset == NULL) { 1075 /* 1076 * This is the MOS. If we have upgraded, 1077 * spa_max_replication() could change, so reset 1078 * os_copies here. 1079 */ 1080 os->os_copies = spa_max_replication(os->os_spa); 1081 } 1082 1083 /* 1084 * Create the root block IO 1085 */ 1086 SET_BOOKMARK(&zb, os->os_dsl_dataset ? 1087 os->os_dsl_dataset->ds_object : DMU_META_OBJSET, 1088 ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID); 1089 arc_release(os->os_phys_buf, &os->os_phys_buf); 1090 1091 dmu_write_policy(os, NULL, 0, 0, &zp); 1092 1093 zio = arc_write(pio, os->os_spa, tx->tx_txg, 1094 os->os_rootbp, os->os_phys_buf, DMU_OS_IS_L2CACHEABLE(os), 1095 DMU_OS_IS_L2COMPRESSIBLE(os), &zp, dmu_objset_write_ready, 1096 NULL, dmu_objset_write_done, os, ZIO_PRIORITY_ASYNC_WRITE, 1097 ZIO_FLAG_MUSTSUCCEED, &zb); 1098 1099 /* 1100 * Sync special dnodes - the parent IO for the sync is the root block 1101 */ 1102 DMU_META_DNODE(os)->dn_zio = zio; 1103 dnode_sync(DMU_META_DNODE(os), tx); 1104 1105 os->os_phys->os_flags = os->os_flags; 1106 1107 if (DMU_USERUSED_DNODE(os) && 1108 DMU_USERUSED_DNODE(os)->dn_type != DMU_OT_NONE) { 1109 DMU_USERUSED_DNODE(os)->dn_zio = zio; 1110 dnode_sync(DMU_USERUSED_DNODE(os), tx); 1111 DMU_GROUPUSED_DNODE(os)->dn_zio = zio; 1112 dnode_sync(DMU_GROUPUSED_DNODE(os), tx); 1113 } 1114 1115 txgoff = tx->tx_txg & TXG_MASK; 1116 1117 if (dmu_objset_userused_enabled(os)) { 1118 newlist = &os->os_synced_dnodes; 1119 /* 1120 * We must create the list here because it uses the 1121 * dn_dirty_link[] of this txg. 1122 */ 1123 list_create(newlist, sizeof (dnode_t), 1124 offsetof(dnode_t, dn_dirty_link[txgoff])); 1125 } 1126 1127 dmu_objset_sync_dnodes(&os->os_free_dnodes[txgoff], newlist, tx); 1128 dmu_objset_sync_dnodes(&os->os_dirty_dnodes[txgoff], newlist, tx); 1129 1130 list = &DMU_META_DNODE(os)->dn_dirty_records[txgoff]; 1131 while (dr = list_head(list)) { 1132 ASSERT0(dr->dr_dbuf->db_level); 1133 list_remove(list, dr); 1134 if (dr->dr_zio) 1135 zio_nowait(dr->dr_zio); 1136 } 1137 /* 1138 * Free intent log blocks up to this tx. 1139 */ 1140 zil_sync(os->os_zil, tx); 1141 os->os_phys->os_zil_header = os->os_zil_header; 1142 zio_nowait(zio); 1143 } 1144 1145 boolean_t 1146 dmu_objset_is_dirty(objset_t *os, uint64_t txg) 1147 { 1148 return (!list_is_empty(&os->os_dirty_dnodes[txg & TXG_MASK]) || 1149 !list_is_empty(&os->os_free_dnodes[txg & TXG_MASK])); 1150 } 1151 1152 static objset_used_cb_t *used_cbs[DMU_OST_NUMTYPES]; 1153 1154 void 1155 dmu_objset_register_type(dmu_objset_type_t ost, objset_used_cb_t *cb) 1156 { 1157 used_cbs[ost] = cb; 1158 } 1159 1160 boolean_t 1161 dmu_objset_userused_enabled(objset_t *os) 1162 { 1163 return (spa_version(os->os_spa) >= SPA_VERSION_USERSPACE && 1164 used_cbs[os->os_phys->os_type] != NULL && 1165 DMU_USERUSED_DNODE(os) != NULL); 1166 } 1167 1168 static void 1169 do_userquota_update(objset_t *os, uint64_t used, uint64_t flags, 1170 uint64_t user, uint64_t group, boolean_t subtract, dmu_tx_t *tx) 1171 { 1172 if ((flags & DNODE_FLAG_USERUSED_ACCOUNTED)) { 1173 int64_t delta = DNODE_SIZE + used; 1174 if (subtract) 1175 delta = -delta; 1176 VERIFY3U(0, ==, zap_increment_int(os, DMU_USERUSED_OBJECT, 1177 user, delta, tx)); 1178 VERIFY3U(0, ==, zap_increment_int(os, DMU_GROUPUSED_OBJECT, 1179 group, delta, tx)); 1180 } 1181 } 1182 1183 void 1184 dmu_objset_do_userquota_updates(objset_t *os, dmu_tx_t *tx) 1185 { 1186 dnode_t *dn; 1187 list_t *list = &os->os_synced_dnodes; 1188 1189 ASSERT(list_head(list) == NULL || dmu_objset_userused_enabled(os)); 1190 1191 while (dn = list_head(list)) { 1192 int flags; 1193 ASSERT(!DMU_OBJECT_IS_SPECIAL(dn->dn_object)); 1194 ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE || 1195 dn->dn_phys->dn_flags & 1196 DNODE_FLAG_USERUSED_ACCOUNTED); 1197 1198 /* Allocate the user/groupused objects if necessary. */ 1199 if (DMU_USERUSED_DNODE(os)->dn_type == DMU_OT_NONE) { 1200 VERIFY(0 == zap_create_claim(os, 1201 DMU_USERUSED_OBJECT, 1202 DMU_OT_USERGROUP_USED, DMU_OT_NONE, 0, tx)); 1203 VERIFY(0 == zap_create_claim(os, 1204 DMU_GROUPUSED_OBJECT, 1205 DMU_OT_USERGROUP_USED, DMU_OT_NONE, 0, tx)); 1206 } 1207 1208 /* 1209 * We intentionally modify the zap object even if the 1210 * net delta is zero. Otherwise 1211 * the block of the zap obj could be shared between 1212 * datasets but need to be different between them after 1213 * a bprewrite. 1214 */ 1215 1216 flags = dn->dn_id_flags; 1217 ASSERT(flags); 1218 if (flags & DN_ID_OLD_EXIST) { 1219 do_userquota_update(os, dn->dn_oldused, dn->dn_oldflags, 1220 dn->dn_olduid, dn->dn_oldgid, B_TRUE, tx); 1221 } 1222 if (flags & DN_ID_NEW_EXIST) { 1223 do_userquota_update(os, DN_USED_BYTES(dn->dn_phys), 1224 dn->dn_phys->dn_flags, dn->dn_newuid, 1225 dn->dn_newgid, B_FALSE, tx); 1226 } 1227 1228 mutex_enter(&dn->dn_mtx); 1229 dn->dn_oldused = 0; 1230 dn->dn_oldflags = 0; 1231 if (dn->dn_id_flags & DN_ID_NEW_EXIST) { 1232 dn->dn_olduid = dn->dn_newuid; 1233 dn->dn_oldgid = dn->dn_newgid; 1234 dn->dn_id_flags |= DN_ID_OLD_EXIST; 1235 if (dn->dn_bonuslen == 0) 1236 dn->dn_id_flags |= DN_ID_CHKED_SPILL; 1237 else 1238 dn->dn_id_flags |= DN_ID_CHKED_BONUS; 1239 } 1240 dn->dn_id_flags &= ~(DN_ID_NEW_EXIST); 1241 mutex_exit(&dn->dn_mtx); 1242 1243 list_remove(list, dn); 1244 dnode_rele(dn, list); 1245 } 1246 } 1247 1248 /* 1249 * Returns a pointer to data to find uid/gid from 1250 * 1251 * If a dirty record for transaction group that is syncing can't 1252 * be found then NULL is returned. In the NULL case it is assumed 1253 * the uid/gid aren't changing. 1254 */ 1255 static void * 1256 dmu_objset_userquota_find_data(dmu_buf_impl_t *db, dmu_tx_t *tx) 1257 { 1258 dbuf_dirty_record_t *dr, **drp; 1259 void *data; 1260 1261 if (db->db_dirtycnt == 0) 1262 return (db->db.db_data); /* Nothing is changing */ 1263 1264 for (drp = &db->db_last_dirty; (dr = *drp) != NULL; drp = &dr->dr_next) 1265 if (dr->dr_txg == tx->tx_txg) 1266 break; 1267 1268 if (dr == NULL) { 1269 data = NULL; 1270 } else { 1271 dnode_t *dn; 1272 1273 DB_DNODE_ENTER(dr->dr_dbuf); 1274 dn = DB_DNODE(dr->dr_dbuf); 1275 1276 if (dn->dn_bonuslen == 0 && 1277 dr->dr_dbuf->db_blkid == DMU_SPILL_BLKID) 1278 data = dr->dt.dl.dr_data->b_data; 1279 else 1280 data = dr->dt.dl.dr_data; 1281 1282 DB_DNODE_EXIT(dr->dr_dbuf); 1283 } 1284 1285 return (data); 1286 } 1287 1288 void 1289 dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx) 1290 { 1291 objset_t *os = dn->dn_objset; 1292 void *data = NULL; 1293 dmu_buf_impl_t *db = NULL; 1294 uint64_t *user = NULL; 1295 uint64_t *group = NULL; 1296 int flags = dn->dn_id_flags; 1297 int error; 1298 boolean_t have_spill = B_FALSE; 1299 1300 if (!dmu_objset_userused_enabled(dn->dn_objset)) 1301 return; 1302 1303 if (before && (flags & (DN_ID_CHKED_BONUS|DN_ID_OLD_EXIST| 1304 DN_ID_CHKED_SPILL))) 1305 return; 1306 1307 if (before && dn->dn_bonuslen != 0) 1308 data = DN_BONUS(dn->dn_phys); 1309 else if (!before && dn->dn_bonuslen != 0) { 1310 if (dn->dn_bonus) { 1311 db = dn->dn_bonus; 1312 mutex_enter(&db->db_mtx); 1313 data = dmu_objset_userquota_find_data(db, tx); 1314 } else { 1315 data = DN_BONUS(dn->dn_phys); 1316 } 1317 } else if (dn->dn_bonuslen == 0 && dn->dn_bonustype == DMU_OT_SA) { 1318 int rf = 0; 1319 1320 if (RW_WRITE_HELD(&dn->dn_struct_rwlock)) 1321 rf |= DB_RF_HAVESTRUCT; 1322 error = dmu_spill_hold_by_dnode(dn, 1323 rf | DB_RF_MUST_SUCCEED, 1324 FTAG, (dmu_buf_t **)&db); 1325 ASSERT(error == 0); 1326 mutex_enter(&db->db_mtx); 1327 data = (before) ? db->db.db_data : 1328 dmu_objset_userquota_find_data(db, tx); 1329 have_spill = B_TRUE; 1330 } else { 1331 mutex_enter(&dn->dn_mtx); 1332 dn->dn_id_flags |= DN_ID_CHKED_BONUS; 1333 mutex_exit(&dn->dn_mtx); 1334 return; 1335 } 1336 1337 if (before) { 1338 ASSERT(data); 1339 user = &dn->dn_olduid; 1340 group = &dn->dn_oldgid; 1341 } else if (data) { 1342 user = &dn->dn_newuid; 1343 group = &dn->dn_newgid; 1344 } 1345 1346 /* 1347 * Must always call the callback in case the object 1348 * type has changed and that type isn't an object type to track 1349 */ 1350 error = used_cbs[os->os_phys->os_type](dn->dn_bonustype, data, 1351 user, group); 1352 1353 /* 1354 * Preserve existing uid/gid when the callback can't determine 1355 * what the new uid/gid are and the callback returned EEXIST. 1356 * The EEXIST error tells us to just use the existing uid/gid. 1357 * If we don't know what the old values are then just assign 1358 * them to 0, since that is a new file being created. 1359 */ 1360 if (!before && data == NULL && error == EEXIST) { 1361 if (flags & DN_ID_OLD_EXIST) { 1362 dn->dn_newuid = dn->dn_olduid; 1363 dn->dn_newgid = dn->dn_oldgid; 1364 } else { 1365 dn->dn_newuid = 0; 1366 dn->dn_newgid = 0; 1367 } 1368 error = 0; 1369 } 1370 1371 if (db) 1372 mutex_exit(&db->db_mtx); 1373 1374 mutex_enter(&dn->dn_mtx); 1375 if (error == 0 && before) 1376 dn->dn_id_flags |= DN_ID_OLD_EXIST; 1377 if (error == 0 && !before) 1378 dn->dn_id_flags |= DN_ID_NEW_EXIST; 1379 1380 if (have_spill) { 1381 dn->dn_id_flags |= DN_ID_CHKED_SPILL; 1382 } else { 1383 dn->dn_id_flags |= DN_ID_CHKED_BONUS; 1384 } 1385 mutex_exit(&dn->dn_mtx); 1386 if (have_spill) 1387 dmu_buf_rele((dmu_buf_t *)db, FTAG); 1388 } 1389 1390 boolean_t 1391 dmu_objset_userspace_present(objset_t *os) 1392 { 1393 return (os->os_phys->os_flags & 1394 OBJSET_FLAG_USERACCOUNTING_COMPLETE); 1395 } 1396 1397 int 1398 dmu_objset_userspace_upgrade(objset_t *os) 1399 { 1400 uint64_t obj; 1401 int err = 0; 1402 1403 if (dmu_objset_userspace_present(os)) 1404 return (0); 1405 if (!dmu_objset_userused_enabled(os)) 1406 return (SET_ERROR(ENOTSUP)); 1407 if (dmu_objset_is_snapshot(os)) 1408 return (SET_ERROR(EINVAL)); 1409 1410 /* 1411 * We simply need to mark every object dirty, so that it will be 1412 * synced out and now accounted. If this is called 1413 * concurrently, or if we already did some work before crashing, 1414 * that's fine, since we track each object's accounted state 1415 * independently. 1416 */ 1417 1418 for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE, 0)) { 1419 dmu_tx_t *tx; 1420 dmu_buf_t *db; 1421 int objerr; 1422 1423 if (issig(JUSTLOOKING) && issig(FORREAL)) 1424 return (SET_ERROR(EINTR)); 1425 1426 objerr = dmu_bonus_hold(os, obj, FTAG, &db); 1427 if (objerr != 0) 1428 continue; 1429 tx = dmu_tx_create(os); 1430 dmu_tx_hold_bonus(tx, obj); 1431 objerr = dmu_tx_assign(tx, TXG_WAIT); 1432 if (objerr != 0) { 1433 dmu_tx_abort(tx); 1434 continue; 1435 } 1436 dmu_buf_will_dirty(db, tx); 1437 dmu_buf_rele(db, FTAG); 1438 dmu_tx_commit(tx); 1439 } 1440 1441 os->os_flags |= OBJSET_FLAG_USERACCOUNTING_COMPLETE; 1442 txg_wait_synced(dmu_objset_pool(os), 0); 1443 return (0); 1444 } 1445 1446 void 1447 dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp, 1448 uint64_t *usedobjsp, uint64_t *availobjsp) 1449 { 1450 dsl_dataset_space(os->os_dsl_dataset, refdbytesp, availbytesp, 1451 usedobjsp, availobjsp); 1452 } 1453 1454 uint64_t 1455 dmu_objset_fsid_guid(objset_t *os) 1456 { 1457 return (dsl_dataset_fsid_guid(os->os_dsl_dataset)); 1458 } 1459 1460 void 1461 dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat) 1462 { 1463 stat->dds_type = os->os_phys->os_type; 1464 if (os->os_dsl_dataset) 1465 dsl_dataset_fast_stat(os->os_dsl_dataset, stat); 1466 } 1467 1468 void 1469 dmu_objset_stats(objset_t *os, nvlist_t *nv) 1470 { 1471 ASSERT(os->os_dsl_dataset || 1472 os->os_phys->os_type == DMU_OST_META); 1473 1474 if (os->os_dsl_dataset != NULL) 1475 dsl_dataset_stats(os->os_dsl_dataset, nv); 1476 1477 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_TYPE, 1478 os->os_phys->os_type); 1479 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USERACCOUNTING, 1480 dmu_objset_userspace_present(os)); 1481 } 1482 1483 int 1484 dmu_objset_is_snapshot(objset_t *os) 1485 { 1486 if (os->os_dsl_dataset != NULL) 1487 return (os->os_dsl_dataset->ds_is_snapshot); 1488 else 1489 return (B_FALSE); 1490 } 1491 1492 int 1493 dmu_snapshot_realname(objset_t *os, char *name, char *real, int maxlen, 1494 boolean_t *conflict) 1495 { 1496 dsl_dataset_t *ds = os->os_dsl_dataset; 1497 uint64_t ignored; 1498 1499 if (dsl_dataset_phys(ds)->ds_snapnames_zapobj == 0) 1500 return (SET_ERROR(ENOENT)); 1501 1502 return (zap_lookup_norm(ds->ds_dir->dd_pool->dp_meta_objset, 1503 dsl_dataset_phys(ds)->ds_snapnames_zapobj, name, 8, 1, &ignored, 1504 MT_FIRST, real, maxlen, conflict)); 1505 } 1506 1507 int 1508 dmu_snapshot_list_next(objset_t *os, int namelen, char *name, 1509 uint64_t *idp, uint64_t *offp, boolean_t *case_conflict) 1510 { 1511 dsl_dataset_t *ds = os->os_dsl_dataset; 1512 zap_cursor_t cursor; 1513 zap_attribute_t attr; 1514 1515 ASSERT(dsl_pool_config_held(dmu_objset_pool(os))); 1516 1517 if (dsl_dataset_phys(ds)->ds_snapnames_zapobj == 0) 1518 return (SET_ERROR(ENOENT)); 1519 1520 zap_cursor_init_serialized(&cursor, 1521 ds->ds_dir->dd_pool->dp_meta_objset, 1522 dsl_dataset_phys(ds)->ds_snapnames_zapobj, *offp); 1523 1524 if (zap_cursor_retrieve(&cursor, &attr) != 0) { 1525 zap_cursor_fini(&cursor); 1526 return (SET_ERROR(ENOENT)); 1527 } 1528 1529 if (strlen(attr.za_name) + 1 > namelen) { 1530 zap_cursor_fini(&cursor); 1531 return (SET_ERROR(ENAMETOOLONG)); 1532 } 1533 1534 (void) strcpy(name, attr.za_name); 1535 if (idp) 1536 *idp = attr.za_first_integer; 1537 if (case_conflict) 1538 *case_conflict = attr.za_normalization_conflict; 1539 zap_cursor_advance(&cursor); 1540 *offp = zap_cursor_serialize(&cursor); 1541 zap_cursor_fini(&cursor); 1542 1543 return (0); 1544 } 1545 1546 int 1547 dmu_dir_list_next(objset_t *os, int namelen, char *name, 1548 uint64_t *idp, uint64_t *offp) 1549 { 1550 dsl_dir_t *dd = os->os_dsl_dataset->ds_dir; 1551 zap_cursor_t cursor; 1552 zap_attribute_t attr; 1553 1554 /* there is no next dir on a snapshot! */ 1555 if (os->os_dsl_dataset->ds_object != 1556 dsl_dir_phys(dd)->dd_head_dataset_obj) 1557 return (SET_ERROR(ENOENT)); 1558 1559 zap_cursor_init_serialized(&cursor, 1560 dd->dd_pool->dp_meta_objset, 1561 dsl_dir_phys(dd)->dd_child_dir_zapobj, *offp); 1562 1563 if (zap_cursor_retrieve(&cursor, &attr) != 0) { 1564 zap_cursor_fini(&cursor); 1565 return (SET_ERROR(ENOENT)); 1566 } 1567 1568 if (strlen(attr.za_name) + 1 > namelen) { 1569 zap_cursor_fini(&cursor); 1570 return (SET_ERROR(ENAMETOOLONG)); 1571 } 1572 1573 (void) strcpy(name, attr.za_name); 1574 if (idp) 1575 *idp = attr.za_first_integer; 1576 zap_cursor_advance(&cursor); 1577 *offp = zap_cursor_serialize(&cursor); 1578 zap_cursor_fini(&cursor); 1579 1580 return (0); 1581 } 1582 1583 /* 1584 * Find objsets under and including ddobj, call func(ds) on each. 1585 */ 1586 int 1587 dmu_objset_find_dp(dsl_pool_t *dp, uint64_t ddobj, 1588 int func(dsl_pool_t *, dsl_dataset_t *, void *), void *arg, int flags) 1589 { 1590 dsl_dir_t *dd; 1591 dsl_dataset_t *ds; 1592 zap_cursor_t zc; 1593 zap_attribute_t *attr; 1594 uint64_t thisobj; 1595 int err; 1596 1597 ASSERT(dsl_pool_config_held(dp)); 1598 1599 err = dsl_dir_hold_obj(dp, ddobj, NULL, FTAG, &dd); 1600 if (err != 0) 1601 return (err); 1602 1603 /* Don't visit hidden ($MOS & $ORIGIN) objsets. */ 1604 if (dd->dd_myname[0] == '$') { 1605 dsl_dir_rele(dd, FTAG); 1606 return (0); 1607 } 1608 1609 thisobj = dsl_dir_phys(dd)->dd_head_dataset_obj; 1610 attr = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP); 1611 1612 /* 1613 * Iterate over all children. 1614 */ 1615 if (flags & DS_FIND_CHILDREN) { 1616 for (zap_cursor_init(&zc, dp->dp_meta_objset, 1617 dsl_dir_phys(dd)->dd_child_dir_zapobj); 1618 zap_cursor_retrieve(&zc, attr) == 0; 1619 (void) zap_cursor_advance(&zc)) { 1620 ASSERT3U(attr->za_integer_length, ==, 1621 sizeof (uint64_t)); 1622 ASSERT3U(attr->za_num_integers, ==, 1); 1623 1624 err = dmu_objset_find_dp(dp, attr->za_first_integer, 1625 func, arg, flags); 1626 if (err != 0) 1627 break; 1628 } 1629 zap_cursor_fini(&zc); 1630 1631 if (err != 0) { 1632 dsl_dir_rele(dd, FTAG); 1633 kmem_free(attr, sizeof (zap_attribute_t)); 1634 return (err); 1635 } 1636 } 1637 1638 /* 1639 * Iterate over all snapshots. 1640 */ 1641 if (flags & DS_FIND_SNAPSHOTS) { 1642 dsl_dataset_t *ds; 1643 err = dsl_dataset_hold_obj(dp, thisobj, FTAG, &ds); 1644 1645 if (err == 0) { 1646 uint64_t snapobj; 1647 1648 snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; 1649 dsl_dataset_rele(ds, FTAG); 1650 1651 for (zap_cursor_init(&zc, dp->dp_meta_objset, snapobj); 1652 zap_cursor_retrieve(&zc, attr) == 0; 1653 (void) zap_cursor_advance(&zc)) { 1654 ASSERT3U(attr->za_integer_length, ==, 1655 sizeof (uint64_t)); 1656 ASSERT3U(attr->za_num_integers, ==, 1); 1657 1658 err = dsl_dataset_hold_obj(dp, 1659 attr->za_first_integer, FTAG, &ds); 1660 if (err != 0) 1661 break; 1662 err = func(dp, ds, arg); 1663 dsl_dataset_rele(ds, FTAG); 1664 if (err != 0) 1665 break; 1666 } 1667 zap_cursor_fini(&zc); 1668 } 1669 } 1670 1671 dsl_dir_rele(dd, FTAG); 1672 kmem_free(attr, sizeof (zap_attribute_t)); 1673 1674 if (err != 0) 1675 return (err); 1676 1677 /* 1678 * Apply to self. 1679 */ 1680 err = dsl_dataset_hold_obj(dp, thisobj, FTAG, &ds); 1681 if (err != 0) 1682 return (err); 1683 err = func(dp, ds, arg); 1684 dsl_dataset_rele(ds, FTAG); 1685 return (err); 1686 } 1687 1688 /* 1689 * Find all objsets under name, and for each, call 'func(child_name, arg)'. 1690 * The dp_config_rwlock must not be held when this is called, and it 1691 * will not be held when the callback is called. 1692 * Therefore this function should only be used when the pool is not changing 1693 * (e.g. in syncing context), or the callback can deal with the possible races. 1694 */ 1695 static int 1696 dmu_objset_find_impl(spa_t *spa, const char *name, 1697 int func(const char *, void *), void *arg, int flags) 1698 { 1699 dsl_dir_t *dd; 1700 dsl_pool_t *dp = spa_get_dsl(spa); 1701 dsl_dataset_t *ds; 1702 zap_cursor_t zc; 1703 zap_attribute_t *attr; 1704 char *child; 1705 uint64_t thisobj; 1706 int err; 1707 1708 dsl_pool_config_enter(dp, FTAG); 1709 1710 err = dsl_dir_hold(dp, name, FTAG, &dd, NULL); 1711 if (err != 0) { 1712 dsl_pool_config_exit(dp, FTAG); 1713 return (err); 1714 } 1715 1716 /* Don't visit hidden ($MOS & $ORIGIN) objsets. */ 1717 if (dd->dd_myname[0] == '$') { 1718 dsl_dir_rele(dd, FTAG); 1719 dsl_pool_config_exit(dp, FTAG); 1720 return (0); 1721 } 1722 1723 thisobj = dsl_dir_phys(dd)->dd_head_dataset_obj; 1724 attr = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP); 1725 1726 /* 1727 * Iterate over all children. 1728 */ 1729 if (flags & DS_FIND_CHILDREN) { 1730 for (zap_cursor_init(&zc, dp->dp_meta_objset, 1731 dsl_dir_phys(dd)->dd_child_dir_zapobj); 1732 zap_cursor_retrieve(&zc, attr) == 0; 1733 (void) zap_cursor_advance(&zc)) { 1734 ASSERT3U(attr->za_integer_length, ==, 1735 sizeof (uint64_t)); 1736 ASSERT3U(attr->za_num_integers, ==, 1); 1737 1738 child = kmem_asprintf("%s/%s", name, attr->za_name); 1739 dsl_pool_config_exit(dp, FTAG); 1740 err = dmu_objset_find_impl(spa, child, 1741 func, arg, flags); 1742 dsl_pool_config_enter(dp, FTAG); 1743 strfree(child); 1744 if (err != 0) 1745 break; 1746 } 1747 zap_cursor_fini(&zc); 1748 1749 if (err != 0) { 1750 dsl_dir_rele(dd, FTAG); 1751 dsl_pool_config_exit(dp, FTAG); 1752 kmem_free(attr, sizeof (zap_attribute_t)); 1753 return (err); 1754 } 1755 } 1756 1757 /* 1758 * Iterate over all snapshots. 1759 */ 1760 if (flags & DS_FIND_SNAPSHOTS) { 1761 err = dsl_dataset_hold_obj(dp, thisobj, FTAG, &ds); 1762 1763 if (err == 0) { 1764 uint64_t snapobj; 1765 1766 snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; 1767 dsl_dataset_rele(ds, FTAG); 1768 1769 for (zap_cursor_init(&zc, dp->dp_meta_objset, snapobj); 1770 zap_cursor_retrieve(&zc, attr) == 0; 1771 (void) zap_cursor_advance(&zc)) { 1772 ASSERT3U(attr->za_integer_length, ==, 1773 sizeof (uint64_t)); 1774 ASSERT3U(attr->za_num_integers, ==, 1); 1775 1776 child = kmem_asprintf("%s@%s", 1777 name, attr->za_name); 1778 dsl_pool_config_exit(dp, FTAG); 1779 err = func(child, arg); 1780 dsl_pool_config_enter(dp, FTAG); 1781 strfree(child); 1782 if (err != 0) 1783 break; 1784 } 1785 zap_cursor_fini(&zc); 1786 } 1787 } 1788 1789 dsl_dir_rele(dd, FTAG); 1790 kmem_free(attr, sizeof (zap_attribute_t)); 1791 dsl_pool_config_exit(dp, FTAG); 1792 1793 if (err != 0) 1794 return (err); 1795 1796 /* Apply to self. */ 1797 return (func(name, arg)); 1798 } 1799 1800 /* 1801 * See comment above dmu_objset_find_impl(). 1802 */ 1803 int 1804 dmu_objset_find(char *name, int func(const char *, void *), void *arg, 1805 int flags) 1806 { 1807 spa_t *spa; 1808 int error; 1809 1810 error = spa_open(name, &spa, FTAG); 1811 if (error != 0) 1812 return (error); 1813 error = dmu_objset_find_impl(spa, name, func, arg, flags); 1814 spa_close(spa, FTAG); 1815 return (error); 1816 } 1817 1818 void 1819 dmu_objset_set_user(objset_t *os, void *user_ptr) 1820 { 1821 ASSERT(MUTEX_HELD(&os->os_user_ptr_lock)); 1822 os->os_user_ptr = user_ptr; 1823 } 1824 1825 void * 1826 dmu_objset_get_user(objset_t *os) 1827 { 1828 ASSERT(MUTEX_HELD(&os->os_user_ptr_lock)); 1829 return (os->os_user_ptr); 1830 } 1831 1832 /* 1833 * Determine name of filesystem, given name of snapshot. 1834 * buf must be at least MAXNAMELEN bytes 1835 */ 1836 int 1837 dmu_fsname(const char *snapname, char *buf) 1838 { 1839 char *atp = strchr(snapname, '@'); 1840 if (atp == NULL) 1841 return (SET_ERROR(EINVAL)); 1842 if (atp - snapname >= MAXNAMELEN) 1843 return (SET_ERROR(ENAMETOOLONG)); 1844 (void) strlcpy(buf, snapname, atp - snapname + 1); 1845 return (0); 1846 }