On Tue 22-03-16 05:27:08, Matthew Wilcox wrote: > On Tue, Mar 22, 2016 at 10:12:32AM +0100, Jan Kara wrote: > > if (unlikely(!page)) // False since > > // RADIX_TREE_INDIRECT_PTR is set > > if (radix_tree_exception(page)) // False - no exeptional bit > > Oops, you got confused: > > static inline int radix_tree_exception(void *arg) > { > return unlikely((unsigned long)arg & > (RADIX_TREE_INDIRECT_PTR | RADIX_TREE_EXCEPTIONAL_ENTRY)); > } Ah, I've confused radix_tree_exception() and radix_tree_exceptional_entry(). OK, so your code works AFAICT. But using RADIX_TREE_RETRY still doesn't make things clearer to me - you still need to check for INDIRECT bit in the retry logic to catch the radix_tree_extend() race as well... As a side note I think we should do away with radix_tree_exception() - it isn't very useful (doesn't simplify any of its callers) and only creates possibility for confusion. Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html