summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2018-08-31 14:20:34 -0700
committerGitHub <[email protected]>2018-08-31 14:20:34 -0700
commite927fc8a522e1c0db89955cc555841aa23bbd634 (patch)
tree51fc7bcdfc299c755ceedf5a85cfe2acae3ed1ee
parentadb726eb0ed69e7331ddd308da8fec9316f6426d (diff)
Allow ECKSUM in vdev_checkpoint_sm_object()
The checkpoint space map object may not be accessible from the vdev's ZAP when it has been damaged. This may be the case when performing an extreme rewind when importing the pool. Reviewed-by: Serapheim Dimitropoulos <[email protected]> Reviewed by: Tim Chase <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #7809 Closes #7853
-rw-r--r--module/zfs/vdev.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
index 543a49c7a..f5c259bd4 100644
--- a/module/zfs/vdev.c
+++ b/module/zfs/vdev.c
@@ -2759,8 +2759,8 @@ vdev_resilver_needed(vdev_t *vd, uint64_t *minp, uint64_t *maxp)
/*
* Gets the checkpoint space map object from the vdev's ZAP.
- * Returns the spacemap object, or 0 if it wasn't in the ZAP
- * or the ZAP doesn't exist yet.
+ * Returns the spacemap object, or 0 if it wasn't in the ZAP,
+ * the ZAP doesn't exist yet, or the ZAP is damaged.
*/
int
vdev_checkpoint_sm_object(vdev_t *vd)
@@ -2774,8 +2774,12 @@ vdev_checkpoint_sm_object(vdev_t *vd)
int err = zap_lookup(spa_meta_objset(vd->vdev_spa), vd->vdev_top_zap,
VDEV_TOP_ZAP_POOL_CHECKPOINT_SM, sizeof (uint64_t), 1, &sm_obj);
- if (err != 0)
- VERIFY3S(err, ==, ENOENT);
+ if (err != 0 && err != ENOENT) {
+ vdev_dbgmsg(vd, "vdev_load: vdev_checkpoint_sm_objset "
+ "failed to retrieve checkpoint space map object from "
+ "vdev ZAP [error=%d]", err);
+ ASSERT3S(err, ==, ECKSUM);
+ }
return (sm_obj);
}