Btrfs: adjust len of writes if following a preallocated extent
If we have |0--hole--4095||4096--preallocate--12287| instead of using preallocated space, a 8K direct write will just create a new 8K extent and it'll end up with |0--new extent--8191||8192--preallocate--12287| It's because we find a hole em and then go to create a new 8K extent directly without adjusting @len. Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Reviewed-by: Chris Mason <clm@fb.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
7b9ea6279b
commit
a23eaa875f
|
@ -7782,10 +7782,12 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
|
|||
}
|
||||
|
||||
/*
|
||||
* this will cow the extent, reset the len in case we changed
|
||||
* it above
|
||||
* this will cow the extent, if em is within [start, len], then
|
||||
* probably we've found a preallocated/existing extent, let's
|
||||
* give it a chance to use preallocated space.
|
||||
*/
|
||||
len = bh_result->b_size;
|
||||
len = min_t(u64, bh_result->b_size, em->len - (start - em->start));
|
||||
len = ALIGN(len, root->sectorsize);
|
||||
free_extent_map(em);
|
||||
em = btrfs_new_extent_direct(inode, start, len);
|
||||
if (IS_ERR(em)) {
|
||||
|
|
Loading…
Reference in New Issue