From: Brian Behlendorf Date: Fri, 31 Aug 2018 21:20:34 +0000 (-0700) Subject: Allow ECKSUM in vdev_checkpoint_sm_object() X-Git-Tag: zfs-0.8.0-rc1~14 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e927fc8a522e1c0db89955cc555841aa23bbd634;p=zfs 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 --- 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); }