diff options
-rw-r--r-- | fs/btrfs/inode.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8e45fdcdbd8e..ffb23e506762 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -6503,6 +6503,7 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, | |||
6503 | int slot; | 6503 | int slot; |
6504 | int found_type; | 6504 | int found_type; |
6505 | bool nocow = (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW); | 6505 | bool nocow = (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW); |
6506 | |||
6506 | path = btrfs_alloc_path(); | 6507 | path = btrfs_alloc_path(); |
6507 | if (!path) | 6508 | if (!path) |
6508 | return -ENOMEM; | 6509 | return -ENOMEM; |
@@ -6546,6 +6547,10 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, | |||
6546 | if (!nocow && found_type == BTRFS_FILE_EXTENT_REG) | 6547 | if (!nocow && found_type == BTRFS_FILE_EXTENT_REG) |
6547 | goto out; | 6548 | goto out; |
6548 | 6549 | ||
6550 | extent_end = key.offset + btrfs_file_extent_num_bytes(leaf, fi); | ||
6551 | if (extent_end <= offset) | ||
6552 | goto out; | ||
6553 | |||
6549 | disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi); | 6554 | disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi); |
6550 | if (disk_bytenr == 0) | 6555 | if (disk_bytenr == 0) |
6551 | goto out; | 6556 | goto out; |
@@ -6563,8 +6568,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, | |||
6563 | *ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi); | 6568 | *ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi); |
6564 | } | 6569 | } |
6565 | 6570 | ||
6566 | extent_end = key.offset + btrfs_file_extent_num_bytes(leaf, fi); | ||
6567 | |||
6568 | if (btrfs_extent_readonly(root, disk_bytenr)) | 6571 | if (btrfs_extent_readonly(root, disk_bytenr)) |
6569 | goto out; | 6572 | goto out; |
6570 | btrfs_release_path(path); | 6573 | btrfs_release_path(path); |