|
@@ -1752,6 +1752,7 @@ xfs_vm_write_failed(
|
|
loff_t from = pos & (PAGE_CACHE_SIZE - 1);
|
|
loff_t from = pos & (PAGE_CACHE_SIZE - 1);
|
|
loff_t to = from + len;
|
|
loff_t to = from + len;
|
|
struct buffer_head *bh, *head;
|
|
struct buffer_head *bh, *head;
|
|
|
|
+ struct xfs_mount *mp = XFS_I(inode)->i_mount;
|
|
|
|
|
|
/*
|
|
/*
|
|
* The request pos offset might be 32 or 64 bit, this is all fine
|
|
* The request pos offset might be 32 or 64 bit, this is all fine
|
|
@@ -1786,7 +1787,8 @@ xfs_vm_write_failed(
|
|
if (!buffer_delay(bh))
|
|
if (!buffer_delay(bh))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- if (!buffer_new(bh) && block_offset < i_size_read(inode))
|
|
|
|
|
|
+ if (!xfs_mp_fail_writes(mp) && !buffer_new(bh) &&
|
|
|
|
+ block_offset < i_size_read(inode))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
xfs_vm_kill_delalloc_range(inode, block_offset,
|
|
xfs_vm_kill_delalloc_range(inode, block_offset,
|
|
@@ -1824,6 +1826,7 @@ xfs_vm_write_begin(
|
|
pgoff_t index = pos >> PAGE_CACHE_SHIFT;
|
|
pgoff_t index = pos >> PAGE_CACHE_SHIFT;
|
|
struct page *page;
|
|
struct page *page;
|
|
int status;
|
|
int status;
|
|
|
|
+ struct xfs_mount *mp = XFS_I(mapping->host)->i_mount;
|
|
|
|
|
|
ASSERT(len <= PAGE_CACHE_SIZE);
|
|
ASSERT(len <= PAGE_CACHE_SIZE);
|
|
|
|
|
|
@@ -1832,6 +1835,8 @@ xfs_vm_write_begin(
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
status = __block_write_begin(page, pos, len, xfs_get_blocks);
|
|
status = __block_write_begin(page, pos, len, xfs_get_blocks);
|
|
|
|
+ if (xfs_mp_fail_writes(mp))
|
|
|
|
+ status = -EIO;
|
|
if (unlikely(status)) {
|
|
if (unlikely(status)) {
|
|
struct inode *inode = mapping->host;
|
|
struct inode *inode = mapping->host;
|
|
size_t isize = i_size_read(inode);
|
|
size_t isize = i_size_read(inode);
|
|
@@ -1844,6 +1849,8 @@ xfs_vm_write_begin(
|
|
* allocated in this write, not blocks that were previously
|
|
* allocated in this write, not blocks that were previously
|
|
* written successfully.
|
|
* written successfully.
|
|
*/
|
|
*/
|
|
|
|
+ if (xfs_mp_fail_writes(mp))
|
|
|
|
+ isize = 0;
|
|
if (pos + len > isize) {
|
|
if (pos + len > isize) {
|
|
ssize_t start = max_t(ssize_t, pos, isize);
|
|
ssize_t start = max_t(ssize_t, pos, isize);
|
|
|
|
|