mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 03:08:51 +03:00
range_tree: Provide more debug details upon unexpected add/remove
Sponsored-by: Klara, Inc. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <alexander.motin@TrueNAS.com> Signed-off-by: Igor Ostapenko <igor.ostapenko@klarasystems.com> Closes #17581
This commit is contained in:
+30
-6
@@ -243,6 +243,25 @@ vdev_dbgmsg_print_tree(vdev_t *vd, int indent)
|
||||
vdev_dbgmsg_print_tree(vd->vdev_child[i], indent + 2);
|
||||
}
|
||||
|
||||
char *
|
||||
vdev_rt_name(vdev_t *vd, const char *name)
|
||||
{
|
||||
return (kmem_asprintf("{spa=%s vdev_guid=%llu %s}",
|
||||
spa_name(vd->vdev_spa),
|
||||
(u_longlong_t)vd->vdev_guid,
|
||||
name));
|
||||
}
|
||||
|
||||
static char *
|
||||
vdev_rt_name_dtl(vdev_t *vd, const char *name, vdev_dtl_type_t dtl_type)
|
||||
{
|
||||
return (kmem_asprintf("{spa=%s vdev_guid=%llu %s[%d]}",
|
||||
spa_name(vd->vdev_spa),
|
||||
(u_longlong_t)vd->vdev_guid,
|
||||
name,
|
||||
dtl_type));
|
||||
}
|
||||
|
||||
/*
|
||||
* Virtual device management.
|
||||
*/
|
||||
@@ -695,8 +714,9 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
|
||||
|
||||
rw_init(&vd->vdev_indirect_rwlock, NULL, RW_DEFAULT, NULL);
|
||||
mutex_init(&vd->vdev_obsolete_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
vd->vdev_obsolete_segments = zfs_range_tree_create(NULL,
|
||||
ZFS_RANGE_SEG64, NULL, 0, 0);
|
||||
vd->vdev_obsolete_segments = zfs_range_tree_create_flags(
|
||||
NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
|
||||
ZFS_RT_F_DYN_NAME, vdev_rt_name(vd, "vdev_obsolete_segments"));
|
||||
|
||||
/*
|
||||
* Initialize rate limit structs for events. We rate limit ZIO delay
|
||||
@@ -750,8 +770,9 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
|
||||
cv_init(&vd->vdev_rebuild_cv, NULL, CV_DEFAULT, NULL);
|
||||
|
||||
for (int t = 0; t < DTL_TYPES; t++) {
|
||||
vd->vdev_dtl[t] = zfs_range_tree_create(NULL, ZFS_RANGE_SEG64,
|
||||
NULL, 0, 0);
|
||||
vd->vdev_dtl[t] = zfs_range_tree_create_flags(
|
||||
NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
|
||||
ZFS_RT_F_DYN_NAME, vdev_rt_name_dtl(vd, "vdev_dtl", t));
|
||||
}
|
||||
|
||||
txg_list_create(&vd->vdev_ms_list, spa,
|
||||
@@ -3458,7 +3479,9 @@ vdev_dtl_load(vdev_t *vd)
|
||||
return (error);
|
||||
ASSERT(vd->vdev_dtl_sm != NULL);
|
||||
|
||||
rt = zfs_range_tree_create(NULL, ZFS_RANGE_SEG64, NULL, 0, 0);
|
||||
rt = zfs_range_tree_create_flags(
|
||||
NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
|
||||
ZFS_RT_F_DYN_NAME, vdev_rt_name(vd, "vdev_dtl_load:rt"));
|
||||
error = space_map_load(vd->vdev_dtl_sm, rt, SM_ALLOC);
|
||||
if (error == 0) {
|
||||
mutex_enter(&vd->vdev_dtl_lock);
|
||||
@@ -3606,7 +3629,8 @@ vdev_dtl_sync(vdev_t *vd, uint64_t txg)
|
||||
ASSERT(vd->vdev_dtl_sm != NULL);
|
||||
}
|
||||
|
||||
rtsync = zfs_range_tree_create(NULL, ZFS_RANGE_SEG64, NULL, 0, 0);
|
||||
rtsync = zfs_range_tree_create_flags(NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
|
||||
ZFS_RT_F_DYN_NAME, vdev_rt_name(vd, "rtsync"));
|
||||
|
||||
mutex_enter(&vd->vdev_dtl_lock);
|
||||
zfs_range_tree_walk(rt, zfs_range_tree_add, rtsync);
|
||||
|
||||
Reference in New Issue
Block a user