Hi Jon, Jonathan E Brassow wrote: > could this be solved by doing your patch in rh_dec and just moving the > atomic_inc in rh_inc? The reason I ask is that the mark_region log > call can block. No. Unless they are serialized, it's possible that rh_inc() will see the state RH_DIRTY, while rh_dec change it to RH_CLEAN. As a result, the region which has I/O in-flight may be freed. Is it reasonable to call mark_region() unconditionally? Then we can call it outside of the lock. >> CPU0 CPU1 >> >> ----------------------------------------------------------------------- >> ------- >> rh_dec() >> if (atomic_dec_and_test(pending)) >> <the region is still marked dirty> if (atomic_read(pending)==0) >> rh_inc() >> atomic_inc(pending) >> if the region is clean >> mark the region dirty >> and remove from clean list else do nothing >> mark the region clean >> and move to clean list