Print this page
NEX-9752 backport illumos 6950 ARC should cache compressed data
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
6950 ARC should cache compressed data
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Don Brady <don.brady@intel.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
NEX-7603 Back port OpenZFS #188 Create tunable to ignore hole_birth
feature
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Dan Fields <dan.fields@nexenta.com>
2605 want to resume interrupted zfs send
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Xin Li <delphij@freebsd.org>
Reviewed by: Arne Jansen <sensille@gmx.net>
Approved by: Dan McDonald <danmcd@omniti.com>
NEX-4582 update wrc test cases for allow to use write back cache per tree of datasets
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
5960 zfs recv should prefetch indirect blocks
5925 zfs receive -o origin=
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
NEX-4207 WRC and dedup on the same pool cause system-panic
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-4193 WRC does not migrate data that belong to intermediate snapshots
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-3710 WRC improvements and bug-fixes
 * refactored WRC move-logic to use zio kmem_cashes
 * replace size and compression fields by blk_prop field
   (the same in blkptr_t) to little reduce size of wrc_block_t
   and use similar macros as for blkptr_t to get PSIZE, LSIZE
   and COMPRESSION
 * make CPU more happy by reduce atomic calls
 * removed unused code
 * fixed naming of variables
 * fixed possible system panic after restart system
   with enabled WRC
 * fixed a race that causes system panic
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-3558 KRRP Integration
4459 Typo in itadm(1m) usage message: delete-inititator
Reviewed by: Milan Jurik <milan.jurik@xylab.cz>
Reviewed by: Marcel Telka <marcel@telka.sk>
Approved by: Robert Mustacchi <rm@joyent.com>
4504 traverse_visitbp: visit DMU_GROUPUSED_OBJECT before DMU_USERUSED_OBJECT
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Andriy Gapon <andriy.gapon@hybridcluster.com>
Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com>
Approved by: Robert Mustacchi <rm@joyent.com>
4391 panic system rather than corrupting pool if we hit bug 4390
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Approved by: Gordon Ross <gwr@nexenta.com>
4370 avoid transmitting holes during zfs send
4371 DMU code clean up
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Approved by: Garrett D'Amore <garrett@damore.org>
re #12619 rb4429 More dp->dp_config_rwlock holds
re #12585 rb4049 ZFS++ work port - refactoring to improve separation of open/closed code, bug fixes, performance improvements - open code
Bug 11205: add missing libzfs_closed_stubs.c to fix opensource-only build.
ZFS plus work: special vdevs, cos, cos/vdev properties

*** 18,27 **** --- 18,28 ---- * * CDDL HEADER END */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012, 2016 by Delphix. All rights reserved. */ #include <sys/zfs_context.h> #include <sys/dmu_objset.h>
*** 54,63 **** --- 55,65 ---- typedef struct traverse_data { spa_t *td_spa; uint64_t td_objset; blkptr_t *td_rootbp; uint64_t td_min_txg; + uint64_t td_max_txg; zbookmark_phys_t *td_resume; int td_flags; prefetch_data_t *td_pfd; boolean_t td_paused; uint64_t td_hole_birth_enabled_txg;
*** 189,199 **** * some children will not be needed (and in fact may have already * been freed). */ if (td->td_resume != NULL && !ZB_IS_ZERO(td->td_resume)) return; ! if (BP_IS_HOLE(bp) || bp->blk_birth <= td->td_min_txg) return; if (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_DNODE) return; (void) arc_read(NULL, td->td_spa, bp, NULL, NULL, --- 191,202 ---- * some children will not be needed (and in fact may have already * been freed). */ if (td->td_resume != NULL && !ZB_IS_ZERO(td->td_resume)) return; ! if (BP_IS_HOLE(bp) || bp->blk_birth <= td->td_min_txg || ! bp->blk_birth >= td->td_max_txg) return; if (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_DNODE) return; (void) arc_read(NULL, td->td_spa, bp, NULL, NULL,
*** 255,267 **** * Note that the meta-dnode cannot be reallocated. */ if (!send_holes_without_birth_time && (!td->td_realloc_possible || zb->zb_object == DMU_META_DNODE_OBJECT) && ! td->td_hole_birth_enabled_txg <= td->td_min_txg) return (0); ! } else if (bp->blk_birth <= td->td_min_txg) { return (0); } if (pd != NULL && !pd->pd_exited && prefetch_needed(pd, bp)) { uint64_t size = BP_GET_LSIZE(bp); --- 258,272 ---- * Note that the meta-dnode cannot be reallocated. */ if (!send_holes_without_birth_time && (!td->td_realloc_possible || zb->zb_object == DMU_META_DNODE_OBJECT) && ! (td->td_hole_birth_enabled_txg <= td->td_min_txg || ! td->td_hole_birth_enabled_txg > td->td_max_txg)) return (0); ! } else if (bp->blk_birth <= td->td_min_txg || ! bp->blk_birth >= td->td_max_txg) { return (0); } if (pd != NULL && !pd->pd_exited && prefetch_needed(pd, bp)) { uint64_t size = BP_GET_LSIZE(bp);
*** 284,293 **** --- 289,301 ---- if (td->td_flags & TRAVERSE_PRE) { err = td->td_func(td->td_spa, NULL, bp, zb, dnp, td->td_arg); if (err == TRAVERSE_VISIT_NO_CHILDREN) return (0); + /* handle pausing at a common point */ + if (err == ERESTART) + td->td_paused = B_TRUE; if (err != 0) goto post; } if (BP_GET_LEVEL(bp) > 0) {
*** 418,427 **** --- 426,441 ---- (dnp->dn_indblkshift - SPA_BLKPTRSHIFT); } td->td_paused = B_TRUE; } + /* if we walked over all bp bookmark must be cleared */ + if (!err && !td->td_paused && td->td_resume != NULL && + bp == td->td_rootbp && td->td_pfd != NULL) { + bzero(td->td_resume, sizeof (*td->td_resume)); + } + return (err); } static void prefetch_dnode_metadata(traverse_data_t *td, const dnode_phys_t *dnp,
*** 544,555 **** * NB: dataset must not be changing on-disk (eg, is a snapshot or we are * in syncing context). */ static int traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp, ! uint64_t txg_start, zbookmark_phys_t *resume, int flags, ! blkptr_cb_t func, void *arg) { traverse_data_t td; prefetch_data_t pd = { 0 }; zbookmark_phys_t czb; int err; --- 558,569 ---- * NB: dataset must not be changing on-disk (eg, is a snapshot or we are * in syncing context). */ static int traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp, ! uint64_t txg_start, uint64_t txg_finish, zbookmark_phys_t *resume, ! int flags, blkptr_cb_t func, void *arg) { traverse_data_t td; prefetch_data_t pd = { 0 }; zbookmark_phys_t czb; int err;
*** 559,568 **** --- 573,583 ---- td.td_spa = spa; td.td_objset = objset; td.td_rootbp = rootbp; td.td_min_txg = txg_start; + td.td_max_txg = txg_finish; td.td_resume = resume; td.td_func = func; td.td_arg = arg; td.td_pfd = &pd; td.td_flags = flags;
*** 629,639 **** traverse_dataset_resume(dsl_dataset_t *ds, uint64_t txg_start, zbookmark_phys_t *resume, int flags, blkptr_cb_t func, void *arg) { return (traverse_impl(ds->ds_dir->dd_pool->dp_spa, ds, ds->ds_object, ! &dsl_dataset_phys(ds)->ds_bp, txg_start, resume, flags, func, arg)); } int traverse_dataset(dsl_dataset_t *ds, uint64_t txg_start, int flags, blkptr_cb_t func, void *arg) --- 644,655 ---- traverse_dataset_resume(dsl_dataset_t *ds, uint64_t txg_start, zbookmark_phys_t *resume, int flags, blkptr_cb_t func, void *arg) { return (traverse_impl(ds->ds_dir->dd_pool->dp_spa, ds, ds->ds_object, ! &dsl_dataset_phys(ds)->ds_bp, txg_start, UINT64_MAX, resume, flags, ! func, arg)); } int traverse_dataset(dsl_dataset_t *ds, uint64_t txg_start, int flags, blkptr_cb_t func, void *arg)
*** 645,677 **** traverse_dataset_destroyed(spa_t *spa, blkptr_t *blkptr, uint64_t txg_start, zbookmark_phys_t *resume, int flags, blkptr_cb_t func, void *arg) { return (traverse_impl(spa, NULL, ZB_DESTROYED_OBJSET, ! blkptr, txg_start, resume, flags, func, arg)); } /* * NB: pool must not be changing on-disk (eg, from zdb or sync context). */ int ! traverse_pool(spa_t *spa, uint64_t txg_start, int flags, ! blkptr_cb_t func, void *arg) { ! int err; dsl_pool_t *dp = spa_get_dsl(spa); objset_t *mos = dp->dp_meta_objset; boolean_t hard = (flags & TRAVERSE_HARD); /* visit the MOS */ err = traverse_impl(spa, NULL, 0, spa_get_rootblkptr(spa), ! txg_start, NULL, flags, func, arg); if (err != 0) return (err); /* visit each dataset */ ! for (uint64_t obj = 1; err == 0; err = dmu_object_next(mos, &obj, B_FALSE, txg_start)) { dmu_object_info_t doi; err = dmu_object_info(mos, obj, &doi); if (err != 0) { --- 661,696 ---- traverse_dataset_destroyed(spa_t *spa, blkptr_t *blkptr, uint64_t txg_start, zbookmark_phys_t *resume, int flags, blkptr_cb_t func, void *arg) { return (traverse_impl(spa, NULL, ZB_DESTROYED_OBJSET, ! blkptr, txg_start, UINT64_MAX, resume, flags, func, arg)); } /* * NB: pool must not be changing on-disk (eg, from zdb or sync context). */ int ! traverse_pool(spa_t *spa, uint64_t txg_start, uint64_t txg_finish, int flags, ! blkptr_cb_t func, void *arg, zbookmark_phys_t *zb) { ! int err = 0, lasterr = 0; dsl_pool_t *dp = spa_get_dsl(spa); objset_t *mos = dp->dp_meta_objset; boolean_t hard = (flags & TRAVERSE_HARD); /* visit the MOS */ + if (!zb || (zb->zb_objset == 0 && zb->zb_object == 0)) { err = traverse_impl(spa, NULL, 0, spa_get_rootblkptr(spa), ! txg_start, txg_finish, NULL, flags, func, arg); if (err != 0) return (err); + } /* visit each dataset */ ! for (uint64_t obj = (zb && !ZB_IS_ZERO(zb))? zb->zb_objset : 1; ! err == 0 || (err != ESRCH && hard); err = dmu_object_next(mos, &obj, B_FALSE, txg_start)) { dmu_object_info_t doi; err = dmu_object_info(mos, obj, &doi); if (err != 0) {
*** 680,706 **** break; } if (doi.doi_bonus_type == DMU_OT_DSL_DATASET) { dsl_dataset_t *ds; uint64_t txg = txg_start; dsl_pool_config_enter(dp, FTAG); err = dsl_dataset_hold_obj(dp, obj, FTAG, &ds); dsl_pool_config_exit(dp, FTAG); if (err != 0) { if (hard) continue; break; } ! if (dsl_dataset_phys(ds)->ds_prev_snap_txg > txg) txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; ! err = traverse_dataset(ds, txg, flags, func, arg); dsl_dataset_rele(ds, FTAG); ! if (err != 0) break; } } ! if (err == ESRCH) err = 0; ! return (err); } --- 699,771 ---- break; } if (doi.doi_bonus_type == DMU_OT_DSL_DATASET) { dsl_dataset_t *ds; + objset_t *os; + boolean_t os_is_snapshot = B_FALSE; uint64_t txg = txg_start; + uint64_t ctxg; + uint64_t max_txg = txg_finish; dsl_pool_config_enter(dp, FTAG); err = dsl_dataset_hold_obj(dp, obj, FTAG, &ds); dsl_pool_config_exit(dp, FTAG); if (err != 0) { if (hard) continue; break; } ! ! dsl_pool_config_enter(dp, FTAG); ! err = dmu_objset_from_ds(ds, &os); ! if (err == 0) ! os_is_snapshot = dmu_objset_is_snapshot(os); ! ! dsl_pool_config_exit(dp, FTAG); ! if (err != 0) { ! dsl_dataset_rele(ds, FTAG); ! if (hard) ! continue; ! break; ! } ! ctxg = dsl_dataset_phys(ds)->ds_creation_txg; ! ! /* uplimited traverse walks over shapshots only */ ! if (max_txg != UINT64_MAX && !os_is_snapshot) { ! dsl_dataset_rele(ds, FTAG); ! continue; ! } ! if (max_txg != UINT64_MAX && ctxg >= max_txg) { ! dsl_dataset_rele(ds, FTAG); ! continue; ! } ! if (os_is_snapshot && ctxg <= txg_start) { ! dsl_dataset_rele(ds, FTAG); ! continue; ! } ! if (max_txg == UINT64_MAX && ! dsl_dataset_phys(ds)->ds_prev_snap_txg > txg) txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; ! if (txg > max_txg) ! max_txg = txg; ! err = traverse_impl(spa, ds, ds->ds_object, ! &dsl_dataset_phys(ds)->ds_bp, ! txg, max_txg, zb, flags, func, arg); dsl_dataset_rele(ds, FTAG); ! if (err != 0) { ! if (!hard) ! return (err); ! lasterr = err; ! } ! if (zb && !ZB_IS_ZERO(zb)) break; } } ! if (err == ESRCH) { ! /* zero bookmark means we are done */ ! if (zb) ! bzero(zb, sizeof (*zb)); err = 0; ! } ! return (err != 0 ? err : lasterr); }