From 5e7f3ace5807f950f3529361e03970101e61aa44 Mon Sep 17 00:00:00 2001 From: Tom Caputi Date: Tue, 15 Jan 2019 15:23:40 -0500 Subject: [PATCH] Fix zio leak in dbuf_read() Currently, dbuf_read() may decide to create a zio_root which is used as a parent for any child zios created in dbuf_read_impl(). However, if there is an error in dbuf_read_impl(), this zio is never executed and ends up leaked. This patch simply ensures that we always execute the root zio, even i it has no real work to do. Reviewed-by: Matt Ahrens Reviewed-by: Brian Behlendorf Signed-off-by: Tom Caputi Closes #8267 --- module/zfs/dbuf.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c index a22fbdc11..826934b36 100644 --- a/module/zfs/dbuf.c +++ b/module/zfs/dbuf.c @@ -1565,8 +1565,17 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags) DB_DNODE_EXIT(db); DBUF_STAT_BUMP(hash_misses); - if (!err && need_wait) - err = zio_wait(zio); + /* + * If we created a zio_root we must execute it to avoid + * leaking it, even if it isn't attached to any work due + * to an error in dbuf_read_impl(). + */ + if (need_wait) { + if (err == 0) + err = zio_wait(zio); + else + VERIFY0(zio_wait(zio)); + } } else { /* * Another reader came in while the dbuf was in flight -- 2.39.2