diff options
Diffstat (limited to 'fs/btrfs/root-tree.c')
| -rw-r--r-- | fs/btrfs/root-tree.c | 23 | 
1 files changed, 20 insertions, 3 deletions
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index 67fa2d29d66..b91ccd97264 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c @@ -259,6 +259,8 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)  	struct extent_buffer *leaf;  	struct btrfs_path *path;  	struct btrfs_key key; +	struct btrfs_key root_key; +	struct btrfs_root *root;  	int err = 0;  	int ret; @@ -270,6 +272,9 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)  	key.type = BTRFS_ORPHAN_ITEM_KEY;  	key.offset = 0; +	root_key.type = BTRFS_ROOT_ITEM_KEY; +	root_key.offset = (u64)-1; +  	while (1) {  		ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0);  		if (ret < 0) { @@ -294,13 +299,25 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)  		    key.type != BTRFS_ORPHAN_ITEM_KEY)  			break; -		ret = btrfs_find_dead_roots(tree_root, key.offset); -		if (ret) { +		root_key.objectid = key.offset; +		key.offset++; + +		root = btrfs_read_fs_root_no_name(tree_root->fs_info, +						  &root_key); +		if (!IS_ERR(root)) +			continue; + +		ret = PTR_ERR(root); +		if (ret != -ENOENT) {  			err = ret;  			break;  		} -		key.offset++; +		ret = btrfs_find_dead_roots(tree_root, root_key.objectid); +		if (ret) { +			err = ret; +			break; +		}  	}  	btrfs_free_path(path);  |