diff options
| -rw-r--r-- | fs/xfs/xfs_aops.c | 13 |
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; |
