22
22
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
23
* Copyright (c) 2012, 2016 by Delphix. All rights reserved.
26
26
#include <sys/zfs_context.h>
229
230
if (bp->blk_birth == 0) {
231
* Since this block has a birth time of 0 it must be a
232
* hole created before the SPA_FEATURE_HOLE_BIRTH
233
* feature was enabled. If SPA_FEATURE_HOLE_BIRTH
234
* was enabled before the min_txg for this traveral we
235
* know the hole must have been created before the
236
* min_txg for this traveral, so we can skip it. If
237
* SPA_FEATURE_HOLE_BIRTH was enabled after the min_txg
238
* for this traveral we cannot tell if the hole was
239
* created before or after the min_txg for this
240
* traversal, so we cannot skip it.
232
* Since this block has a birth time of 0 it must be one of
233
* two things: a hole created before the
234
* SPA_FEATURE_HOLE_BIRTH feature was enabled, or a hole
235
* which has always been a hole in an object.
237
* If a file is written sparsely, then the unwritten parts of
238
* the file were "always holes" -- that is, they have been
239
* holes since this object was allocated. However, we (and
240
* our callers) can not necessarily tell when an object was
241
* allocated. Therefore, if it's possible that this object
242
* was freed and then its object number reused, we need to
243
* visit all the holes with birth==0.
245
* If it isn't possible that the object number was reused,
246
* then if SPA_FEATURE_HOLE_BIRTH was enabled before we wrote
247
* all the blocks we will visit as part of this traversal,
248
* then this hole must have always existed, so we can skip
249
* it. We visit blocks born after (exclusive) td_min_txg.
251
* Note that the meta-dnode cannot be reallocated.
242
if (td->td_hole_birth_enabled_txg < td->td_min_txg)
253
if ((!td->td_realloc_possible ||
254
zb->zb_object == DMU_META_DNODE_OBJECT) &&
255
td->td_hole_birth_enabled_txg <= td->td_min_txg)
244
257
} else if (bp->blk_birth <= td->td_min_txg) {
348
361
prefetch_dnode_metadata(td, mdnp, zb->zb_objset,
349
362
DMU_META_DNODE_OBJECT);
364
* See the block comment above for the goal of this variable.
365
* If the maxblkid of the meta-dnode is 0, then we know that
366
* we've never had more than DNODES_PER_BLOCK objects in the
367
* dataset, which means we can't have reused any object ids.
369
if (osp->os_meta_dnode.dn_maxblkid == 0)
370
td->td_realloc_possible = B_FALSE;
350
372
if (arc_buf_size(buf) >= sizeof (objset_phys_t)) {
351
373
prefetch_dnode_metadata(td, gdnp, zb->zb_objset,
352
374
DMU_GROUPUSED_OBJECT);
531
553
td->td_flags = flags;
532
554
td->td_paused = B_FALSE;
555
td->td_realloc_possible = (txg_start == 0 ? B_FALSE : B_TRUE);
534
557
if (spa_feature_is_active(spa, SPA_FEATURE_HOLE_BIRTH)) {
535
558
VERIFY(spa_feature_enabled_txg(spa,
536
559
SPA_FEATURE_HOLE_BIRTH, &td->td_hole_birth_enabled_txg));
538
td->td_hole_birth_enabled_txg = 0;
561
td->td_hole_birth_enabled_txg = UINT64_MAX;
541
564
pd->pd_flags = flags;