Hi, Can a dbuf be in DB_CACHED state, db_holds == 0, b_efunc != NULL while its db_buf is put on the eviction list ? From an ASSERT in dbuf_do_evict(), it appears that it can. If it can, I am wondering what is preventing the following race
dbuf_hold_impl() db = dbuf_find(dn, level, blkid); ... if (db->db_buf && refcount_is_zero(&db->db_holds)) { arc_buf_add_ref(db->db_buf, db); /* * The above just returns as db_buf is on the * eviction list. Now, suppose arc_do_user_evicts() * selects this buf and calls dbuf_do_evict(). * Nothing really stops this function. * * Now there is a race between dbuf_do_evict() and * the following code */ if (db->db_buf->b_data == NULL) { .... .... } Sorry if I overlooked something that is very obvious. Thanks Bhaskar