diff options
author | Brian Behlendorf <[email protected]> | 2018-10-09 15:42:42 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-10-12 11:24:04 -0700 |
commit | 27f80e85c2649573af3c3d915baf6d4195538583 (patch) | |
tree | c95cbc3d0bb78e97ab9071ccb4e7355d81f5315f /include | |
parent | d6c745830f2529643f1967e1f8a5d0abacba4585 (diff) |
Improved error handling for extreme rewinds
The vdev_checkpoint_sm_object(), vdev_obsolete_sm_object(), and
vdev_obsolete_counts_are_precise() functions assume that the
only way a zap_lookup() can fail is if the requested entry is
missing. While this is the most common cause, it's not the only
cause. Attemping to access a damaged ZAP will result in other
errors.
The most likely scenario for accessing a damaged ZAP is during
an extreme rewind pool import. Under these conditions the pool
is expected to contain damaged objects and the import code was
updated to handle this gracefully. Getting an ECKSUM error from
these ZAPs after the pool in import a far less likely, therefore
the behavior for call paths was not modified.
Reviewed-by: Tim Chase <[email protected]>
Reviewed-by: Matthew Ahrens <[email protected]>
Reviewed-by: Serapheim Dimitropoulos <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #7809
Closes #7921
Diffstat (limited to 'include')
-rw-r--r-- | include/sys/vdev_impl.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/include/sys/vdev_impl.h b/include/sys/vdev_impl.h index e055161e8..c5b0c0cd8 100644 --- a/include/sys/vdev_impl.h +++ b/include/sys/vdev_impl.h @@ -493,13 +493,13 @@ extern int zfs_vdev_cache_size; extern void vdev_indirect_sync_obsolete(vdev_t *vd, dmu_tx_t *tx); extern boolean_t vdev_indirect_should_condense(vdev_t *vd); extern void spa_condense_indirect_start_sync(vdev_t *vd, dmu_tx_t *tx); -extern int vdev_obsolete_sm_object(vdev_t *vd); -extern boolean_t vdev_obsolete_counts_are_precise(vdev_t *vd); +extern int vdev_obsolete_sm_object(vdev_t *vd, uint64_t *sm_obj); +extern int vdev_obsolete_counts_are_precise(vdev_t *vd, boolean_t *are_precise); /* * Other miscellaneous functions */ -int vdev_checkpoint_sm_object(vdev_t *vd); +int vdev_checkpoint_sm_object(vdev_t *vd, uint64_t *sm_obj); #ifdef __cplusplus } |