]> granicus.if.org Git - zfs/commitdiff
ztest: creates partially initialized root dataset
authorloli10K <loli10K@users.noreply.github.com>
Fri, 18 Jan 2019 19:14:01 +0000 (20:14 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 18 Jan 2019 19:14:01 +0000 (11:14 -0800)
Since d8fdfc2 was integrated dsl_pool_create() does not call
dmu_objset_create_impl() for the root dataset when running in
userland (ztest): this creates a pool with a partially initialized
root dataset. Trying to import and use this pool results in both
zpool and zfs executables dumping core.

Fix this by adopting an alternative change suggested in OpenZFS 8607
code review.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Tom Caputi <tcaputi@datto.com>
Original-patch-by: Robert Mustacchi <rm@joyent.com>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #8277

module/zfs/dsl_pool.c

index e159a5d1b377a2d80a1c75be0d4aa1e0695c140b..78e782c81e1fce121c725ea17203e5325ee9bd74 100644 (file)
@@ -457,6 +457,11 @@ dsl_pool_create(spa_t *spa, nvlist_t *zplprops, dsl_crypto_params_t *dcp,
        int err;
        dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
        dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg);
+#ifdef _KERNEL
+       objset_t *os;
+#else
+       objset_t *os __attribute__((unused));
+#endif
        dsl_dataset_t *ds;
        uint64_t obj;
 
@@ -520,15 +525,12 @@ dsl_pool_create(spa_t *spa, nvlist_t *zplprops, dsl_crypto_params_t *dcp,
        /* create the root objset */
        VERIFY0(dsl_dataset_hold_obj_flags(dp, obj,
            DS_HOLD_FLAG_DECRYPT, FTAG, &ds));
+       rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
+       os = dmu_objset_create_impl(dp->dp_spa, ds,
+           dsl_dataset_get_blkptr(ds), DMU_OST_ZFS, tx);
+       rrw_exit(&ds->ds_bp_rwlock, FTAG);
 #ifdef _KERNEL
-       {
-               objset_t *os;
-               rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
-               os = dmu_objset_create_impl(dp->dp_spa, ds,
-                   dsl_dataset_get_blkptr(ds), DMU_OST_ZFS, tx);
-               rrw_exit(&ds->ds_bp_rwlock, FTAG);
-               zfs_create_fs(os, kcred, zplprops, tx);
-       }
+       zfs_create_fs(os, kcred, zplprops, tx);
 #endif
        dsl_dataset_rele_flags(ds, DS_HOLD_FLAG_DECRYPT, FTAG);