mirror of https://gitee.com/openkylin/linux.git
btrfs: move pos increment and pagecache extension to btrfs_buffered_write
While we do this, correct the call to pagecache_isize_extended: - pagecache_isize_extended needs to be called to the start of the write as opposed to i_size - we don't need to check range before the call, this is done in the function Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
4e4cabece9
commit
5e8b9ef303
|
@ -1581,6 +1581,7 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
bool only_release_metadata = false;
|
bool only_release_metadata = false;
|
||||||
bool force_page_uptodate = false;
|
bool force_page_uptodate = false;
|
||||||
|
loff_t old_isize = i_size_read(inode);
|
||||||
|
|
||||||
nrptrs = min(DIV_ROUND_UP(iov_iter_count(i), PAGE_SIZE),
|
nrptrs = min(DIV_ROUND_UP(iov_iter_count(i), PAGE_SIZE),
|
||||||
PAGE_SIZE / (sizeof(struct page *)));
|
PAGE_SIZE / (sizeof(struct page *)));
|
||||||
|
@ -1779,6 +1780,10 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb,
|
||||||
}
|
}
|
||||||
|
|
||||||
extent_changeset_free(data_reserved);
|
extent_changeset_free(data_reserved);
|
||||||
|
if (num_written > 0) {
|
||||||
|
pagecache_isize_extended(inode, old_isize, iocb->ki_pos);
|
||||||
|
iocb->ki_pos += num_written;
|
||||||
|
}
|
||||||
return num_written ? num_written : ret;
|
return num_written ? num_written : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1901,7 +1906,6 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
||||||
loff_t pos;
|
loff_t pos;
|
||||||
size_t count;
|
size_t count;
|
||||||
loff_t oldsize;
|
loff_t oldsize;
|
||||||
int clean_page = 0;
|
|
||||||
|
|
||||||
if (!(iocb->ki_flags & IOCB_DIRECT) &&
|
if (!(iocb->ki_flags & IOCB_DIRECT) &&
|
||||||
(iocb->ki_flags & IOCB_NOWAIT))
|
(iocb->ki_flags & IOCB_NOWAIT))
|
||||||
|
@ -1983,8 +1987,6 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
||||||
inode_unlock(inode);
|
inode_unlock(inode);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (start_pos > round_up(oldsize, fs_info->sectorsize))
|
|
||||||
clean_page = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sync)
|
if (sync)
|
||||||
|
@ -2027,11 +2029,6 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
||||||
current->journal_info = NULL;
|
current->journal_info = NULL;
|
||||||
} else {
|
} else {
|
||||||
num_written = btrfs_buffered_write(iocb, from);
|
num_written = btrfs_buffered_write(iocb, from);
|
||||||
if (num_written > 0)
|
|
||||||
iocb->ki_pos = pos + num_written;
|
|
||||||
if (clean_page)
|
|
||||||
pagecache_isize_extended(inode, oldsize,
|
|
||||||
i_size_read(inode));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inode_unlock(inode);
|
inode_unlock(inode);
|
||||||
|
|
Loading…
Reference in New Issue