summaryrefslogtreecommitdiffstats
path: root/module/zfs/arc.c
diff options
context:
space:
mode:
authorMatthew Macy <[email protected]>2020-12-12 16:00:00 -0800
committerGitHub <[email protected]>2020-12-12 16:00:00 -0800
commit923d730329290c7dc8ae5b4d27c6ed01d24d9f4c (patch)
tree2e285cd70b66efb49072dfb7f3167e75617b3717 /module/zfs/arc.c
parentc76a40bfdaedd1eb2c037dfdf822ea5c4db97397 (diff)
dmu_zfetch: fix memory leak
The last change caused the read completion callback to not be called if the IO was still in progress. This change restores allocation of the arc buf callback, but in the callback path checks the new acb_nobuf field to know to skip buffer allocation. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Matt Macy <[email protected]> Closes #11324
Diffstat (limited to 'module/zfs/arc.c')
-rw-r--r--module/zfs/arc.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
index 1bc27391c..8519eda30 100644
--- a/module/zfs/arc.c
+++ b/module/zfs/arc.c
@@ -5759,7 +5759,7 @@ arc_read_done(zio_t *zio)
*/
int callback_cnt = 0;
for (acb = callback_list; acb != NULL; acb = acb->acb_next) {
- if (!acb->acb_done)
+ if (!acb->acb_done || acb->acb_nobuf)
continue;
callback_cnt++;
@@ -5999,7 +5999,7 @@ top:
}
ASSERT(*arc_flags & ARC_FLAG_NOWAIT);
- if (done && !no_buf) {
+ if (done) {
arc_callback_t *acb = NULL;
acb = kmem_zalloc(sizeof (arc_callback_t),
@@ -6009,6 +6009,7 @@ top:
acb->acb_compressed = compressed_read;
acb->acb_encrypted = encrypted_read;
acb->acb_noauth = noauth_read;
+ acb->acb_nobuf = no_buf;
acb->acb_zb = *zb;
if (pio != NULL)
acb->acb_zio_dummy = zio_null(pio,
@@ -6018,8 +6019,6 @@ top:
acb->acb_zio_head = head_zio;
acb->acb_next = hdr->b_l1hdr.b_acb;
hdr->b_l1hdr.b_acb = acb;
- mutex_exit(hash_lock);
- goto out;
}
mutex_exit(hash_lock);
goto out;