]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commit
btrfs: fix race with relocation recovery and fs_root setup
authorJeff Mahoney <jeffm@suse.com>
Wed, 17 May 2017 15:38:34 +0000 (11:38 -0400)
committerSeth Forshee <seth.forshee@canonical.com>
Mon, 19 Jun 2017 14:10:21 +0000 (09:10 -0500)
commitb9c0322654c8427b5fbe079a207fdd236921a27a
treea38f4fd8c538255ddee16e1050e5e2e1500881bb
parentefe33f101bd33cf25bc3f8e8ba80e72dd2a8299e
btrfs: fix race with relocation recovery and fs_root setup

BugLink: http://bugs.launchpad.net/bugs/1697955
commit a9b3311ef36b670909ea4443f306c8318082c8f0 upstream.

If we have to recover relocation during mount, we'll ultimately have to
evict the orphan inode.  That goes through the reservation dance, where
priority_reclaim_metadata_space and flush_space expect fs_info->fs_root
to be valid.  That's the next thing to be set up during mount, so we
crash, almost always in flush_space trying to join the transaction
but priority_reclaim_metadata_space is possible as well.  This call
path has been problematic in the past WRT whether ->fs_root is valid
yet.  Commit 957780eb278 (Btrfs: introduce ticketed enospc
infrastructure) added new users that are called in the direct path
instead of the async path that had already been worked around.

The thing is that we don't actually need the fs_root, specifically, for
anything.  We either use it to determine whether the root is the
chunk_root for use in choosing an allocation profile or as a root to pass
btrfs_join_transaction before immediately committing it.  Anything that
isn't the chunk root works in the former case and any root works in
the latter.

A simple fix is to use a root we know will always be there: the
extent_root.

Fixes: 957780eb278 (Btrfs: introduce ticketed enospc infrastructure)
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
fs/btrfs/extent-tree.c