/* extent-tree.c */
u32 btrfs_count_snapshots_in_path(struct btrfs_root *root,
struct btrfs_path *count_path,
- u64 first_extent);
+ u64 expected_owner, u64 first_extent);
int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
struct btrfs_root *root);
int btrfs_copy_pinned(struct btrfs_root *root, struct extent_io_tree *copy);
u32 btrfs_count_snapshots_in_path(struct btrfs_root *root,
struct btrfs_path *count_path,
+ u64 expected_owner,
u64 first_extent)
{
struct btrfs_root *extent_root = root->fs_info->extent_root;
struct btrfs_path *path;
u64 bytenr;
u64 found_objectid;
+ u64 found_owner;
u64 root_objectid = root->root_key.objectid;
u32 total_count = 0;
u32 cur_count;
total_count = 2;
goto out;
}
+ if (level == -1) {
+ found_owner = btrfs_ref_objectid(l, ref_item);
+ if (found_owner != expected_owner) {
+ total_count = 2;
+ goto out;
+ }
+ }
total_count = 1;
path->slots[0]++;
}
u64 loops = 0;
u64 total_fs_bytes;
struct btrfs_root *root = BTRFS_I(inode)->root;
+ struct btrfs_block_group_cache *block_group;
struct extent_buffer *leaf;
int found_type;
struct btrfs_path *path;
if (bytenr == 0)
goto not_found;
+ if (btrfs_count_snapshots_in_path(root, path, inode->i_ino,
+ bytenr) != 1) {
+ goto not_found;
+ }
+
/*
* we may be called by the resizer, make sure we're inside
* the limits of the FS
*/
- if (bytenr + extent_num_bytes > total_fs_bytes)
+ block_group = btrfs_lookup_block_group(root->fs_info,
+ bytenr);
+ if (!block_group || block_group->ro)
goto not_found;
- if (btrfs_count_snapshots_in_path(root, path, bytenr) != 1) {
- goto not_found;
- }
start = extent_end;
} else {