From a4430fce691d492aec382de0dfa937c05ee16500 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Sun, 3 Mar 2013 00:57:39 -0500 Subject: [PATCH] Merge zvol.c changes from PSARC 2010/306 Read-only ZFS pools The changes to zvol.c were never merged from the last onnv_147 bulk update. This was because zvol.c was largely rewritten for Linux making it fairly easy to miss these sorts of changes. This causes a regression when importing a zpool with zvols read-only. This does not impact pool which only contain filesystem datasets. References: illumos/illumos-gate@f9af39b Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Closes #1332 Closes #1333 --- module/zfs/zvol.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index f8e325676..b0d59fe0c 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -941,7 +941,8 @@ zvol_first_open(zvol_state_t *zv) zv->zv_zilog = zil_open(os, zvol_get_data); VERIFY(dsl_prop_get_integer(zv->zv_name, "readonly", &ro, NULL) == 0); - if (ro || dmu_objset_is_snapshot(os)) { + if (ro || dmu_objset_is_snapshot(os) || + !spa_writeable(dmu_objset_spa(os))) { set_disk_ro(zv->zv_disk, 1); zv->zv_flags |= ZVOL_RDONLY; } else { @@ -1352,10 +1353,12 @@ __zvol_create_minor(const char *name) queue_flag_set_unlocked(QUEUE_FLAG_NONROT, zv->zv_queue); #endif - if (zil_replay_disable) - zil_destroy(dmu_objset_zil(os), B_FALSE); - else - zil_replay(os, zv, zvol_replay_vector); + if (spa_writeable(dmu_objset_spa(os))) { + if (zil_replay_disable) + zil_destroy(dmu_objset_zil(os), B_FALSE); + else + zil_replay(os, zv, zvol_replay_vector); + } zv->zv_objset = NULL; out_dmu_objset_disown: