|
|
@@ -1634,9 +1634,12 @@ xfs_vm_write_begin(
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * On failure, we only need to kill delalloc blocks beyond EOF because they
|
|
|
- * will never be written. For blocks within EOF, generic_write_end() zeros them
|
|
|
- * so they are safe to leave alone and be written with all the other valid data.
|
|
|
+ * On failure, we only need to kill delalloc blocks beyond EOF in the range of
|
|
|
+ * this specific write because they will never be written. Previous writes
|
|
|
+ * beyond EOF where block allocation succeeded do not need to be trashed, so
|
|
|
+ * only new blocks from this write should be trashed. For blocks within
|
|
|
+ * EOF, generic_write_end() zeros them so they are safe to leave alone and be
|
|
|
+ * written with all the other valid data.
|
|
|
*/
|
|
|
STATIC int
|
|
|
xfs_vm_write_end(
|
|
|
@@ -1659,8 +1662,11 @@ xfs_vm_write_end(
|
|
|
loff_t to = pos + len;
|
|
|
|
|
|
if (to > isize) {
|
|
|
- truncate_pagecache(inode, isize);
|
|
|
+ /* only kill blocks in this write beyond EOF */
|
|
|
+ if (pos > isize)
|
|
|
+ isize = pos;
|
|
|
xfs_vm_kill_delalloc_range(inode, isize, to);
|
|
|
+ truncate_pagecache_range(inode, isize, to);
|
|
|
}
|
|
|
}
|
|
|
return ret;
|