diff options
author | Matt Macy <mmacy@FreeBSD.org> | 2020-10-13 21:03:36 -0700 |
---|---|---|
committer | Dan McDonald <danmcd@joyent.com> | 2022-01-11 11:18:51 -0500 |
commit | 2966a4e8bbd82f7bd6a8909e7c10b98f18fe7e84 (patch) | |
tree | 585b66b6925176b04f8b5726e04b92b5c0f16444 /usr/src/uts/common/fs | |
parent | 1b2ec6d6cf3fc8870f15f0100929dfde15fb32c6 (diff) | |
download | illumos-gate-2966a4e8bbd82f7bd6a8909e7c10b98f18fe7e84.tar.gz |
14375 dmu_zfetch: don't leak unreferenced stream when zfetch is freed
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Adam Moss <c@yotes.com>
Reviewed by: Ryan Moeller <ryan@iXsystems.com>
Reviewed by: Marcel Telka <marcel@telka.sk>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Andy Fiddaman <andy@omnios.org>
Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/uts/common/fs')
-rw-r--r-- | usr/src/uts/common/fs/zfs/dmu_zfetch.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/zfs/dmu_zfetch.c b/usr/src/uts/common/fs/zfs/dmu_zfetch.c index 8c3799d8ba..08af78d620 100644 --- a/usr/src/uts/common/fs/zfs/dmu_zfetch.c +++ b/usr/src/uts/common/fs/zfs/dmu_zfetch.c @@ -162,8 +162,12 @@ dmu_zfetch_fini(zfetch_t *zf) ASSERT(!RW_LOCK_HELD(&zf->zf_rwlock)); rw_enter(&zf->zf_rwlock, RW_WRITER); - while ((zs = list_head(&zf->zf_stream)) != NULL) - dmu_zfetch_stream_orphan(zf, zs); + while ((zs = list_head(&zf->zf_stream)) != NULL) { + if (zfs_refcount_count(&zs->zs_blocks) != 0) + dmu_zfetch_stream_orphan(zf, zs); + else + dmu_zfetch_stream_remove(zf, zs); + } rw_exit(&zf->zf_rwlock); list_destroy(&zf->zf_stream); rw_destroy(&zf->zf_rwlock); |