btrfs: convert put_file_data() to folios
Use folio instead of page in put_file_data(). Add a warning in case higher order folio is found, this will be implemented in the future. 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
a16c2c48f4
commit
01b69bf990
@ -5274,10 +5274,11 @@ static int put_file_data(struct send_ctx *sctx, u64 offset, u32 len)
|
||||
{
|
||||
struct btrfs_root *root = sctx->send_root;
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
struct page *page;
|
||||
struct folio *folio;
|
||||
pgoff_t index = offset >> PAGE_SHIFT;
|
||||
pgoff_t last_index;
|
||||
unsigned pg_offset = offset_in_page(offset);
|
||||
struct address_space *mapping = sctx->cur_inode->i_mapping;
|
||||
int ret;
|
||||
|
||||
ret = put_data_header(sctx, len);
|
||||
@ -5290,44 +5291,44 @@ static int put_file_data(struct send_ctx *sctx, u64 offset, u32 len)
|
||||
unsigned cur_len = min_t(unsigned, len,
|
||||
PAGE_SIZE - pg_offset);
|
||||
|
||||
page = find_lock_page(sctx->cur_inode->i_mapping, index);
|
||||
if (!page) {
|
||||
page_cache_sync_readahead(sctx->cur_inode->i_mapping,
|
||||
folio = filemap_lock_folio(mapping, index);
|
||||
if (IS_ERR(folio)) {
|
||||
page_cache_sync_readahead(mapping,
|
||||
&sctx->ra, NULL, index,
|
||||
last_index + 1 - index);
|
||||
|
||||
page = find_or_create_page(sctx->cur_inode->i_mapping,
|
||||
index, GFP_KERNEL);
|
||||
if (!page) {
|
||||
ret = -ENOMEM;
|
||||
folio = filemap_grab_folio(mapping, index);
|
||||
if (IS_ERR(folio)) {
|
||||
ret = PTR_ERR(folio);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (PageReadahead(page))
|
||||
page_cache_async_readahead(sctx->cur_inode->i_mapping,
|
||||
&sctx->ra, NULL, page_folio(page),
|
||||
WARN_ON(folio_order(folio));
|
||||
|
||||
if (folio_test_readahead(folio))
|
||||
page_cache_async_readahead(mapping, &sctx->ra, NULL, folio,
|
||||
index, last_index + 1 - index);
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
btrfs_read_folio(NULL, page_folio(page));
|
||||
lock_page(page);
|
||||
if (!PageUptodate(page)) {
|
||||
unlock_page(page);
|
||||
if (!folio_test_uptodate(folio)) {
|
||||
btrfs_read_folio(NULL, folio);
|
||||
folio_lock(folio);
|
||||
if (!folio_test_uptodate(folio)) {
|
||||
folio_unlock(folio);
|
||||
btrfs_err(fs_info,
|
||||
"send: IO error at offset %llu for inode %llu root %llu",
|
||||
page_offset(page), sctx->cur_ino,
|
||||
folio_pos(folio), sctx->cur_ino,
|
||||
sctx->send_root->root_key.objectid);
|
||||
put_page(page);
|
||||
folio_put(folio);
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy_from_page(sctx->send_buf + sctx->send_size, page,
|
||||
pg_offset, cur_len);
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
memcpy_from_folio(sctx->send_buf + sctx->send_size, folio,
|
||||
pg_offset, cur_len);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
index++;
|
||||
pg_offset = 0;
|
||||
len -= cur_len;
|
||||
|
Loading…
x
Reference in New Issue
Block a user