Destroy ARC buffer in case of fill error
In case of error dmu_buf_fill_done() returns the buffer back into DB_UNCACHED state. Since during transition from DB_UNCACHED into DB_FILL state dbuf_noread() allocates an ARC buffer, we must free it here, otherwise it will be leaked. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Jorgen Lundman <lundman@lundman.net> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15665 Closes #15802 Closes #16216
This commit is contained in:
parent
27cc6df760
commit
ba3c7692cd
|
@ -2834,6 +2834,7 @@ dmu_buf_fill_done(dmu_buf_t *dbuf, dmu_tx_t *tx, boolean_t failed)
|
||||||
failed = B_FALSE;
|
failed = B_FALSE;
|
||||||
} else if (failed) {
|
} else if (failed) {
|
||||||
VERIFY(!dbuf_undirty(db, tx));
|
VERIFY(!dbuf_undirty(db, tx));
|
||||||
|
arc_buf_destroy(db->db_buf, db);
|
||||||
db->db_buf = NULL;
|
db->db_buf = NULL;
|
||||||
dbuf_clear_data(db);
|
dbuf_clear_data(db);
|
||||||
DTRACE_SET_STATE(db, "fill failed");
|
DTRACE_SET_STATE(db, "fill failed");
|
||||||
|
|
Loading…
Reference in New Issue