From e927fc8a522e1c0db89955cc555841aa23bbd634 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 31 Aug 2018 14:20:34 -0700 Subject: [PATCH] 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 Reviewed by: Tim Chase Signed-off-by: Brian Behlendorf Closes #7809 Closes #7853 --- module/zfs/vdev.c | 12 ++++++++---- 1 file 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); }