diff options
author | Tom Caputi <[email protected]> | 2019-01-17 18:47:08 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2019-01-17 15:47:08 -0800 |
commit | 305781da4bbe11acef8707894d7e33f8aef3ca8e (patch) | |
tree | 3ac436d2d8c1fe88daee63964e838bdab9f63cd2 /module/zfs/dbuf.c | |
parent | 75058f33034d23801818582996d3dc941c545910 (diff) |
Fix error handling incallers of dbuf_hold_level()
Currently, the functions dbuf_prefetch_indirect_done() and
dmu_assign_arcbuf_by_dnode() assume that dbuf_hold_level() cannot
fail. In the event of an error the former will cause a NULL pointer
dereference and the later will trigger a VERIFY. This patch adds
error handling to these functions and their callers where necessary.
Reviewed by: Matt Ahrens <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #8291
Diffstat (limited to 'module/zfs/dbuf.c')
-rw-r--r-- | module/zfs/dbuf.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c index 826934b36..9f3c9bfd5 100644 --- a/module/zfs/dbuf.c +++ b/module/zfs/dbuf.c @@ -2886,6 +2886,12 @@ dbuf_prefetch_indirect_done(zio_t *zio, const zbookmark_phys_t *zb, dpa->dpa_zb.zb_level)); dmu_buf_impl_t *db = dbuf_hold_level(dpa->dpa_dnode, dpa->dpa_curlevel, curblkid, FTAG); + if (db == NULL) { + kmem_free(dpa, sizeof (*dpa)); + arc_buf_destroy(abuf, private); + return; + } + (void) dbuf_read(db, NULL, DB_RF_MUST_SUCCEED | DB_RF_NOPREFETCH | DB_RF_HAVESTRUCT); dbuf_rele(db, FTAG); |