diff mbox series

[4/4] btrfs: page to folio conversion in put_file_data()

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

Commit Message

Goldwyn Rodrigues Jan. 18, 2024, 7:46 p.m. UTC
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(-)

Comments

Boris Burkov Jan. 18, 2024, 9:48 p.m. UTC | #1
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
>
David Sterba Jan. 22, 2024, 8:55 p.m. UTC | #2
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 mbox series

Patch

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;