|
|
@@ -5395,7 +5395,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
ext4_lblk_t punch_start, punch_stop;
|
|
|
handle_t *handle;
|
|
|
unsigned int credits;
|
|
|
- loff_t new_size;
|
|
|
+ loff_t new_size, ioffset;
|
|
|
int ret;
|
|
|
|
|
|
/* Collapse range works only on fs block size aligned offsets. */
|
|
|
@@ -5418,8 +5418,15 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Need to round down offset to be aligned with page size boundary
|
|
|
+ * for page size > block size.
|
|
|
+ */
|
|
|
+ ioffset = round_down(offset, PAGE_SIZE);
|
|
|
+
|
|
|
/* Write out all dirty pages */
|
|
|
- ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
|
|
|
+ ret = filemap_write_and_wait_range(inode->i_mapping, ioffset,
|
|
|
+ LLONG_MAX);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
@@ -5441,7 +5448,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
goto out_mutex;
|
|
|
}
|
|
|
|
|
|
- truncate_pagecache(inode, offset);
|
|
|
+ truncate_pagecache(inode, ioffset);
|
|
|
|
|
|
/* Wait for existing dio to complete */
|
|
|
ext4_inode_block_unlocked_dio(inode);
|