]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: add helpers to get fs_info from page/folio pointers
authorDavid Sterba <dsterba@suse.com>
Thu, 14 Sep 2023 14:24:43 +0000 (16:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:32:29 +0000 (15:32 +0200)
[ Upstream commit b33d2e535f9b2a1c4210cfc4843ac0dbacbeebcc ]

Add convenience helpers to get a fs_info from a page or folio pointer
instead of open coding the chain or using btrfs_sb() that in some cases
does one more pointer hop.  This is implemented as a macro (still with
type checking) so we don't need full definitions of struct page, folio,
btrfs_root and btrfs_fs_info. The latter can't be static inlines as this
would create loop between ctree.h <-> fs.h, or the headers would have to
be restructured.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Stable-dep-of: 86211eea8ae1 ("btrfs: qgroup: validate btrfs_qgroup_inherit parameter")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/compression.c
fs/btrfs/disk-io.c
fs/btrfs/extent_io.c
fs/btrfs/fs.h
fs/btrfs/inode.c
fs/btrfs/lzo.c

index 68345f73d429aa2d4537ef620a0048e61c4eb7a8..aeb3b2aa733101ffefe4dbe7ae696402f017db3c 100644 (file)
@@ -1039,7 +1039,7 @@ static int btrfs_decompress_bio(struct compressed_bio *cb)
 int btrfs_decompress(int type, const u8 *data_in, struct page *dest_page,
                     unsigned long dest_pgoff, size_t srclen, size_t destlen)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(dest_page->mapping->host->i_sb);
+       struct btrfs_fs_info *fs_info = page_to_fs_info(dest_page);
        struct list_head *workspace;
        const u32 sectorsize = fs_info->sectorsize;
        int ret;
index e9eb3f0f245b2305c3c1cdd6def3c95f467d1a2e..6096628fdb21fe73566e95fafa0b581b5e279807 100644 (file)
@@ -534,7 +534,7 @@ static void btree_invalidate_folio(struct folio *folio, size_t offset,
        extent_invalidate_folio(tree, folio, offset);
        btree_release_folio(folio, GFP_NOFS);
        if (folio_get_private(folio)) {
-               btrfs_warn(BTRFS_I(folio->mapping->host)->root->fs_info,
+               btrfs_warn(folio_to_fs_info(folio),
                           "folio private not zero on folio %llu",
                           (unsigned long long)folio_pos(folio));
                folio_detach_private(folio);
index cf94e88bf8d05a894c28a1a9ce15daa8edd94cc2..a6c712429fd2d4fc8fc065ef8541f3151234dccf 100644 (file)
@@ -433,7 +433,7 @@ static bool btrfs_verify_page(struct page *page, u64 start)
 
 static void end_page_read(struct page *page, bool uptodate, u64 start, u32 len)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(page->mapping->host->i_sb);
+       struct btrfs_fs_info *fs_info = page_to_fs_info(page);
        struct folio *folio = page_folio(page);
 
        ASSERT(page_offset(page) <= start &&
@@ -948,7 +948,7 @@ int set_folio_extent_mapped(struct folio *folio)
        if (folio_test_private(folio))
                return 0;
 
-       fs_info = btrfs_sb(folio->mapping->host->i_sb);
+       fs_info = folio_to_fs_info(folio);
 
        if (btrfs_is_subpage(fs_info, folio->mapping))
                return btrfs_attach_subpage(fs_info, folio, BTRFS_SUBPAGE_DATA);
@@ -967,7 +967,7 @@ void clear_page_extent_mapped(struct page *page)
        if (!folio_test_private(folio))
                return;
 
-       fs_info = btrfs_sb(page->mapping->host->i_sb);
+       fs_info = page_to_fs_info(page);
        if (btrfs_is_subpage(fs_info, page->mapping))
                return btrfs_detach_subpage(fs_info, folio);
 
@@ -1770,7 +1770,7 @@ static noinline_for_stack void write_one_eb(struct extent_buffer *eb,
  */
 static int submit_eb_subpage(struct page *page, struct writeback_control *wbc)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(page->mapping->host->i_sb);
+       struct btrfs_fs_info *fs_info = page_to_fs_info(page);
        struct folio *folio = page_folio(page);
        int submitted = 0;
        u64 page_start = page_offset(page);
@@ -1861,7 +1861,7 @@ static int submit_eb_page(struct page *page, struct btrfs_eb_write_context *ctx)
        if (!folio_test_private(folio))
                return 0;
 
-       if (btrfs_sb(page->mapping->host->i_sb)->nodesize < PAGE_SIZE)
+       if (page_to_fs_info(page)->nodesize < PAGE_SIZE)
                return submit_eb_subpage(page, wbc);
 
        spin_lock(&mapping->i_private_lock);
@@ -2313,7 +2313,7 @@ int extent_invalidate_folio(struct extent_io_tree *tree,
        struct extent_state *cached_state = NULL;
        u64 start = folio_pos(folio);
        u64 end = start + folio_size(folio) - 1;
-       size_t blocksize = btrfs_sb(folio->mapping->host->i_sb)->sectorsize;
+       size_t blocksize = folio_to_fs_info(folio)->sectorsize;
 
        /* This function is only called for the btree inode */
        ASSERT(tree->owner == IO_TREE_BTREE_INODE_IO);
@@ -4940,7 +4940,7 @@ out:
 
 static int try_release_subpage_extent_buffer(struct page *page)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(page->mapping->host->i_sb);
+       struct btrfs_fs_info *fs_info = page_to_fs_info(page);
        u64 cur = page_offset(page);
        const u64 end = page_offset(page) + PAGE_SIZE;
        int ret;
@@ -5013,7 +5013,7 @@ int try_release_extent_buffer(struct page *page)
        struct folio *folio = page_folio(page);
        struct extent_buffer *eb;
 
-       if (btrfs_sb(page->mapping->host->i_sb)->nodesize < PAGE_SIZE)
+       if (page_to_fs_info(page)->nodesize < PAGE_SIZE)
                return try_release_subpage_extent_buffer(page);
 
        /*
index 1cfd16f956e77d6f4741637ee270ad1d154d699b..0e15b2a791bf1b83eafa6c6866d3b13552e37399 100644 (file)
@@ -834,6 +834,9 @@ struct btrfs_fs_info {
 #define folio_to_inode(_folio) (BTRFS_I(_Generic((_folio),                     \
                                          struct folio *: (_folio))->mapping->host))
 
+#define page_to_fs_info(_page)  (page_to_inode(_page)->root->fs_info)
+#define folio_to_fs_info(_folio) (folio_to_inode(_folio)->root->fs_info)
+
 static inline u64 btrfs_get_fs_generation(const struct btrfs_fs_info *fs_info)
 {
        return READ_ONCE(fs_info->generation);
index 6948440286e556bbc6b7aa6f425746620ead8776..1e800c8bb4d9f437fb2007f3e5c9b8b9e05be713 100644 (file)
@@ -7903,7 +7903,7 @@ static void btrfs_readahead(struct readahead_control *rac)
  */
 static void wait_subpage_spinlock(struct page *page)
 {
-       struct btrfs_fs_info *fs_info = btrfs_sb(page->mapping->host->i_sb);
+       struct btrfs_fs_info *fs_info = page_to_fs_info(page);
        struct folio *folio = page_folio(page);
        struct btrfs_subpage *subpage;
 
index e43bc0fdc74ec9b0224568928b31e0ca10c77805..110a2c304bdc7a5445e2813c047d8e36f995ea75 100644 (file)
@@ -429,7 +429,7 @@ int lzo_decompress(struct list_head *ws, const u8 *data_in,
                size_t destlen)
 {
        struct workspace *workspace = list_entry(ws, struct workspace, list);
-       struct btrfs_fs_info *fs_info = btrfs_sb(dest_page->mapping->host->i_sb);
+       struct btrfs_fs_info *fs_info = page_to_fs_info(dest_page);
        const u32 sectorsize = fs_info->sectorsize;
        size_t in_len;
        size_t out_len;