comparison usr/src/uts/common/fs/zfs/spa.c @ 10956:0c81acaaf614

6897693 deduplication can only go so far
author George Wilson <George.Wilson@Sun.COM>
date Wed, 04 Nov 2009 21:23:08 -0800
parents 588ee15c1f19
children 32d689ba6466
comparison
equal deleted inserted replaced
10955:9ddb8cec6aa3 10956:0c81acaaf614
144 */ 144 */
145 static void 145 static void
146 spa_prop_get_config(spa_t *spa, nvlist_t **nvp) 146 spa_prop_get_config(spa_t *spa, nvlist_t **nvp)
147 { 147 {
148 uint64_t size; 148 uint64_t size;
149 uint64_t used; 149 uint64_t alloc;
150 uint64_t cap, version; 150 uint64_t cap, version;
151 zprop_source_t src = ZPROP_SRC_NONE; 151 zprop_source_t src = ZPROP_SRC_NONE;
152 spa_config_dirent_t *dp; 152 spa_config_dirent_t *dp;
153 153
154 ASSERT(MUTEX_HELD(&spa->spa_props_lock)); 154 ASSERT(MUTEX_HELD(&spa->spa_props_lock));
155 155
156 if (spa->spa_root_vdev != NULL) { 156 if (spa->spa_root_vdev != NULL) {
157 used = metaslab_class_get_alloc(spa_normal_class(spa)); 157 alloc = metaslab_class_get_alloc(spa_normal_class(spa));
158 size = metaslab_class_get_space(spa_normal_class(spa)); 158 size = metaslab_class_get_space(spa_normal_class(spa));
159 spa_prop_add_list(*nvp, ZPOOL_PROP_NAME, spa_name(spa), 0, src); 159 spa_prop_add_list(*nvp, ZPOOL_PROP_NAME, spa_name(spa), 0, src);
160 spa_prop_add_list(*nvp, ZPOOL_PROP_SIZE, NULL, size, src); 160 spa_prop_add_list(*nvp, ZPOOL_PROP_SIZE, NULL, size, src);
161 spa_prop_add_list(*nvp, ZPOOL_PROP_USED, NULL, used, src); 161 spa_prop_add_list(*nvp, ZPOOL_PROP_ALLOCATED, NULL, alloc, src);
162 spa_prop_add_list(*nvp, ZPOOL_PROP_AVAILABLE, NULL, 162 spa_prop_add_list(*nvp, ZPOOL_PROP_FREE, NULL,
163 size - used, src); 163 size - alloc, src);
164 164
165 cap = (size == 0) ? 0 : (used * 100 / size); 165 cap = (size == 0) ? 0 : (alloc * 100 / size);
166 spa_prop_add_list(*nvp, ZPOOL_PROP_CAPACITY, NULL, cap, src); 166 spa_prop_add_list(*nvp, ZPOOL_PROP_CAPACITY, NULL, cap, src);
167 167
168 spa_prop_add_list(*nvp, ZPOOL_PROP_DEDUPRATIO, NULL, 168 spa_prop_add_list(*nvp, ZPOOL_PROP_DEDUPRATIO, NULL,
169 ddt_get_pool_dedup_ratio(spa), src); 169 ddt_get_pool_dedup_ratio(spa), src);
170 170
1681 VDEV_AUX_CORRUPT_DATA); 1681 VDEV_AUX_CORRUPT_DATA);
1682 error = EIO; 1682 error = EIO;
1683 goto out; 1683 goto out;
1684 } 1684 }
1685 1685
1686 spa_update_dspace(spa);
1687
1686 if (state != SPA_LOAD_TRYIMPORT) { 1688 if (state != SPA_LOAD_TRYIMPORT) {
1687 error = spa_load_verify(spa); 1689 error = spa_load_verify(spa);
1688 if (error) { 1690 if (error) {
1689 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN, 1691 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
1690 VDEV_AUX_CORRUPT_DATA); 1692 VDEV_AUX_CORRUPT_DATA);
2493 } 2495 }
2494 2496
2495 spa->spa_dsl_pool = dp = dsl_pool_create(spa, zplprops, txg); 2497 spa->spa_dsl_pool = dp = dsl_pool_create(spa, zplprops, txg);
2496 spa->spa_meta_objset = dp->dp_meta_objset; 2498 spa->spa_meta_objset = dp->dp_meta_objset;
2497 2499
2500 /*
2501 * Create DDTs (dedup tables).
2502 */
2503 ddt_create(spa);
2504
2505 spa_update_dspace(spa);
2506
2498 tx = dmu_tx_create_assigned(dp, txg); 2507 tx = dmu_tx_create_assigned(dp, txg);
2499 2508
2500 /* 2509 /*
2501 * Create the pool config object. 2510 * Create the pool config object.
2502 */ 2511 */
2552 2561
2553 if (props != NULL) { 2562 if (props != NULL) {
2554 spa_configfile_set(spa, props, B_FALSE); 2563 spa_configfile_set(spa, props, B_FALSE);
2555 spa_sync_props(spa, props, CRED(), tx); 2564 spa_sync_props(spa, props, CRED(), tx);
2556 } 2565 }
2557
2558 /*
2559 * Create DDTs (dedup tables).
2560 */
2561 ddt_create(spa);
2562 2566
2563 dmu_tx_commit(tx); 2567 dmu_tx_commit(tx);
2564 2568
2565 spa->spa_sync_on = B_TRUE; 2569 spa->spa_sync_on = B_TRUE;
2566 txg_sync_start(spa->spa_dsl_pool); 2570 txg_sync_start(spa->spa_dsl_pool);
4816 * Update usable space statistics. 4820 * Update usable space statistics.
4817 */ 4821 */
4818 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg))) 4822 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg)))
4819 vdev_sync_done(vd, txg); 4823 vdev_sync_done(vd, txg);
4820 4824
4825 spa_update_dspace(spa);
4826
4821 /* 4827 /*
4822 * It had better be the case that we didn't dirty anything 4828 * It had better be the case that we didn't dirty anything
4823 * since vdev_config_sync(). 4829 * since vdev_config_sync().
4824 */ 4830 */
4825 ASSERT(txg_list_empty(&dp->dp_dirty_datasets, txg)); 4831 ASSERT(txg_list_empty(&dp->dp_dirty_datasets, txg));