Print this page
3469 dbuf_read_impl shows too much enthusiasm
Reviewed by: Dan McDonald <danmcd@omniti.com>
*** 639,650 ****
ASSERT3U(bonuslen, <=, db->db.db_size);
db->db.db_data = zio_buf_alloc(DN_MAX_BONUSLEN);
arc_space_consume(DN_MAX_BONUSLEN, ARC_SPACE_OTHER);
if (bonuslen < DN_MAX_BONUSLEN)
bzero(db->db.db_data, DN_MAX_BONUSLEN);
! if (bonuslen)
! bcopy(DN_BONUS(dn->dn_phys), db->db.db_data, bonuslen);
DB_DNODE_EXIT(db);
db->db_state = DB_CACHED;
mutex_exit(&db->db_mtx);
return;
}
--- 639,667 ----
ASSERT3U(bonuslen, <=, db->db.db_size);
db->db.db_data = zio_buf_alloc(DN_MAX_BONUSLEN);
arc_space_consume(DN_MAX_BONUSLEN, ARC_SPACE_OTHER);
if (bonuslen < DN_MAX_BONUSLEN)
bzero(db->db.db_data, DN_MAX_BONUSLEN);
! if (bonuslen) {
! /*
! * Absent byzantine on-disk corruption, we fully expect
! * our bonuslen to be no more than DN_MAX_BONUSLEN --
! * but we nonetheless explicitly clamp it on the
! * bcopy() to prevent any on-disk corruption from
! * becoming rampant in-kernel corruption.
! */
! if (bonuslen > DN_MAX_BONUSLEN) {
! DTRACE_PROBE3(dbuf__read__impl__toolong, int,
! bonuslen, dnode_t *, dn, dmu_buf_impl_t *,
! db);
! bcopy(DN_BONUS(dn->dn_phys), db->db.db_data,
! DN_MAX_BONUSLEN);
! } else {
! bcopy(DN_BONUS(dn->dn_phys), db->db.db_data,
! bonuslen);
! }
! }
DB_DNODE_EXIT(db);
db->db_state = DB_CACHED;
mutex_exit(&db->db_mtx);
return;
}