Assuming thread 1 (may be VFS want to release the page) wants to release a CLEAN page and thus the eb attaching the page. and thread 2 wants to access the eb and cow the eb. Thread 1 Thread 2 btree_releasepage try_release_extent_buffer release_extent_buffer ->if (atomic_dec_and_test(&eb->refs)) { ->spin_unlock(&eb->refs_lock); -------switch to thread 2 here------ read_block_for_search btrfs_find_tree_block radix_tree_lookup && atomic_inc_not_zero ................ btrfs_mark_buffer_dirty(eb) ---------switch to thread 1 here ------ - >spin_lock(&tree->buffer_lock); ->radix_tree_delete(&tree->buffer, eb->start >> PAGE_CACHE_SHIFT); ->spin_unlock(&tree->buffer_lock); -->btrfs_release_extent_buffer_page -->trigger BUG_ON(extent_buffer_under_io(eb))!!!! This is because Thread 2 can still find the eb while thread 1 has dec the eb->refs to 0, so eventually trigger the BUG_ON. I have triggered the BUG_ON while testing btrfs, but I am not sure if the bug-on is rise by my guess above. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html