aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_aops.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 282c726d04d0..5f296934879f 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -1609,12 +1609,21 @@ xfs_vm_write_begin(
1609 status = __block_write_begin(page, pos, len, xfs_get_blocks); 1609 status = __block_write_begin(page, pos, len, xfs_get_blocks);
1610 if (unlikely(status)) { 1610 if (unlikely(status)) {
1611 struct inode *inode = mapping->host; 1611 struct inode *inode = mapping->host;
1612 size_t isize = i_size_read(inode);
1612 1613
1613 xfs_vm_write_failed(inode, page, pos, len); 1614 xfs_vm_write_failed(inode, page, pos, len);
1614 unlock_page(page); 1615 unlock_page(page);
1615 1616
1616 if (pos + len > i_size_read(inode)) 1617 /*
1617 truncate_pagecache(inode, i_size_read(inode)); 1618 * If the write is beyond EOF, we only want to kill blocks
1619 * allocated in this write, not blocks that were previously
1620 * written successfully.
1621 */
1622 if (pos + len > isize) {
1623 ssize_t start = max_t(ssize_t, pos, isize);
1624
1625 truncate_pagecache_range(inode, start, pos + len);
1626 }
1618 1627
1619 page_cache_release(page); 1628 page_cache_release(page);
1620 page = NULL; 1629 page = NULL;