|
@@ -1609,12 +1609,21 @@ xfs_vm_write_begin(
|
|
|
status = __block_write_begin(page, pos, len, xfs_get_blocks);
|
|
|
if (unlikely(status)) {
|
|
|
struct inode *inode = mapping->host;
|
|
|
+ size_t isize = i_size_read(inode);
|
|
|
|
|
|
xfs_vm_write_failed(inode, page, pos, len);
|
|
|
unlock_page(page);
|
|
|
|
|
|
- if (pos + len > i_size_read(inode))
|
|
|
- truncate_pagecache(inode, i_size_read(inode));
|
|
|
+ /*
|
|
|
+ * If the write is beyond EOF, we only want to kill blocks
|
|
|
+ * allocated in this write, not blocks that were previously
|
|
|
+ * written successfully.
|
|
|
+ */
|
|
|
+ if (pos + len > isize) {
|
|
|
+ ssize_t start = max_t(ssize_t, pos, isize);
|
|
|
+
|
|
|
+ truncate_pagecache_range(inode, start, pos + len);
|
|
|
+ }
|
|
|
|
|
|
page_cache_release(page);
|
|
|
page = NULL;
|