|
@@ -6557,6 +6557,7 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
int ret;
|
|
int ret;
|
|
struct extent_buffer *leaf;
|
|
struct extent_buffer *leaf;
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
|
+ struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
|
|
struct btrfs_file_extent_item *fi;
|
|
struct btrfs_file_extent_item *fi;
|
|
struct btrfs_key key;
|
|
struct btrfs_key key;
|
|
u64 disk_bytenr;
|
|
u64 disk_bytenr;
|
|
@@ -6633,6 +6634,20 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
|
|
|
|
if (btrfs_extent_readonly(root, disk_bytenr))
|
|
if (btrfs_extent_readonly(root, disk_bytenr))
|
|
goto out;
|
|
goto out;
|
|
|
|
+
|
|
|
|
+ num_bytes = min(offset + *len, extent_end) - offset;
|
|
|
|
+ if (!nocow && found_type == BTRFS_FILE_EXTENT_PREALLOC) {
|
|
|
|
+ u64 range_end;
|
|
|
|
+
|
|
|
|
+ range_end = round_up(offset + num_bytes, root->sectorsize) - 1;
|
|
|
|
+ ret = test_range_bit(io_tree, offset, range_end,
|
|
|
|
+ EXTENT_DELALLOC, 0, NULL);
|
|
|
|
+ if (ret) {
|
|
|
|
+ ret = -EAGAIN;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
btrfs_release_path(path);
|
|
btrfs_release_path(path);
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -6661,7 +6676,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
|
|
*/
|
|
*/
|
|
disk_bytenr += backref_offset;
|
|
disk_bytenr += backref_offset;
|
|
disk_bytenr += offset - key.offset;
|
|
disk_bytenr += offset - key.offset;
|
|
- num_bytes = min(offset + *len, extent_end) - offset;
|
|
|
|
if (csum_exist_in_range(root, disk_bytenr, num_bytes))
|
|
if (csum_exist_in_range(root, disk_bytenr, num_bytes))
|
|
goto out;
|
|
goto out;
|
|
/*
|
|
/*
|