]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Allow ECKSUM in vdev_checkpoint_sm_object()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 31 Aug 2018 21:20:34 +0000 (14:20 -0700)
committerGitHub <noreply@github.com>
Fri, 31 Aug 2018 21:20:34 +0000 (14:20 -0700)
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 <serapheim@delphix.com>
Reviewed by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #7809
Closes #7853

module/zfs/vdev.c

index 543a49c7af02706ee73f259b9957477c1d7caf99..f5c259bd4cf9cfcae9b3fdb2bca102c869b8c052 100644 (file)
@@ -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);
 }