Illumos #3422, #3425
authorGeorge Wilson <george.wilson@delphix.com>
Wed, 10 Apr 2013 23:58:22 +0000 (16:58 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 12 Apr 2013 16:01:36 +0000 (09:01 -0700)
3422 zpool create/syseventd race yield non-importable pool
3425 first write to a new zvol can fail with EFBIG

Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Garrett D'Amore <garrett@damore.org>

References:
  illumos/illumos-gate@bda8819455defbccd06981d9a13b240b682a3d50
  https://www.illumos.org/issues/3422
  https://www.illumos.org/issues/3425

Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1390

lib/libzfs/libzfs_import.c
module/zfs/dmu_tx.c
module/zfs/vdev.c

index 3d80224..791aaad 100644 (file)
@@ -523,13 +523,12 @@ get_configs(libzfs_handle_t *hdl, pool_list_t *pl, boolean_t active_ok)
                                 *      version
                                 *      pool guid
                                 *      name
-                                *      pool txg (if available)
                                 *      comment (if available)
                                 *      pool state
                                 *      hostid (if available)
                                 *      hostname (if available)
                                 */
-                               uint64_t state, version, pool_txg;
+                               uint64_t state, version;
                                char *comment = NULL;
 
                                version = fnvlist_lookup_uint64(tmp,
@@ -545,11 +544,6 @@ get_configs(libzfs_handle_t *hdl, pool_list_t *pl, boolean_t active_ok)
                                fnvlist_add_string(config,
                                    ZPOOL_CONFIG_POOL_NAME, name);
 
-                               if (nvlist_lookup_uint64(tmp,
-                                   ZPOOL_CONFIG_POOL_TXG, &pool_txg) == 0)
-                                       fnvlist_add_uint64(config,
-                                           ZPOOL_CONFIG_POOL_TXG, pool_txg);
-
                                if (nvlist_lookup_string(tmp,
                                    ZPOOL_CONFIG_COMMENT, &comment) == 0)
                                        fnvlist_add_string(config,
index e47d858..81c86df 100644 (file)
@@ -21,7 +21,7 @@
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  */
 
 #include <sys/dmu.h>
@@ -301,6 +301,7 @@ dmu_tx_count_write(dmu_tx_hold_t *txh, uint64_t off, uint64_t len)
                        delta = P2NPHASE(off, dn->dn_datablksz);
                }
 
+               min_ibs = max_ibs = dn->dn_indblkshift;
                if (dn->dn_maxblkid > 0) {
                        /*
                         * The blocksize can't change,
@@ -308,13 +309,6 @@ dmu_tx_count_write(dmu_tx_hold_t *txh, uint64_t off, uint64_t len)
                         */
                        ASSERT(dn->dn_datablkshift != 0);
                        min_bs = max_bs = dn->dn_datablkshift;
-                       min_ibs = max_ibs = dn->dn_indblkshift;
-               } else if (dn->dn_indblkshift > max_ibs) {
-                       /*
-                        * This ensures that if we reduce DN_MAX_INDBLKSHIFT,
-                        * the code will still work correctly on older pools.
-                        */
-                       min_ibs = max_ibs = dn->dn_indblkshift;
                }
 
                /*
index b969751..06097f3 100644 (file)
@@ -1348,7 +1348,8 @@ vdev_validate(vdev_t *vd, boolean_t strict)
        if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) {
                uint64_t aux_guid = 0;
                nvlist_t *nvl;
-               uint64_t txg = strict ? spa->spa_config_txg : -1ULL;
+               uint64_t txg = spa_last_synced_txg(spa) != 0 ?
+                   spa_last_synced_txg(spa) : -1ULL;
 
                if ((label = vdev_label_read_config(vd, txg)) == NULL) {
                        vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
@@ -1533,7 +1534,7 @@ vdev_reopen(vdev_t *vd)
                    !l2arc_vdev_present(vd))
                        l2arc_add_vdev(spa, vd);
        } else {
-               (void) vdev_validate(vd, spa_last_synced_txg(spa));
+               (void) vdev_validate(vd, B_TRUE);
        }
 
        /*