diff options
author | Brian Behlendorf <[email protected]> | 2018-08-31 14:20:34 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2018-08-31 14:20:34 -0700 |
commit | e927fc8a522e1c0db89955cc555841aa23bbd634 (patch) | |
tree | 51fc7bcdfc299c755ceedf5a85cfe2acae3ed1ee | |
parent | adb726eb0ed69e7331ddd308da8fec9316f6426d (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.c | 12 |
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); } |