--- a/usr/src/uts/common/fs/zfs/dsl_pool.c Fri Oct 30 18:47:17 2009 -0600
+++ b/usr/src/uts/common/fs/zfs/dsl_pool.c Sun Nov 01 14:14:46 2009 -0800
@@ -346,6 +346,15 @@
}
err = zio_wait(zio);
+ /*
+ * If anything was added to a deadlist during a zio done callback,
+ * it had to be put on the deferred queue. Enqueue it for real now.
+ */
+ for (ds = list_head(&dp->dp_synced_datasets); ds;
+ ds = list_next(&dp->dp_synced_datasets, ds))
+ bplist_sync(&ds->ds_deadlist,
+ bplist_enqueue_cb, &ds->ds_deadlist, tx);
+
while (dstg = txg_list_remove(&dp->dp_sync_tasks, txg)) {
/*
* No more sync tasks should have been added while we
@@ -422,16 +431,19 @@
}
void
-dsl_pool_zil_clean(dsl_pool_t *dp)
+dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg)
{
dsl_dataset_t *ds;
+ objset_t *os;
while (ds = list_head(&dp->dp_synced_datasets)) {
list_remove(&dp->dp_synced_datasets, ds);
- ASSERT(ds->ds_objset != NULL);
- zil_clean(ds->ds_objset->os_zil);
+ os = ds->ds_objset;
+ zil_clean(os->os_zil);
+ ASSERT(!dmu_objset_is_dirty(os, txg));
dmu_buf_rele(ds->ds_dbuf, ds);
}
+ ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg));
}
/*
@@ -460,7 +472,7 @@
* cut the reservation in half to allow forward progress
* (e.g. make it possible to rm(1) files from a full pool).
*/
- space = spa_get_dspace(dp->dp_spa);
+ space = metaslab_class_get_dspace(spa_normal_class(dp->dp_spa));
resv = MAX(space >> 6, SPA_MINDEVSIZE >> 1);
if (netfree)
resv >>= 1;