Fix traverse_impl() kmem leak

The error path must free the memory allocated by this function or
it will be leaked.  In practice, this would leak only a few bytes
of memory under rare circumstances and thus is unlikely to have
caused any real problems.  This issue was caught by the kmemleak.

Reviewed-by: Giuseppe Di Natale <guss80@gmail.com>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #7791
This commit is contained in:
Brian Behlendorf 2018-08-15 09:53:44 -07:00 committed by GitHub
parent 1dfde3d9b2
commit 4338c5c06f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -650,7 +650,7 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
*/ */
if (!(td->td_flags & TRAVERSE_HARD) || if (!(td->td_flags & TRAVERSE_HARD) ||
!(td->td_flags & TRAVERSE_PRE)) !(td->td_flags & TRAVERSE_PRE))
return (err); goto out;
} else { } else {
osp = buf->b_data; osp = buf->b_data;
traverse_zil(td, &osp->os_zil_header); traverse_zil(td, &osp->os_zil_header);
@ -671,7 +671,7 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
while (!pd->pd_exited) while (!pd->pd_exited)
cv_wait_sig(&pd->pd_cv, &pd->pd_mtx); cv_wait_sig(&pd->pd_cv, &pd->pd_mtx);
mutex_exit(&pd->pd_mtx); mutex_exit(&pd->pd_mtx);
out:
mutex_destroy(&pd->pd_mtx); mutex_destroy(&pd->pd_mtx);
cv_destroy(&pd->pd_cv); cv_destroy(&pd->pd_cv);