Bhaskar,
In the code below, dbuf_find() will return with db_mtx locked which will
prevent dbuf_do_evict() from proceedin as it will block waiting on this
mutex:
dbuf_do_evict(void *private)
{
if (!MUTEX_HELD(&db->db_mtx))
mutex_enter(&db->db_mtx);
Thanks,
George
Bhaskar Sarkar wrote:
> 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
> _______________________________________________
> zfs-code mailing list
> zfs-code at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/zfs-code