On Mon, Sep 09, 2019 at 05:28:11PM +0300, Nikolay Borisov wrote: > > This is because btrfs_new_inode() calls new_inode() under the > > transaction. We could probably move the new_inode() outside of this but > > for now just wrap it in memalloc_nofs_save(). > > If I'm understanding correctly what happens here is that symlinking > wants to instantiate a new inode > (new_inode->btrfs_alloc_inode->kmem_cache_alloc with GFP_KERNEL) but it > triggers background reclaim, hence goes to sleep, while holding a > transaction. At the same time background reclaim joins the same > transaction which is now blocked by the symlinking thread, hence it's > prone to deadlock ? Yes, that's the pattern, GFP_KERNEL inside start_transaction/commit_transaction. The more generic fix is in the works.
