mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-26 04:07:45 +03:00
Illumos 5314 - Remove "dbuf phys" db->db_data pointer aliases in ZFS
5314 Remove "dbuf phys" db->db_data pointer aliases in ZFS Author: Justin T. Gibbs <justing@spectralogic.com> Reviewed by: Andriy Gapon <avg@freebsd.org> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Will Andrews <willa@spectralogic.com> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/5314 https://github.com/illumos/illumos-gate/commit/c137962 Ported-by: Chris Dunlop <chris@onthe.net.au> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
committed by
Brian Behlendorf
parent
945dd93525
commit
d683ddbb72
+51
-47
@@ -416,7 +416,7 @@ dsl_scan_ds_maxtxg(dsl_dataset_t *ds)
|
||||
{
|
||||
uint64_t smt = ds->ds_dir->dd_pool->dp_scan->scn_phys.scn_max_txg;
|
||||
if (dsl_dataset_is_snapshot(ds))
|
||||
return (MIN(smt, ds->ds_phys->ds_creation_txg));
|
||||
return (MIN(smt, dsl_dataset_phys(ds)->ds_creation_txg));
|
||||
return (smt);
|
||||
}
|
||||
|
||||
@@ -849,11 +849,12 @@ dsl_scan_ds_destroyed(dsl_dataset_t *ds, dmu_tx_t *tx)
|
||||
if (dsl_dataset_is_snapshot(ds)) {
|
||||
/* Note, scn_cur_{min,max}_txg stays the same. */
|
||||
scn->scn_phys.scn_bookmark.zb_objset =
|
||||
ds->ds_phys->ds_next_snap_obj;
|
||||
dsl_dataset_phys(ds)->ds_next_snap_obj;
|
||||
zfs_dbgmsg("destroying ds %llu; currently traversing; "
|
||||
"reset zb_objset to %llu",
|
||||
(u_longlong_t)ds->ds_object,
|
||||
(u_longlong_t)ds->ds_phys->ds_next_snap_obj);
|
||||
(u_longlong_t)dsl_dataset_phys(ds)->
|
||||
ds_next_snap_obj);
|
||||
scn->scn_phys.scn_flags |= DSF_VISIT_DS_AGAIN;
|
||||
} else {
|
||||
SET_BOOKMARK(&scn->scn_phys.scn_bookmark,
|
||||
@@ -864,7 +865,7 @@ dsl_scan_ds_destroyed(dsl_dataset_t *ds, dmu_tx_t *tx)
|
||||
}
|
||||
} else if (zap_lookup_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds->ds_object, &mintxg) == 0) {
|
||||
ASSERT3U(ds->ds_phys->ds_num_children, <=, 1);
|
||||
ASSERT3U(dsl_dataset_phys(ds)->ds_num_children, <=, 1);
|
||||
VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds->ds_object, tx));
|
||||
if (dsl_dataset_is_snapshot(ds)) {
|
||||
@@ -875,11 +876,13 @@ dsl_scan_ds_destroyed(dsl_dataset_t *ds, dmu_tx_t *tx)
|
||||
*/
|
||||
VERIFY(zap_add_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj,
|
||||
ds->ds_phys->ds_next_snap_obj, mintxg, tx) == 0);
|
||||
dsl_dataset_phys(ds)->ds_next_snap_obj,
|
||||
mintxg, tx) == 0);
|
||||
zfs_dbgmsg("destroying ds %llu; in queue; "
|
||||
"replacing with %llu",
|
||||
(u_longlong_t)ds->ds_object,
|
||||
(u_longlong_t)ds->ds_phys->ds_next_snap_obj);
|
||||
(u_longlong_t)dsl_dataset_phys(ds)->
|
||||
ds_next_snap_obj);
|
||||
} else {
|
||||
zfs_dbgmsg("destroying ds %llu; in queue; removing",
|
||||
(u_longlong_t)ds->ds_object);
|
||||
@@ -906,26 +909,26 @@ dsl_scan_ds_snapshotted(dsl_dataset_t *ds, dmu_tx_t *tx)
|
||||
if (scn->scn_phys.scn_state != DSS_SCANNING)
|
||||
return;
|
||||
|
||||
ASSERT(ds->ds_phys->ds_prev_snap_obj != 0);
|
||||
ASSERT(dsl_dataset_phys(ds)->ds_prev_snap_obj != 0);
|
||||
|
||||
if (scn->scn_phys.scn_bookmark.zb_objset == ds->ds_object) {
|
||||
scn->scn_phys.scn_bookmark.zb_objset =
|
||||
ds->ds_phys->ds_prev_snap_obj;
|
||||
dsl_dataset_phys(ds)->ds_prev_snap_obj;
|
||||
zfs_dbgmsg("snapshotting ds %llu; currently traversing; "
|
||||
"reset zb_objset to %llu",
|
||||
(u_longlong_t)ds->ds_object,
|
||||
(u_longlong_t)ds->ds_phys->ds_prev_snap_obj);
|
||||
(u_longlong_t)dsl_dataset_phys(ds)->ds_prev_snap_obj);
|
||||
} else if (zap_lookup_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds->ds_object, &mintxg) == 0) {
|
||||
VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds->ds_object, tx));
|
||||
VERIFY(zap_add_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj,
|
||||
ds->ds_phys->ds_prev_snap_obj, mintxg, tx) == 0);
|
||||
dsl_dataset_phys(ds)->ds_prev_snap_obj, mintxg, tx) == 0);
|
||||
zfs_dbgmsg("snapshotting ds %llu; in queue; "
|
||||
"replacing with %llu",
|
||||
(u_longlong_t)ds->ds_object,
|
||||
(u_longlong_t)ds->ds_phys->ds_prev_snap_obj);
|
||||
(u_longlong_t)dsl_dataset_phys(ds)->ds_prev_snap_obj);
|
||||
}
|
||||
dsl_scan_sync_state(scn, tx);
|
||||
}
|
||||
@@ -958,8 +961,8 @@ dsl_scan_ds_clone_swapped(dsl_dataset_t *ds1, dsl_dataset_t *ds2, dmu_tx_t *tx)
|
||||
ds1->ds_object, &mintxg) == 0) {
|
||||
int err;
|
||||
|
||||
ASSERT3U(mintxg, ==, ds1->ds_phys->ds_prev_snap_txg);
|
||||
ASSERT3U(mintxg, ==, ds2->ds_phys->ds_prev_snap_txg);
|
||||
ASSERT3U(mintxg, ==, dsl_dataset_phys(ds1)->ds_prev_snap_txg);
|
||||
ASSERT3U(mintxg, ==, dsl_dataset_phys(ds2)->ds_prev_snap_txg);
|
||||
VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds1->ds_object, tx));
|
||||
err = zap_add_int_key(dp->dp_meta_objset,
|
||||
@@ -977,8 +980,8 @@ dsl_scan_ds_clone_swapped(dsl_dataset_t *ds1, dsl_dataset_t *ds2, dmu_tx_t *tx)
|
||||
(u_longlong_t)ds2->ds_object);
|
||||
} else if (zap_lookup_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds2->ds_object, &mintxg) == 0) {
|
||||
ASSERT3U(mintxg, ==, ds1->ds_phys->ds_prev_snap_txg);
|
||||
ASSERT3U(mintxg, ==, ds2->ds_phys->ds_prev_snap_txg);
|
||||
ASSERT3U(mintxg, ==, dsl_dataset_phys(ds1)->ds_prev_snap_txg);
|
||||
ASSERT3U(mintxg, ==, dsl_dataset_phys(ds2)->ds_prev_snap_txg);
|
||||
VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds2->ds_object, tx));
|
||||
VERIFY(0 == zap_add_int_key(dp->dp_meta_objset,
|
||||
@@ -1006,17 +1009,17 @@ enqueue_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
|
||||
int err;
|
||||
dsl_scan_t *scn = dp->dp_scan;
|
||||
|
||||
if (hds->ds_dir->dd_phys->dd_origin_obj != eca->originobj)
|
||||
if (dsl_dir_phys(hds->ds_dir)->dd_origin_obj != eca->originobj)
|
||||
return (0);
|
||||
|
||||
err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds);
|
||||
if (err)
|
||||
return (err);
|
||||
|
||||
while (ds->ds_phys->ds_prev_snap_obj != eca->originobj) {
|
||||
while (dsl_dataset_phys(ds)->ds_prev_snap_obj != eca->originobj) {
|
||||
dsl_dataset_t *prev;
|
||||
err = dsl_dataset_hold_obj(dp,
|
||||
ds->ds_phys->ds_prev_snap_obj, FTAG, &prev);
|
||||
dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev);
|
||||
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
if (err)
|
||||
@@ -1025,7 +1028,7 @@ enqueue_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
|
||||
}
|
||||
VERIFY(zap_add_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds->ds_object,
|
||||
ds->ds_phys->ds_prev_snap_txg, eca->tx) == 0);
|
||||
dsl_dataset_phys(ds)->ds_prev_snap_txg, eca->tx) == 0);
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
return (0);
|
||||
}
|
||||
@@ -1057,7 +1060,7 @@ dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
|
||||
* Iterate over the bps in this ds.
|
||||
*/
|
||||
dmu_buf_will_dirty(ds->ds_dbuf, tx);
|
||||
dsl_scan_visit_rootbp(scn, ds, &ds->ds_phys->ds_bp, tx);
|
||||
dsl_scan_visit_rootbp(scn, ds, &dsl_dataset_phys(ds)->ds_bp, tx);
|
||||
|
||||
dsname = kmem_alloc(ZFS_MAXNAMELEN, KM_SLEEP);
|
||||
dsl_dataset_name(ds, dsname);
|
||||
@@ -1091,14 +1094,15 @@ dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
|
||||
/*
|
||||
* Add descendent datasets to work queue.
|
||||
*/
|
||||
if (ds->ds_phys->ds_next_snap_obj != 0) {
|
||||
if (dsl_dataset_phys(ds)->ds_next_snap_obj != 0) {
|
||||
VERIFY(zap_add_int_key(dp->dp_meta_objset,
|
||||
scn->scn_phys.scn_queue_obj, ds->ds_phys->ds_next_snap_obj,
|
||||
ds->ds_phys->ds_creation_txg, tx) == 0);
|
||||
scn->scn_phys.scn_queue_obj,
|
||||
dsl_dataset_phys(ds)->ds_next_snap_obj,
|
||||
dsl_dataset_phys(ds)->ds_creation_txg, tx) == 0);
|
||||
}
|
||||
if (ds->ds_phys->ds_num_children > 1) {
|
||||
if (dsl_dataset_phys(ds)->ds_num_children > 1) {
|
||||
boolean_t usenext = B_FALSE;
|
||||
if (ds->ds_phys->ds_next_clones_obj != 0) {
|
||||
if (dsl_dataset_phys(ds)->ds_next_clones_obj != 0) {
|
||||
uint64_t count;
|
||||
/*
|
||||
* A bug in a previous version of the code could
|
||||
@@ -1108,17 +1112,17 @@ dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
|
||||
* next_clones_obj when its count is correct.
|
||||
*/
|
||||
int err = zap_count(dp->dp_meta_objset,
|
||||
ds->ds_phys->ds_next_clones_obj, &count);
|
||||
dsl_dataset_phys(ds)->ds_next_clones_obj, &count);
|
||||
if (err == 0 &&
|
||||
count == ds->ds_phys->ds_num_children - 1)
|
||||
count == dsl_dataset_phys(ds)->ds_num_children - 1)
|
||||
usenext = B_TRUE;
|
||||
}
|
||||
|
||||
if (usenext) {
|
||||
VERIFY0(zap_join_key(dp->dp_meta_objset,
|
||||
ds->ds_phys->ds_next_clones_obj,
|
||||
dsl_dataset_phys(ds)->ds_next_clones_obj,
|
||||
scn->scn_phys.scn_queue_obj,
|
||||
ds->ds_phys->ds_creation_txg, tx));
|
||||
dsl_dataset_phys(ds)->ds_creation_txg, tx));
|
||||
} else {
|
||||
struct enqueue_clones_arg eca;
|
||||
eca.tx = tx;
|
||||
@@ -1146,10 +1150,10 @@ enqueue_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
|
||||
if (err)
|
||||
return (err);
|
||||
|
||||
while (ds->ds_phys->ds_prev_snap_obj != 0) {
|
||||
while (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) {
|
||||
dsl_dataset_t *prev;
|
||||
err = dsl_dataset_hold_obj(dp, ds->ds_phys->ds_prev_snap_obj,
|
||||
FTAG, &prev);
|
||||
err = dsl_dataset_hold_obj(dp,
|
||||
dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev);
|
||||
if (err) {
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
return (err);
|
||||
@@ -1158,7 +1162,7 @@ enqueue_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
|
||||
/*
|
||||
* If this is a clone, we don't need to worry about it for now.
|
||||
*/
|
||||
if (prev->ds_phys->ds_next_snap_obj != ds->ds_object) {
|
||||
if (dsl_dataset_phys(prev)->ds_next_snap_obj != ds->ds_object) {
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
dsl_dataset_rele(prev, FTAG);
|
||||
return (0);
|
||||
@@ -1168,7 +1172,7 @@ enqueue_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
|
||||
}
|
||||
|
||||
VERIFY(zap_add_int_key(dp->dp_meta_objset, scn->scn_phys.scn_queue_obj,
|
||||
ds->ds_object, ds->ds_phys->ds_prev_snap_txg, tx) == 0);
|
||||
ds->ds_object, dsl_dataset_phys(ds)->ds_prev_snap_txg, tx) == 0);
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
return (0);
|
||||
}
|
||||
@@ -1348,7 +1352,7 @@ dsl_scan_visit(dsl_scan_t *scn, dmu_tx_t *tx)
|
||||
} else {
|
||||
scn->scn_phys.scn_cur_min_txg =
|
||||
MAX(scn->scn_phys.scn_min_txg,
|
||||
ds->ds_phys->ds_prev_snap_txg);
|
||||
dsl_dataset_phys(ds)->ds_prev_snap_txg);
|
||||
}
|
||||
scn->scn_phys.scn_cur_max_txg = dsl_scan_ds_maxtxg(ds);
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
@@ -1534,9 +1538,9 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
|
||||
if (err != 0)
|
||||
return;
|
||||
if (!scn->scn_async_destroying && zfs_free_leak_on_eio &&
|
||||
(dp->dp_free_dir->dd_phys->dd_used_bytes != 0 ||
|
||||
dp->dp_free_dir->dd_phys->dd_compressed_bytes != 0 ||
|
||||
dp->dp_free_dir->dd_phys->dd_uncompressed_bytes != 0)) {
|
||||
(dsl_dir_phys(dp->dp_free_dir)->dd_used_bytes != 0 ||
|
||||
dsl_dir_phys(dp->dp_free_dir)->dd_compressed_bytes != 0 ||
|
||||
dsl_dir_phys(dp->dp_free_dir)->dd_uncompressed_bytes != 0)) {
|
||||
/*
|
||||
* We have finished background destroying, but there is still
|
||||
* some space left in the dp_free_dir. Transfer this leaked
|
||||
@@ -1551,19 +1555,19 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
|
||||
rrw_exit(&dp->dp_config_rwlock, FTAG);
|
||||
}
|
||||
dsl_dir_diduse_space(dp->dp_leak_dir, DD_USED_HEAD,
|
||||
dp->dp_free_dir->dd_phys->dd_used_bytes,
|
||||
dp->dp_free_dir->dd_phys->dd_compressed_bytes,
|
||||
dp->dp_free_dir->dd_phys->dd_uncompressed_bytes, tx);
|
||||
dsl_dir_phys(dp->dp_free_dir)->dd_used_bytes,
|
||||
dsl_dir_phys(dp->dp_free_dir)->dd_compressed_bytes,
|
||||
dsl_dir_phys(dp->dp_free_dir)->dd_uncompressed_bytes, tx);
|
||||
dsl_dir_diduse_space(dp->dp_free_dir, DD_USED_HEAD,
|
||||
-dp->dp_free_dir->dd_phys->dd_used_bytes,
|
||||
-dp->dp_free_dir->dd_phys->dd_compressed_bytes,
|
||||
-dp->dp_free_dir->dd_phys->dd_uncompressed_bytes, tx);
|
||||
-dsl_dir_phys(dp->dp_free_dir)->dd_used_bytes,
|
||||
-dsl_dir_phys(dp->dp_free_dir)->dd_compressed_bytes,
|
||||
-dsl_dir_phys(dp->dp_free_dir)->dd_uncompressed_bytes, tx);
|
||||
}
|
||||
if (!scn->scn_async_destroying) {
|
||||
/* finished; verify that space accounting went to zero */
|
||||
ASSERT0(dp->dp_free_dir->dd_phys->dd_used_bytes);
|
||||
ASSERT0(dp->dp_free_dir->dd_phys->dd_compressed_bytes);
|
||||
ASSERT0(dp->dp_free_dir->dd_phys->dd_uncompressed_bytes);
|
||||
ASSERT0(dsl_dir_phys(dp->dp_free_dir)->dd_used_bytes);
|
||||
ASSERT0(dsl_dir_phys(dp->dp_free_dir)->dd_compressed_bytes);
|
||||
ASSERT0(dsl_dir_phys(dp->dp_free_dir)->dd_uncompressed_bytes);
|
||||
}
|
||||
|
||||
if (scn->scn_phys.scn_state != DSS_SCANNING)
|
||||
|
||||
Reference in New Issue
Block a user