Fix regression in dmu_buf_will_fill()

Direct I/O implementation added condition to call dbuf_undirty()
only in case of block cloning.  But the condition is not right if
the block is no longer dirty in this TXG, but still in DB_NOFILL
state.  It resulted in block not reverting to DB_UNCACHED and
following NULL de-reference on attempt to access absent db_data.

While there, add assertions for db_data to make debugging easier.

Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #16829
This commit is contained in:
Alexander Motin
2024-12-02 20:08:40 -05:00
committed by Brian Behlendorf
parent 17cdb7a2b1
commit b17ea73f9d
3 changed files with 11 additions and 2 deletions
+1 -1
View File
@@ -2921,7 +2921,7 @@ dmu_buf_will_fill(dmu_buf_t *db_fake, dmu_tx_t *tx, boolean_t canfail)
* pending clone and mark the block as uncached. This will be
* as if the clone was never done.
*/
if (dr && dr->dt.dl.dr_brtwrite) {
if (db->db_state == DB_NOFILL) {
VERIFY(!dbuf_undirty(db, tx));
db->db_state = DB_UNCACHED;
}