summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs
diff options
context:
space:
mode:
authorMatt Macy <mmacy@FreeBSD.org>2020-10-13 21:03:36 -0700
committerDan McDonald <danmcd@joyent.com>2022-01-11 11:18:51 -0500
commit2966a4e8bbd82f7bd6a8909e7c10b98f18fe7e84 (patch)
tree585b66b6925176b04f8b5726e04b92b5c0f16444 /usr/src/uts/common/fs
parent1b2ec6d6cf3fc8870f15f0100929dfde15fb32c6 (diff)
downloadillumos-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.c8
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);