diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 2602072ed906..849b8c767efb 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1912,14 +1912,20 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, extent_item_objectid); if (!search_commit_root) { - trans = btrfs_join_transaction(fs_info->extent_root); - if (IS_ERR(trans)) - return PTR_ERR(trans); - btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem); - } else { - down_read(&fs_info->commit_root_sem); + trans = btrfs_attach_transaction(fs_info->extent_root); + if (IS_ERR(trans)) { + if (PTR_ERR(trans) != -ENOENT && + PTR_ERR(trans) != -EROFS) + return PTR_ERR(trans); + trans = NULL; + } } + if (trans) + btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem); + else + down_read(&fs_info->commit_root_sem); + ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid, tree_mod_seq_elem.seq, &refs, &extent_item_pos, ignore_offset); @@ -1951,7 +1957,7 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, free_leaf_list(refs); out: - if (!search_commit_root) { + if (trans) { btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem); btrfs_end_transaction(trans); } else {