usr/src/uts/common/fs/zfs/dsl_pool.c
changeset 5367 c40abbe796be
parent 3897 278bade789ba
child 5642 504c84876fda
equal deleted inserted replaced
5366:5a99671e8d50 5367:c40abbe796be
    68 	    offsetof(dsl_dataset_t, ds_dirty_link));
    68 	    offsetof(dsl_dataset_t, ds_dirty_link));
    69 	txg_list_create(&dp->dp_dirty_dirs,
    69 	txg_list_create(&dp->dp_dirty_dirs,
    70 	    offsetof(dsl_dir_t, dd_dirty_link));
    70 	    offsetof(dsl_dir_t, dd_dirty_link));
    71 	txg_list_create(&dp->dp_sync_tasks,
    71 	txg_list_create(&dp->dp_sync_tasks,
    72 	    offsetof(dsl_sync_task_group_t, dstg_node));
    72 	    offsetof(dsl_sync_task_group_t, dstg_node));
    73 	list_create(&dp->dp_synced_objsets, sizeof (dsl_dataset_t),
    73 	list_create(&dp->dp_synced_datasets, sizeof (dsl_dataset_t),
    74 	    offsetof(dsl_dataset_t, ds_synced_link));
    74 	    offsetof(dsl_dataset_t, ds_synced_link));
    75 
    75 
    76 	return (dp);
    76 	return (dp);
    77 }
    77 }
    78 
    78 
   127 	if (dp->dp_meta_objset)
   127 	if (dp->dp_meta_objset)
   128 		dmu_objset_evict(NULL, dp->dp_meta_objset->os);
   128 		dmu_objset_evict(NULL, dp->dp_meta_objset->os);
   129 
   129 
   130 	txg_list_destroy(&dp->dp_dirty_datasets);
   130 	txg_list_destroy(&dp->dp_dirty_datasets);
   131 	txg_list_destroy(&dp->dp_dirty_dirs);
   131 	txg_list_destroy(&dp->dp_dirty_dirs);
   132 	list_destroy(&dp->dp_synced_objsets);
   132 	list_destroy(&dp->dp_synced_datasets);
   133 
   133 
   134 	arc_flush();
   134 	arc_flush();
   135 	txg_fini(dp);
   135 	txg_fini(dp);
   136 	rw_destroy(&dp->dp_config_rwlock);
   136 	rw_destroy(&dp->dp_config_rwlock);
   137 	kmem_free(dp, sizeof (dsl_pool_t));
   137 	kmem_free(dp, sizeof (dsl_pool_t));
   179 	tx = dmu_tx_create_assigned(dp, txg);
   179 	tx = dmu_tx_create_assigned(dp, txg);
   180 
   180 
   181 	zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
   181 	zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
   182 	while (ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) {
   182 	while (ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) {
   183 		if (!list_link_active(&ds->ds_synced_link))
   183 		if (!list_link_active(&ds->ds_synced_link))
   184 			list_insert_tail(&dp->dp_synced_objsets, ds);
   184 			list_insert_tail(&dp->dp_synced_datasets, ds);
   185 		else
   185 		else
   186 			dmu_buf_rele(ds->ds_dbuf, ds);
   186 			dmu_buf_rele(ds->ds_dbuf, ds);
   187 		dsl_dataset_sync(ds, zio, tx);
   187 		dsl_dataset_sync(ds, zio, tx);
   188 	}
   188 	}
   189 	err = zio_wait(zio);
   189 	err = zio_wait(zio);
   210 void
   210 void
   211 dsl_pool_zil_clean(dsl_pool_t *dp)
   211 dsl_pool_zil_clean(dsl_pool_t *dp)
   212 {
   212 {
   213 	dsl_dataset_t *ds;
   213 	dsl_dataset_t *ds;
   214 
   214 
   215 	while (ds = list_head(&dp->dp_synced_objsets)) {
   215 	while (ds = list_head(&dp->dp_synced_datasets)) {
   216 		list_remove(&dp->dp_synced_objsets, ds);
   216 		list_remove(&dp->dp_synced_datasets, ds);
   217 		ASSERT(ds->ds_user_ptr != NULL);
   217 		ASSERT(ds->ds_user_ptr != NULL);
   218 		zil_clean(((objset_impl_t *)ds->ds_user_ptr)->os_zil);
   218 		zil_clean(((objset_impl_t *)ds->ds_user_ptr)->os_zil);
   219 		dmu_buf_rele(ds->ds_dbuf, ds);
   219 		dmu_buf_rele(ds->ds_dbuf, ds);
   220 	}
   220 	}
   221 }
   221 }