]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: convert put_file_data() to folios
authorGoldwyn Rodrigues <rgoldwyn@suse.com>
Tue, 23 Jan 2024 19:28:07 +0000 (13:28 -0600)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 May 2024 19:31:01 +0000 (21:31 +0200)
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>
fs/btrfs/send.c

index 50b4a76ac88eb33b69094d18582f9e3e38efd58b..342fe5ff0f050a2a1ea194abd35e71c8cf550ba3 100644 (file)
@@ -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;