]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/dmu_objset.c
Illumos 4757, 4913
[mirror_zfs.git] / module / zfs / dmu_objset.c
index b82783098511c1037c03c4ac709b05a8a0d73496..238892cf40631c291bc450b9ec6ce87010669569 100644 (file)
@@ -337,7 +337,7 @@ dmu_objset_open_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp,
         * default (fletcher2/off).  Snapshots don't need to know about
         * checksum/compression/copies.
         */
-       if (ds) {
+       if (ds != NULL) {
                err = dsl_prop_register(ds,
                    zfs_prop_to_name(ZFS_PROP_PRIMARYCACHE),
                    primary_cache_changed_cb, os);
@@ -390,7 +390,7 @@ dmu_objset_open_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp,
                        kmem_free(os, sizeof (objset_t));
                        return (err);
                }
-       } else if (ds == NULL) {
+       } else {
                /* It's the meta-objset. */
                os->os_checksum = ZIO_CHECKSUM_FLETCHER_4;
                os->os_compress = ZIO_COMPRESS_LZJB;
@@ -434,17 +434,6 @@ dmu_objset_open_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp,
                    &os->os_groupused_dnode);
        }
 
-       /*
-        * We should be the only thread trying to do this because we
-        * have ds_opening_lock
-        */
-       if (ds) {
-               mutex_enter(&ds->ds_lock);
-               ASSERT(ds->ds_objset == NULL);
-               ds->ds_objset = os;
-               mutex_exit(&ds->ds_lock);
-       }
-
        *osp = os;
        return (0);
 }
@@ -455,11 +444,19 @@ dmu_objset_from_ds(dsl_dataset_t *ds, objset_t **osp)
        int err = 0;
 
        mutex_enter(&ds->ds_opening_lock);
-       *osp = ds->ds_objset;
-       if (*osp == NULL) {
+       if (ds->ds_objset == NULL) {
+               objset_t *os;
                err = dmu_objset_open_impl(dsl_dataset_get_spa(ds),
-                   ds, dsl_dataset_get_blkptr(ds), osp);
+                   ds, dsl_dataset_get_blkptr(ds), &os);
+
+               if (err == 0) {
+                       mutex_enter(&ds->ds_lock);
+                       ASSERT(ds->ds_objset == NULL);
+                       ds->ds_objset = os;
+                       mutex_exit(&ds->ds_lock);
+               }
        }
+       *osp = ds->ds_objset;
        mutex_exit(&ds->ds_opening_lock);
        return (err);
 }
@@ -981,6 +978,7 @@ dmu_objset_write_ready(zio_t *zio, arc_buf_t *abuf, void *arg)
        objset_t *os = arg;
        dnode_phys_t *dnp = &os->os_phys->os_meta_dnode;
 
+       ASSERT(!BP_IS_EMBEDDED(bp));
        ASSERT3P(bp, ==, os->os_rootbp);
        ASSERT3U(BP_GET_TYPE(bp), ==, DMU_OT_OBJSET);
        ASSERT0(BP_GET_LEVEL(bp));
@@ -993,7 +991,7 @@ dmu_objset_write_ready(zio_t *zio, arc_buf_t *abuf, void *arg)
         */
        bp->blk_fill = 0;
        for (i = 0; i < dnp->dn_nblkptr; i++)
-               bp->blk_fill += dnp->dn_blkptr[i].blk_fill;
+               bp->blk_fill += BP_GET_FILL(&dnp->dn_blkptr[i]);
 }
 
 /* ARGSUSED */