mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
OpenZFS 6736 - ZFS per-vdev ZAPs
6736 ZFS per-vdev ZAPs Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: John Kennedy <john.kennedy@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Don Brady <don.brady@intel.com> Reviewed by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/6736 https://github.com/openzfs/openzfs/commit/215198a Ported-by: Don Brady <don.brady@intel.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #4515
This commit is contained in:
committed by
Brian Behlendorf
parent
4cd77889b6
commit
e0ab3ab553
@@ -519,6 +519,10 @@ vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, uint_t id,
|
||||
&vd->vdev_asize);
|
||||
(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_REMOVING,
|
||||
&vd->vdev_removing);
|
||||
(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_VDEV_TOP_ZAP,
|
||||
&vd->vdev_top_zap);
|
||||
} else {
|
||||
ASSERT0(vd->vdev_top_zap);
|
||||
}
|
||||
|
||||
if (parent && !parent->vdev_parent && alloctype != VDEV_ALLOC_ATTACH) {
|
||||
@@ -530,9 +534,18 @@ vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, uint_t id,
|
||||
spa_log_class(spa) : spa_normal_class(spa), vd);
|
||||
}
|
||||
|
||||
if (vd->vdev_ops->vdev_op_leaf &&
|
||||
(alloctype == VDEV_ALLOC_LOAD || alloctype == VDEV_ALLOC_SPLIT)) {
|
||||
(void) nvlist_lookup_uint64(nv,
|
||||
ZPOOL_CONFIG_VDEV_LEAF_ZAP, &vd->vdev_leaf_zap);
|
||||
} else {
|
||||
ASSERT0(vd->vdev_leaf_zap);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we're a leaf vdev, try to load the DTL object and other state.
|
||||
*/
|
||||
|
||||
if (vd->vdev_ops->vdev_op_leaf &&
|
||||
(alloctype == VDEV_ALLOC_LOAD || alloctype == VDEV_ALLOC_L2CACHE ||
|
||||
alloctype == VDEV_ALLOC_ROOTPOOL)) {
|
||||
@@ -694,10 +707,12 @@ vdev_top_transfer(vdev_t *svd, vdev_t *tvd)
|
||||
tvd->vdev_ms_array = svd->vdev_ms_array;
|
||||
tvd->vdev_ms_shift = svd->vdev_ms_shift;
|
||||
tvd->vdev_ms_count = svd->vdev_ms_count;
|
||||
tvd->vdev_top_zap = svd->vdev_top_zap;
|
||||
|
||||
svd->vdev_ms_array = 0;
|
||||
svd->vdev_ms_shift = 0;
|
||||
svd->vdev_ms_count = 0;
|
||||
svd->vdev_top_zap = 0;
|
||||
|
||||
if (tvd->vdev_mg)
|
||||
ASSERT3P(tvd->vdev_mg, ==, svd->vdev_mg);
|
||||
@@ -1976,6 +1991,51 @@ vdev_dtl_load(vdev_t *vd)
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
vdev_destroy_unlink_zap(vdev_t *vd, uint64_t zapobj, dmu_tx_t *tx)
|
||||
{
|
||||
spa_t *spa = vd->vdev_spa;
|
||||
|
||||
VERIFY0(zap_destroy(spa->spa_meta_objset, zapobj, tx));
|
||||
VERIFY0(zap_remove_int(spa->spa_meta_objset, spa->spa_all_vdev_zaps,
|
||||
zapobj, tx));
|
||||
}
|
||||
|
||||
uint64_t
|
||||
vdev_create_link_zap(vdev_t *vd, dmu_tx_t *tx)
|
||||
{
|
||||
spa_t *spa = vd->vdev_spa;
|
||||
uint64_t zap = zap_create(spa->spa_meta_objset, DMU_OTN_ZAP_METADATA,
|
||||
DMU_OT_NONE, 0, tx);
|
||||
|
||||
ASSERT(zap != 0);
|
||||
VERIFY0(zap_add_int(spa->spa_meta_objset, spa->spa_all_vdev_zaps,
|
||||
zap, tx));
|
||||
|
||||
return (zap);
|
||||
}
|
||||
|
||||
void
|
||||
vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx)
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
if (vd->vdev_ops != &vdev_hole_ops &&
|
||||
vd->vdev_ops != &vdev_missing_ops &&
|
||||
vd->vdev_ops != &vdev_root_ops &&
|
||||
!vd->vdev_top->vdev_removing) {
|
||||
if (vd->vdev_ops->vdev_op_leaf && vd->vdev_leaf_zap == 0) {
|
||||
vd->vdev_leaf_zap = vdev_create_link_zap(vd, tx);
|
||||
}
|
||||
if (vd == vd->vdev_top && vd->vdev_top_zap == 0) {
|
||||
vd->vdev_top_zap = vdev_create_link_zap(vd, tx);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < vd->vdev_children; i++) {
|
||||
vdev_construct_zaps(vd->vdev_child[i], tx);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
vdev_dtl_sync(vdev_t *vd, uint64_t txg)
|
||||
{
|
||||
@@ -1998,6 +2058,18 @@ vdev_dtl_sync(vdev_t *vd, uint64_t txg)
|
||||
space_map_close(vd->vdev_dtl_sm);
|
||||
vd->vdev_dtl_sm = NULL;
|
||||
mutex_exit(&vd->vdev_dtl_lock);
|
||||
|
||||
/*
|
||||
* We only destroy the leaf ZAP for detached leaves or for
|
||||
* removed log devices. Removed data devices handle leaf ZAP
|
||||
* cleanup later, once cancellation is no longer possible.
|
||||
*/
|
||||
if (vd->vdev_leaf_zap != 0 && (vd->vdev_detached ||
|
||||
vd->vdev_top->vdev_islog)) {
|
||||
vdev_destroy_unlink_zap(vd, vd->vdev_leaf_zap, tx);
|
||||
vd->vdev_leaf_zap = 0;
|
||||
}
|
||||
|
||||
dmu_tx_commit(tx);
|
||||
return;
|
||||
}
|
||||
@@ -2204,6 +2276,8 @@ vdev_remove(vdev_t *vd, uint64_t txg)
|
||||
int m, i;
|
||||
|
||||
tx = dmu_tx_create_assigned(spa_get_dsl(spa), txg);
|
||||
ASSERT(vd == vd->vdev_top);
|
||||
ASSERT3U(txg, ==, spa_syncing_txg(spa));
|
||||
|
||||
if (vd->vdev_ms != NULL) {
|
||||
metaslab_group_t *mg = vd->vdev_mg;
|
||||
@@ -2245,6 +2319,11 @@ vdev_remove(vdev_t *vd, uint64_t txg)
|
||||
(void) dmu_object_free(mos, vd->vdev_ms_array, tx);
|
||||
vd->vdev_ms_array = 0;
|
||||
}
|
||||
|
||||
if (vd->vdev_islog && vd->vdev_top_zap != 0) {
|
||||
vdev_destroy_unlink_zap(vd, vd->vdev_top_zap, tx);
|
||||
vd->vdev_top_zap = 0;
|
||||
}
|
||||
dmu_tx_commit(tx);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user