Hello,
Looking at the arc_buf_destroy code, I am wondering: before an arc buf record
gets freed (deallocated) why not set the the associated dmu_buf_impl_t
record''s pointer to NULL?
dmu_buf_impl_t *db = buf->b_private;
DBUF_VERIFY(db);
db->db_buf = NULL;
The objective is ro prevent a dangling pointer. The simplest
way to do this : zero the pointer just before the "pointed to"
object gets torn down. Is there a reason not to do this here?
I see that the arc_buf''s b_evict callback (dbuf_do_evict) is
responsible for cleaning up this pointer, so it all should get correctly
sorted out. I am not sure it always does.
b_efunc is set in 2 places, from dbuf_write_done and dbuf_set _data.
dbuf_set_data will always set db_buf pointer, but will not
necessarily set the set b_efunc.
If the arc_buf_t is in evicted state, we will have no b_efunc, but we end up
with a db_buf pointer. This will not get cleaned up when the arc_buf is
subsequently destroyed.
This may cause a crash, or random memory scribble when file pages are faulted
in (in dbuf_hold_impl when ->db_buf is taken as valid if not null) .
I probably missed something obvious.
--
This message posted from opensolaris.org