aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--module/zfs/metaslab.c5
-rw-r--r--module/zfs/vdev.c6
2 files changed, 9 insertions, 2 deletions
diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c
index f9eef272b..43d3b211e 100644
--- a/module/zfs/metaslab.c
+++ b/module/zfs/metaslab.c
@@ -1255,9 +1255,10 @@ metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object, uint64_t txg,
/*
* We only open space map objects that already exist. All others
- * will be opened when we finally allocate an object for it.
+ * will be opened when we finally allocate an object for it. For
+ * readonly pools there is no need to open the space map object.
*/
- if (object != 0) {
+ if (object != 0 && spa_writeable(vd->vdev_spa)) {
error = space_map_open(&ms->ms_sm, mos, object, ms->ms_start,
ms->ms_size, vd->vdev_ashift, &ms->ms_lock);
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
index 52198261e..834cc1a48 100644
--- a/module/zfs/vdev.c
+++ b/module/zfs/vdev.c
@@ -1906,6 +1906,12 @@ vdev_dtl_load(vdev_t *vd)
if (vd->vdev_ops->vdev_op_leaf && vd->vdev_dtl_object != 0) {
ASSERT(!vd->vdev_ishole);
+ /*
+ * If the dtl cannot be sync'd there is no need to open it.
+ */
+ if (!spa_writeable(spa))
+ return (0);
+
error = space_map_open(&vd->vdev_dtl_sm, mos,
vd->vdev_dtl_object, 0, -1ULL, 0, &vd->vdev_dtl_lock);
if (error)