mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
btrfs: add helpers to get fs_info from page/folio pointers
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>
This commit is contained in:
parent
c8293894af
commit
b33d2e535f
@ -1036,7 +1036,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;
|
||||
|
@ -533,7 +533,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);
|
||||
|
@ -432,7 +432,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 &&
|
||||
@ -940,7 +940,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);
|
||||
@ -959,7 +959,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);
|
||||
|
||||
@ -1760,7 +1760,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);
|
||||
@ -1851,7 +1851,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);
|
||||
@ -2303,7 +2303,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);
|
||||
@ -4833,7 +4833,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;
|
||||
@ -4906,7 +4906,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);
|
||||
|
||||
/*
|
||||
|
@ -836,6 +836,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);
|
||||
|
@ -7904,7 +7904,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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user