Chris Kirby wrote:
> Neil Perrin wrote:
>>
>> Chris Kirby wrote:
>>> But doesn't the rw_enter code block if there's a waiting
>>> writer?  In other words, can't we cause a deadlock
>>> if we already hold the read lock, there's a waiting writer,
>>> and we try to grab the read lock again?
>>>
>>> -Chris
>>
>>
>> I agree. As a thread, there's no way to determine if I already hold
>> the read lock and regrabbing it can deadlock as you describe.
>> The only options I see are for the callers to grab it or pass
>> down an indication that they have it.
> 
> It looks like there are currently 30 callers of dsl_dataset_open_obj.
> 
> The only callers from open context that don't grab
> the lock are dsl_dataset_create_root and
> dsl_dataset_snapshot_rename_check.
> 
> In sync context, we either have no lock or we have the write lock.
> 
> So if we fix up dsl_dataset_create_root to grab the lock; and
> change dsl_dataset_snapshot_rename_check not to do any work
> unless we're syncing, I think we can say this:
> 
> need_lock = !RW_WRITE_HELD && dsl_pool_sync_context(dp);
> 
> Does that make sense?  It has to be less painful than
> adding an indication that the caller already holds the
> lock.
> 
> -Chris

Makes sense to me. I don't know the rest of the code well
enough to know if this cane be more cleanly or elegantly fixed.

Neil.

Reply via email to