Message ID | 861fb1618d04ccb56c00ac78b4c6ca81dc9a59e4.1705605787.git.rgoldwyn@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/4] btrfs: Use IS_ERR() instead of checking folio for NULL | expand |
On Thu, Jan 18, 2024 at 01:46:40PM -0600, Goldwyn Rodrigues wrote: > From: Goldwyn Rodrigues <rgoldwyn@suse.com> > > Use folio instead of page in put_file_data(). This converts usage of all > page based functions to folio-based. > > Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Reviewed-by: Boris Burkov <boris@bur.io> > --- > fs/btrfs/send.c | 42 +++++++++++++++++++++--------------------- > 1 file changed, 21 insertions(+), 21 deletions(-) > > diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c > index 7902298c1f25..0de3d4163f6b 100644 > --- a/fs/btrfs/send.c > +++ b/fs/btrfs/send.c > @@ -5257,10 +5257,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); > @@ -5273,44 +5274,43 @@ 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), > + 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, > + memcpy_from_folio(sctx->send_buf + sctx->send_size, folio, > pg_offset, cur_len); > - unlock_page(page); > - put_page(page); > + folio_unlock(folio); > + folio_put(folio); > index++; > pg_offset = 0; > len -= cur_len; > -- > 2.43.0 >
On Thu, Jan 18, 2024 at 01:46:40PM -0600, Goldwyn Rodrigues wrote: > From: Goldwyn Rodrigues <rgoldwyn@suse.com> > > Use folio instead of page in put_file_data(). This converts usage of all > page based functions to folio-based. > > Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> > --- > fs/btrfs/send.c | 42 +++++++++++++++++++++--------------------- > 1 file changed, 21 insertions(+), 21 deletions(-) > > diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c > index 7902298c1f25..0de3d4163f6b 100644 > --- a/fs/btrfs/send.c > +++ b/fs/btrfs/send.c > @@ -5257,10 +5257,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); > @@ -5273,44 +5274,43 @@ 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); Same question regarding page cache sync and folios, assertions would be good or an explanation why it's ok like that. IIRC the explicit sync is only in some odd code like defrag that does not go though the MM callbacks so we have to manage things on our own.
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 7902298c1f25..0de3d4163f6b 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -5257,10 +5257,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); @@ -5273,44 +5274,43 @@ 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), + 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, + memcpy_from_folio(sctx->send_buf + sctx->send_size, folio, pg_offset, cur_len); - unlock_page(page); - put_page(page); + folio_unlock(folio); + folio_put(folio); index++; pg_offset = 0; len -= cur_len;