Fix synchronicity for ZVOLs.
[zfs.git] / module / zfs / dmu_objset.c
index 7caebd9..0703a94 100644 (file)
@@ -528,8 +528,9 @@ void
 dmu_objset_evict(objset_t *os)
 {
        dsl_dataset_t *ds = os->os_dsl_dataset;
+       int t;
 
-       for (int t = 0; t < TXG_SIZE; t++)
+       for (t = 0; t < TXG_SIZE; t++)
                ASSERT(!dmu_objset_is_dirty(os, t));
 
        if (ds) {
@@ -945,16 +946,19 @@ dmu_objset_snapshot(char *fsname, char *snapname, char *tag,
     nvlist_t *props, boolean_t recursive, boolean_t temporary, int cleanup_fd)
 {
        dsl_sync_task_t *dst;
-       struct snaparg sn;
+       struct snaparg *sn;
        spa_t *spa;
        minor_t minor;
        int err;
 
-       (void) strcpy(sn.failed, fsname);
+       sn = kmem_alloc(sizeof (struct snaparg), KM_SLEEP);
+       (void) strcpy(sn->failed, fsname);
 
        err = spa_open(fsname, &spa, FTAG);
-       if (err)
+       if (err) {
+               kmem_free(sn, sizeof (struct snaparg));
                return (err);
+       }
 
        if (temporary) {
                if (cleanup_fd < 0) {
@@ -967,46 +971,47 @@ dmu_objset_snapshot(char *fsname, char *snapname, char *tag,
                }
        }
 
-       sn.dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
-       sn.snapname = snapname;
-       sn.htag = tag;
-       sn.props = props;
-       sn.recursive = recursive;
-       sn.needsuspend = (spa_version(spa) < SPA_VERSION_FAST_SNAP);
-       sn.temporary = temporary;
-       sn.ha = NULL;
-       sn.newds = NULL;
+       sn->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
+       sn->snapname = snapname;
+       sn->htag = tag;
+       sn->props = props;
+       sn->recursive = recursive;
+       sn->needsuspend = (spa_version(spa) < SPA_VERSION_FAST_SNAP);
+       sn->temporary = temporary;
+       sn->ha = NULL;
+       sn->newds = NULL;
 
        if (recursive) {
                err = dmu_objset_find(fsname,
-                   dmu_objset_snapshot_one, &sn, DS_FIND_CHILDREN);
+                   dmu_objset_snapshot_one, sn, DS_FIND_CHILDREN);
        } else {
-               err = dmu_objset_snapshot_one(fsname, &sn);
+               err = dmu_objset_snapshot_one(fsname, sn);
        }
 
        if (err == 0)
-               err = dsl_sync_task_group_wait(sn.dstg);
+               err = dsl_sync_task_group_wait(sn->dstg);
 
-       for (dst = list_head(&sn.dstg->dstg_tasks); dst;
-           dst = list_next(&sn.dstg->dstg_tasks, dst)) {
+       for (dst = list_head(&sn->dstg->dstg_tasks); dst;
+           dst = list_next(&sn->dstg->dstg_tasks, dst)) {
                objset_t *os = dst->dst_arg1;
                dsl_dataset_t *ds = os->os_dsl_dataset;
                if (dst->dst_err) {
-                       dsl_dataset_name(ds, sn.failed);
+                       dsl_dataset_name(ds, sn->failed);
                } else if (temporary) {
-                       dsl_register_onexit_hold_cleanup(sn.newds, tag, minor);
+                       dsl_register_onexit_hold_cleanup(sn->newds, tag, minor);
                }
-               if (sn.needsuspend)
+               if (sn->needsuspend)
                        zil_resume(dmu_objset_zil(os));
-               dmu_objset_rele(os, &sn);
+               dmu_objset_rele(os, sn);
        }
 
        if (err)
-               (void) strcpy(fsname, sn.failed);
+               (void) strcpy(fsname, sn->failed);
        if (temporary)
                zfs_onexit_fd_rele(cleanup_fd);
-       dsl_sync_task_group_destroy(sn.dstg);
+       dsl_sync_task_group_destroy(sn->dstg);
        spa_close(spa, FTAG);
+       kmem_free(sn, sizeof (struct snaparg));
        return (err);
 }
 
@@ -1015,7 +1020,7 @@ dmu_objset_sync_dnodes(list_t *list, list_t *newlist, dmu_tx_t *tx)
 {
        dnode_t *dn;
 
-       while (dn = list_head(list)) {
+       while ((dn = list_head(list))) {
                ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
                ASSERT(dn->dn_dbuf->db_data_pending);
                /*
@@ -1041,6 +1046,8 @@ dmu_objset_sync_dnodes(list_t *list, list_t *newlist, dmu_tx_t *tx)
 static void
 dmu_objset_write_ready(zio_t *zio, arc_buf_t *abuf, void *arg)
 {
+       int i;
+
        blkptr_t *bp = zio->io_bp;
        objset_t *os = arg;
        dnode_phys_t *dnp = &os->os_phys->os_meta_dnode;
@@ -1056,7 +1063,7 @@ dmu_objset_write_ready(zio_t *zio, arc_buf_t *abuf, void *arg)
         * dnode and user/group accounting objects).
         */
        bp->blk_fill = 0;
-       for (int i = 0; i < dnp->dn_nblkptr; i++)
+       for (i = 0; i < dnp->dn_nblkptr; i++)
                bp->blk_fill += dnp->dn_blkptr[i].blk_fill;
 }
 
@@ -1154,7 +1161,7 @@ dmu_objset_sync(objset_t *os, zio_t *pio, dmu_tx_t *tx)
        dmu_objset_sync_dnodes(&os->os_dirty_dnodes[txgoff], newlist, tx);
 
        list = &DMU_META_DNODE(os)->dn_dirty_records[txgoff];
-       while (dr = list_head(list)) {
+       while ((dr = list_head(list)) != NULL) {
                ASSERT(dr->dr_dbuf->db_level == 0);
                list_remove(list, dr);
                if (dr->dr_zio)
@@ -1178,7 +1185,9 @@ dmu_objset_is_dirty(objset_t *os, uint64_t txg)
 boolean_t
 dmu_objset_is_dirty_anywhere(objset_t *os)
 {
-       for (int t = 0; t < TXG_SIZE; t++)
+       int t;
+
+       for (t = 0; t < TXG_SIZE; t++)
                if (dmu_objset_is_dirty(os, t))
                        return (B_TRUE);
        return (B_FALSE);
@@ -1223,7 +1232,7 @@ dmu_objset_do_userquota_updates(objset_t *os, dmu_tx_t *tx)
 
        ASSERT(list_head(list) == NULL || dmu_objset_userused_enabled(os));
 
-       while (dn = list_head(list)) {
+       while ((dn = list_head(list)) != NULL) {
                int flags;
                ASSERT(!DMU_OBJECT_IS_SPECIAL(dn->dn_object));
                ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE ||
@@ -1326,7 +1335,7 @@ dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx)
        objset_t *os = dn->dn_objset;
        void *data = NULL;
        dmu_buf_impl_t *db = NULL;
-       uint64_t *user, *group;
+       uint64_t *user = NULL, *group = NULL;
        int flags = dn->dn_id_flags;
        int error;
        boolean_t have_spill = B_FALSE;
@@ -1787,3 +1796,40 @@ dmu_objset_get_user(objset_t *os)
        ASSERT(MUTEX_HELD(&os->os_user_ptr_lock));
        return (os->os_user_ptr);
 }
+
+#if defined(_KERNEL) && defined(HAVE_SPL)
+EXPORT_SYMBOL(dmu_objset_pool);
+EXPORT_SYMBOL(dmu_objset_name);
+EXPORT_SYMBOL(dmu_objset_hold);
+EXPORT_SYMBOL(dmu_objset_own);
+EXPORT_SYMBOL(dmu_objset_rele);
+EXPORT_SYMBOL(dmu_objset_disown);
+EXPORT_SYMBOL(dmu_objset_from_ds);
+EXPORT_SYMBOL(dmu_objset_create);
+EXPORT_SYMBOL(dmu_objset_clone);
+EXPORT_SYMBOL(dmu_objset_destroy);
+EXPORT_SYMBOL(dmu_objset_snapshot);
+EXPORT_SYMBOL(dmu_objset_stats);
+EXPORT_SYMBOL(dmu_objset_fast_stat);
+EXPORT_SYMBOL(dmu_objset_spa);
+EXPORT_SYMBOL(dmu_objset_space);
+EXPORT_SYMBOL(dmu_objset_fsid_guid);
+EXPORT_SYMBOL(dmu_objset_find);
+EXPORT_SYMBOL(dmu_objset_find_spa);
+EXPORT_SYMBOL(dmu_objset_prefetch);
+EXPORT_SYMBOL(dmu_objset_byteswap);
+EXPORT_SYMBOL(dmu_objset_evict_dbufs);
+EXPORT_SYMBOL(dmu_objset_snap_cmtime);
+
+EXPORT_SYMBOL(dmu_objset_sync);
+EXPORT_SYMBOL(dmu_objset_is_dirty);
+EXPORT_SYMBOL(dmu_objset_create_impl);
+EXPORT_SYMBOL(dmu_objset_open_impl);
+EXPORT_SYMBOL(dmu_objset_evict);
+EXPORT_SYMBOL(dmu_objset_register_type);
+EXPORT_SYMBOL(dmu_objset_do_userquota_updates);
+EXPORT_SYMBOL(dmu_objset_userquota_get_ids);
+EXPORT_SYMBOL(dmu_objset_userused_enabled);
+EXPORT_SYMBOL(dmu_objset_userspace_upgrade);
+EXPORT_SYMBOL(dmu_objset_userspace_present);
+#endif