mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-01-25 10:12:13 +03:00
Fix ddle memleak in ddt_log_load
In ddt_log_load(), when removing dup entry from flushing tree, it doesn't free the entry causing memleak. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <alexander.motin@TrueNAS.com> Signed-off-by: Chunwei Chen <david.chen@nutanix.com> Co-authored-by: Chunwei Chen <david.chen@nutanix.com> Closes #17657 Closes #17730
This commit is contained in:
parent
43a9d9ac57
commit
95d677efde
@ -244,6 +244,13 @@ ddt_log_alloc_entry(ddt_t *ddt)
|
|||||||
return (ddle);
|
return (ddle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ddt_log_free_entry(ddt_t *ddt, ddt_log_entry_t *ddle)
|
||||||
|
{
|
||||||
|
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
|
||||||
|
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ddt_log_update_entry(ddt_t *ddt, ddt_log_t *ddl, ddt_lightweight_entry_t *ddlwe)
|
ddt_log_update_entry(ddt_t *ddt, ddt_log_t *ddl, ddt_lightweight_entry_t *ddlwe)
|
||||||
{
|
{
|
||||||
@ -349,8 +356,7 @@ ddt_log_take_first(ddt_t *ddt, ddt_log_t *ddl, ddt_lightweight_entry_t *ddlwe)
|
|||||||
ddt_histogram_sub_entry(ddt, &ddt->ddt_log_histogram, ddlwe);
|
ddt_histogram_sub_entry(ddt, &ddt->ddt_log_histogram, ddlwe);
|
||||||
|
|
||||||
avl_remove(&ddl->ddl_tree, ddle);
|
avl_remove(&ddl->ddl_tree, ddle);
|
||||||
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
|
ddt_log_free_entry(ddt, ddle);
|
||||||
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
|
|
||||||
|
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
}
|
}
|
||||||
@ -367,8 +373,7 @@ ddt_log_remove_key(ddt_t *ddt, ddt_log_t *ddl, const ddt_key_t *ddk)
|
|||||||
ddt_histogram_sub_entry(ddt, &ddt->ddt_log_histogram, &ddlwe);
|
ddt_histogram_sub_entry(ddt, &ddt->ddt_log_histogram, &ddlwe);
|
||||||
|
|
||||||
avl_remove(&ddl->ddl_tree, ddle);
|
avl_remove(&ddl->ddl_tree, ddle);
|
||||||
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
|
ddt_log_free_entry(ddt, ddle);
|
||||||
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
|
|
||||||
|
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
}
|
}
|
||||||
@ -529,8 +534,7 @@ ddt_log_empty(ddt_t *ddt, ddt_log_t *ddl)
|
|||||||
IMPLY(ddt->ddt_version == UINT64_MAX, avl_is_empty(&ddl->ddl_tree));
|
IMPLY(ddt->ddt_version == UINT64_MAX, avl_is_empty(&ddl->ddl_tree));
|
||||||
while ((ddle =
|
while ((ddle =
|
||||||
avl_destroy_nodes(&ddl->ddl_tree, &cookie)) != NULL) {
|
avl_destroy_nodes(&ddl->ddl_tree, &cookie)) != NULL) {
|
||||||
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
|
ddt_log_free_entry(ddt, ddle);
|
||||||
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
|
|
||||||
}
|
}
|
||||||
ASSERT(avl_is_empty(&ddl->ddl_tree));
|
ASSERT(avl_is_empty(&ddl->ddl_tree));
|
||||||
}
|
}
|
||||||
@ -729,7 +733,7 @@ ddt_log_load(ddt_t *ddt)
|
|||||||
ddle = fe;
|
ddle = fe;
|
||||||
fe = AVL_NEXT(fl, fe);
|
fe = AVL_NEXT(fl, fe);
|
||||||
avl_remove(fl, ddle);
|
avl_remove(fl, ddle);
|
||||||
|
ddt_log_free_entry(ddt, ddle);
|
||||||
ddle = ae;
|
ddle = ae;
|
||||||
ae = AVL_NEXT(al, ae);
|
ae = AVL_NEXT(al, ae);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user