diff options
author | Matthew Macy <[email protected]> | 2020-12-12 16:00:00 -0800 |
---|---|---|
committer | GitHub <[email protected]> | 2020-12-12 16:00:00 -0800 |
commit | 923d730329290c7dc8ae5b4d27c6ed01d24d9f4c (patch) | |
tree | 2e285cd70b66efb49072dfb7f3167e75617b3717 /module/zfs/arc.c | |
parent | c76a40bfdaedd1eb2c037dfdf822ea5c4db97397 (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.c | 7 |
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; |