Btrfs: fix EIO on reading file after ioctl clone works on it
For inline data extent, we need to make its length aligned, otherwise, we can get a phantom extent map which confuses readpages() to return -EIO. This can be detected by xfstests/btrfs/035. Reported-by: David Disseldorp <ddiss@suse.de> Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
cfd4a535b6
commit
d3ecfcdf91
@ -3142,6 +3142,8 @@ process_slot:
|
||||
} else if (type == BTRFS_FILE_EXTENT_INLINE) {
|
||||
u64 skip = 0;
|
||||
u64 trim = 0;
|
||||
u64 aligned_end = 0;
|
||||
|
||||
if (off > key.offset) {
|
||||
skip = off - key.offset;
|
||||
new_key.offset += skip;
|
||||
@ -3158,9 +3160,11 @@ process_slot:
|
||||
size -= skip + trim;
|
||||
datal -= skip + trim;
|
||||
|
||||
aligned_end = ALIGN(new_key.offset + datal,
|
||||
root->sectorsize);
|
||||
ret = btrfs_drop_extents(trans, root, inode,
|
||||
new_key.offset,
|
||||
new_key.offset + datal,
|
||||
aligned_end,
|
||||
1);
|
||||
if (ret) {
|
||||
if (ret != -EOPNOTSUPP)
|
||||
|
Loading…
Reference in New Issue
Block a user