/* 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 {