Skip to content

Commit 27e474f

Browse files
committed
Fix ddle memleak in ddt_log_load
In ddt_log_load(), when removing dup entry from flusing tree, it doesn't free the entry causing memleak. Signed-off-by: Chunwei Chen <david.chen@nutanix.com> Fixes openzfs#17657
1 parent 654f2dc commit 27e474f

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

module/zfs/ddt_log.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,13 @@ ddt_log_alloc_entry(ddt_t *ddt)
244244
return (ddle);
245245
}
246246

247+
static void
248+
ddt_log_free_entry(ddt_t *ddt, ddt_log_entry_t *ddle)
249+
{
250+
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
251+
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
252+
}
253+
247254
static void
248255
ddt_log_update_entry(ddt_t *ddt, ddt_log_t *ddl, ddt_lightweight_entry_t *ddlwe)
249256
{
@@ -349,8 +356,7 @@ ddt_log_take_first(ddt_t *ddt, ddt_log_t *ddl, ddt_lightweight_entry_t *ddlwe)
349356
ddt_histogram_sub_entry(ddt, &ddt->ddt_log_histogram, ddlwe);
350357

351358
avl_remove(&ddl->ddl_tree, ddle);
352-
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
353-
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
359+
ddt_log_free_entry(ddt, ddle);
354360

355361
return (B_TRUE);
356362
}
@@ -367,8 +373,7 @@ ddt_log_remove_key(ddt_t *ddt, ddt_log_t *ddl, const ddt_key_t *ddk)
367373
ddt_histogram_sub_entry(ddt, &ddt->ddt_log_histogram, &ddlwe);
368374

369375
avl_remove(&ddl->ddl_tree, ddle);
370-
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
371-
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
376+
ddt_log_free_entry(ddt, ddle);
372377

373378
return (B_TRUE);
374379
}
@@ -529,8 +534,7 @@ ddt_log_empty(ddt_t *ddt, ddt_log_t *ddl)
529534
IMPLY(ddt->ddt_version == UINT64_MAX, avl_is_empty(&ddl->ddl_tree));
530535
while ((ddle =
531536
avl_destroy_nodes(&ddl->ddl_tree, &cookie)) != NULL) {
532-
kmem_cache_free(ddt->ddt_flags & DDT_FLAG_FLAT ?
533-
ddt_log_entry_flat_cache : ddt_log_entry_trad_cache, ddle);
537+
ddt_log_free_entry(ddt, ddle);
534538
}
535539
ASSERT(avl_is_empty(&ddl->ddl_tree));
536540
}
@@ -729,7 +733,7 @@ ddt_log_load(ddt_t *ddt)
729733
ddle = fe;
730734
fe = AVL_NEXT(fl, fe);
731735
avl_remove(fl, ddle);
732-
736+
ddt_log_free_entry(ddt, ddle);
733737
ddle = ae;
734738
ae = AVL_NEXT(al, ae);
735739
}

0 commit comments

Comments
 (0)