diff options
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r-- | fs/ext4/extents.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index d74e08029643..e003a1e81dc3 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -377,7 +377,7 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) | |||
377 | ext4_lblk_t lblock = le32_to_cpu(ext->ee_block); | 377 | ext4_lblk_t lblock = le32_to_cpu(ext->ee_block); |
378 | ext4_lblk_t last = lblock + len - 1; | 378 | ext4_lblk_t last = lblock + len - 1; |
379 | 379 | ||
380 | if (lblock > last) | 380 | if (len == 0 || lblock > last) |
381 | return 0; | 381 | return 0; |
382 | return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len); | 382 | return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len); |
383 | } | 383 | } |
@@ -5396,6 +5396,14 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
5396 | loff_t new_size, ioffset; | 5396 | loff_t new_size, ioffset; |
5397 | int ret; | 5397 | int ret; |
5398 | 5398 | ||
5399 | /* | ||
5400 | * We need to test this early because xfstests assumes that a | ||
5401 | * collapse range of (0, 1) will return EOPNOTSUPP if the file | ||
5402 | * system does not support collapse range. | ||
5403 | */ | ||
5404 | if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) | ||
5405 | return -EOPNOTSUPP; | ||
5406 | |||
5399 | /* Collapse range works only on fs block size aligned offsets. */ | 5407 | /* Collapse range works only on fs block size aligned offsets. */ |
5400 | if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) || | 5408 | if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) || |
5401 | len & (EXT4_CLUSTER_SIZE(sb) - 1)) | 5409 | len & (EXT4_CLUSTER_SIZE(sb) - 1)) |