Merge zvol.c changes from PSARC 2010/306 Read-only ZFS pools
authorGeorge Wilson <George.Wilson@Sun.COM>
Sun, 3 Mar 2013 05:57:39 +0000 (00:57 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 4 Mar 2013 17:56:13 +0000 (09:56 -0800)
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 <ryao@cs.stonybrook.edu>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1332
Closes #1333

module/zfs/zvol.c

index f8e3256..b0d59fe 100644 (file)
@@ -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: