|
@@ -1778,6 +1778,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
|
|
ssize_t err;
|
|
|
loff_t pos;
|
|
|
size_t count;
|
|
|
+ loff_t oldsize;
|
|
|
+ int clean_page = 0;
|
|
|
|
|
|
mutex_lock(&inode->i_mutex);
|
|
|
err = generic_write_checks(iocb, from);
|
|
@@ -1816,14 +1818,17 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
|
|
pos = iocb->ki_pos;
|
|
|
count = iov_iter_count(from);
|
|
|
start_pos = round_down(pos, root->sectorsize);
|
|
|
- if (start_pos > i_size_read(inode)) {
|
|
|
+ oldsize = i_size_read(inode);
|
|
|
+ if (start_pos > oldsize) {
|
|
|
/* Expand hole size to cover write data, preventing empty gap */
|
|
|
end_pos = round_up(pos + count, root->sectorsize);
|
|
|
- err = btrfs_cont_expand(inode, i_size_read(inode), end_pos);
|
|
|
+ err = btrfs_cont_expand(inode, oldsize, end_pos);
|
|
|
if (err) {
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
goto out;
|
|
|
}
|
|
|
+ if (start_pos > round_up(oldsize, root->sectorsize))
|
|
|
+ clean_page = 1;
|
|
|
}
|
|
|
|
|
|
if (sync)
|
|
@@ -1835,6 +1840,9 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
|
|
num_written = __btrfs_buffered_write(file, from, pos);
|
|
|
if (num_written > 0)
|
|
|
iocb->ki_pos = pos + num_written;
|
|
|
+ if (clean_page)
|
|
|
+ pagecache_isize_extended(inode, oldsize,
|
|
|
+ i_size_read(inode));
|
|
|
}
|
|
|
|
|
|
mutex_unlock(&inode->i_mutex);
|