|
@@ -5368,8 +5368,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
loff_t new_size;
|
|
|
int ret;
|
|
|
|
|
|
- BUG_ON(offset + len > i_size_read(inode));
|
|
|
-
|
|
|
/* Collapse range works only on fs block size aligned offsets. */
|
|
|
if (offset & (EXT4_BLOCK_SIZE(sb) - 1) ||
|
|
|
len & (EXT4_BLOCK_SIZE(sb) - 1))
|
|
@@ -5398,6 +5396,15 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
/* Take mutex lock */
|
|
|
mutex_lock(&inode->i_mutex);
|
|
|
|
|
|
+ /*
|
|
|
+ * There is no need to overlap collapse range with EOF, in which case
|
|
|
+ * it is effectively a truncate operation
|
|
|
+ */
|
|
|
+ if (offset + len >= i_size_read(inode)) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out_mutex;
|
|
|
+ }
|
|
|
+
|
|
|
if (IS_SWAPFILE(inode)) {
|
|
|
ret = -ETXTBSY;
|
|
|
goto out_mutex;
|