|
@@ -6503,6 +6503,7 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
|
int slot;
|
|
|
int found_type;
|
|
|
bool nocow = (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW);
|
|
|
+
|
|
|
path = btrfs_alloc_path();
|
|
|
if (!path)
|
|
|
return -ENOMEM;
|
|
@@ -6546,6 +6547,10 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
|
if (!nocow && found_type == BTRFS_FILE_EXTENT_REG)
|
|
|
goto out;
|
|
|
|
|
|
+ extent_end = key.offset + btrfs_file_extent_num_bytes(leaf, fi);
|
|
|
+ if (extent_end <= offset)
|
|
|
+ goto out;
|
|
|
+
|
|
|
disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
|
|
|
if (disk_bytenr == 0)
|
|
|
goto out;
|
|
@@ -6563,8 +6568,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
|
*ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
|
|
|
}
|
|
|
|
|
|
- extent_end = key.offset + btrfs_file_extent_num_bytes(leaf, fi);
|
|
|
-
|
|
|
if (btrfs_extent_readonly(root, disk_bytenr))
|
|
|
goto out;
|
|
|
btrfs_release_path(path);
|