f2fs: Add folio counterparts to page_private_flags functions

Name these new functions folio_test_f2fs_*(), folio_set_f2fs_*() and
folio_clear_f2fs_*().  Convert all callers which currently have a folio
and cast back to a page.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2025-07-08 18:03:35 +01:00 committed by Jaegeuk Kim
parent a5f3be6e65
commit 4ecaf580ee
8 changed files with 50 additions and 22 deletions

View File

@ -485,7 +485,7 @@ static bool f2fs_dirty_meta_folio(struct address_space *mapping,
folio_mark_uptodate(folio); folio_mark_uptodate(folio);
if (filemap_dirty_folio(mapping, folio)) { if (filemap_dirty_folio(mapping, folio)) {
inc_page_count(F2FS_M_SB(mapping), F2FS_DIRTY_META); inc_page_count(F2FS_M_SB(mapping), F2FS_DIRTY_META);
set_page_private_reference(&folio->page); folio_set_f2fs_reference(folio);
return true; return true;
} }
return false; return false;
@ -1045,7 +1045,7 @@ void f2fs_update_dirty_folio(struct inode *inode, struct folio *folio)
inode_inc_dirty_pages(inode); inode_inc_dirty_pages(inode);
spin_unlock(&sbi->inode_lock[type]); spin_unlock(&sbi->inode_lock[type]);
set_page_private_reference(&folio->page); folio_set_f2fs_reference(folio);
} }
void f2fs_remove_dirty_inode(struct inode *inode) void f2fs_remove_dirty_inode(struct inode *inode)

View File

@ -360,7 +360,7 @@ static void f2fs_write_end_io(struct bio *bio)
dec_page_count(sbi, type); dec_page_count(sbi, type);
if (f2fs_in_warm_node_list(sbi, folio)) if (f2fs_in_warm_node_list(sbi, folio))
f2fs_del_fsync_node_entry(sbi, folio); f2fs_del_fsync_node_entry(sbi, folio);
clear_page_private_gcing(&folio->page); folio_clear_f2fs_gcing(folio);
folio_end_writeback(folio); folio_end_writeback(folio);
} }
if (!get_pages(sbi, F2FS_WB_CP_DATA) && if (!get_pages(sbi, F2FS_WB_CP_DATA) &&
@ -2659,7 +2659,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
/* Use COW inode to make dnode_of_data for atomic write */ /* Use COW inode to make dnode_of_data for atomic write */
atomic_commit = f2fs_is_atomic_file(inode) && atomic_commit = f2fs_is_atomic_file(inode) &&
page_private_atomic(folio_page(folio, 0)); folio_test_f2fs_atomic(folio);
if (atomic_commit) if (atomic_commit)
set_new_dnode(&dn, F2FS_I(inode)->cow_inode, NULL, NULL, 0); set_new_dnode(&dn, F2FS_I(inode)->cow_inode, NULL, NULL, 0);
else else
@ -2690,7 +2690,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
/* This page is already truncated */ /* This page is already truncated */
if (fio->old_blkaddr == NULL_ADDR) { if (fio->old_blkaddr == NULL_ADDR) {
folio_clear_uptodate(folio); folio_clear_uptodate(folio);
clear_page_private_gcing(folio_page(folio, 0)); folio_clear_f2fs_gcing(folio);
goto out_writepage; goto out_writepage;
} }
got_it: got_it:
@ -2760,7 +2760,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
trace_f2fs_do_write_data_page(folio, OPU); trace_f2fs_do_write_data_page(folio, OPU);
set_inode_flag(inode, FI_APPEND_WRITE); set_inode_flag(inode, FI_APPEND_WRITE);
if (atomic_commit) if (atomic_commit)
clear_page_private_atomic(folio_page(folio, 0)); folio_clear_f2fs_atomic(folio);
out_writepage: out_writepage:
f2fs_put_dnode(&dn); f2fs_put_dnode(&dn);
out: out:
@ -3383,7 +3383,7 @@ static int prepare_write_begin(struct f2fs_sb_info *sbi,
f2fs_do_read_inline_data(folio, ifolio); f2fs_do_read_inline_data(folio, ifolio);
set_inode_flag(inode, FI_DATA_EXIST); set_inode_flag(inode, FI_DATA_EXIST);
if (inode->i_nlink) if (inode->i_nlink)
set_page_private_inline(&ifolio->page); folio_set_f2fs_inline(ifolio);
goto out; goto out;
} }
err = f2fs_convert_inline_folio(&dn, folio); err = f2fs_convert_inline_folio(&dn, folio);
@ -3703,7 +3703,7 @@ static int f2fs_write_end(struct file *file,
folio_mark_dirty(folio); folio_mark_dirty(folio);
if (f2fs_is_atomic_file(inode)) if (f2fs_is_atomic_file(inode))
set_page_private_atomic(folio_page(folio, 0)); folio_set_f2fs_atomic(folio);
if (pos + copied > i_size_read(inode) && if (pos + copied > i_size_read(inode) &&
!f2fs_verity_in_progress(inode)) { !f2fs_verity_in_progress(inode)) {

View File

@ -2461,6 +2461,13 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi,
} }
#define PAGE_PRIVATE_GET_FUNC(name, flagname) \ #define PAGE_PRIVATE_GET_FUNC(name, flagname) \
static inline bool folio_test_f2fs_##name(const struct folio *folio) \
{ \
unsigned long priv = (unsigned long)folio->private; \
unsigned long v = (1UL << PAGE_PRIVATE_NOT_POINTER) | \
(1UL << PAGE_PRIVATE_##flagname); \
return (priv & v) == v; \
} \
static inline bool page_private_##name(struct page *page) \ static inline bool page_private_##name(struct page *page) \
{ \ { \
return PagePrivate(page) && \ return PagePrivate(page) && \
@ -2469,6 +2476,17 @@ static inline bool page_private_##name(struct page *page) \
} }
#define PAGE_PRIVATE_SET_FUNC(name, flagname) \ #define PAGE_PRIVATE_SET_FUNC(name, flagname) \
static inline void folio_set_f2fs_##name(struct folio *folio) \
{ \
unsigned long v = (1UL << PAGE_PRIVATE_NOT_POINTER) | \
(1UL << PAGE_PRIVATE_##flagname); \
if (!folio->private) \
folio_attach_private(folio, (void *)v); \
else { \
v |= (unsigned long)folio->private; \
folio->private = (void *)v; \
} \
} \
static inline void set_page_private_##name(struct page *page) \ static inline void set_page_private_##name(struct page *page) \
{ \ { \
if (!PagePrivate(page)) \ if (!PagePrivate(page)) \
@ -2478,6 +2496,16 @@ static inline void set_page_private_##name(struct page *page) \
} }
#define PAGE_PRIVATE_CLEAR_FUNC(name, flagname) \ #define PAGE_PRIVATE_CLEAR_FUNC(name, flagname) \
static inline void folio_clear_f2fs_##name(struct folio *folio) \
{ \
unsigned long v = (unsigned long)folio->private; \
\
v &= ~(1UL << PAGE_PRIVATE_##flagname); \
if (v == (1UL << PAGE_PRIVATE_NOT_POINTER)) \
folio_detach_private(folio); \
else \
folio->private = (void *)v; \
} \
static inline void clear_page_private_##name(struct page *page) \ static inline void clear_page_private_##name(struct page *page) \
{ \ { \
clear_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \ clear_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \

View File

@ -1463,7 +1463,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
memcpy_folio(fdst, 0, fsrc, 0, PAGE_SIZE); memcpy_folio(fdst, 0, fsrc, 0, PAGE_SIZE);
folio_mark_dirty(fdst); folio_mark_dirty(fdst);
set_page_private_gcing(&fdst->page); folio_set_f2fs_gcing(fdst);
f2fs_folio_put(fdst, true); f2fs_folio_put(fdst, true);
f2fs_folio_put(fsrc, true); f2fs_folio_put(fsrc, true);
@ -2987,7 +2987,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
f2fs_folio_wait_writeback(folio, DATA, true, true); f2fs_folio_wait_writeback(folio, DATA, true, true);
folio_mark_dirty(folio); folio_mark_dirty(folio);
set_page_private_gcing(&folio->page); folio_set_f2fs_gcing(folio);
f2fs_folio_put(folio, true); f2fs_folio_put(folio, true);
idx++; idx++;
@ -4424,7 +4424,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
f2fs_folio_wait_writeback(folio, DATA, true, true); f2fs_folio_wait_writeback(folio, DATA, true, true);
folio_mark_dirty(folio); folio_mark_dirty(folio);
set_page_private_gcing(&folio->page); folio_set_f2fs_gcing(folio);
redirty_idx = folio_next_index(folio); redirty_idx = folio_next_index(folio);
folio_unlock(folio); folio_unlock(folio);
folio_put_refs(folio, 2); folio_put_refs(folio, 2);

View File

@ -1473,7 +1473,7 @@ static int move_data_page(struct inode *inode, block_t bidx, int gc_type,
goto out; goto out;
} }
folio_mark_dirty(folio); folio_mark_dirty(folio);
set_page_private_gcing(&folio->page); folio_set_f2fs_gcing(folio);
} else { } else {
struct f2fs_io_info fio = { struct f2fs_io_info fio = {
.sbi = F2FS_I_SB(inode), .sbi = F2FS_I_SB(inode),
@ -1499,11 +1499,11 @@ static int move_data_page(struct inode *inode, block_t bidx, int gc_type,
f2fs_remove_dirty_inode(inode); f2fs_remove_dirty_inode(inode);
} }
set_page_private_gcing(&folio->page); folio_set_f2fs_gcing(folio);
err = f2fs_do_write_data_page(&fio); err = f2fs_do_write_data_page(&fio);
if (err) { if (err) {
clear_page_private_gcing(&folio->page); folio_clear_f2fs_gcing(folio);
if (err == -ENOMEM) { if (err == -ENOMEM) {
memalloc_retry_wait(GFP_NOFS); memalloc_retry_wait(GFP_NOFS);
goto retry; goto retry;

View File

@ -206,7 +206,7 @@ int f2fs_convert_inline_folio(struct dnode_of_data *dn, struct folio *folio)
/* clear inline data and flag after data writeback */ /* clear inline data and flag after data writeback */
f2fs_truncate_inline_inode(dn->inode, dn->inode_folio, 0); f2fs_truncate_inline_inode(dn->inode, dn->inode_folio, 0);
clear_page_private_inline(&dn->inode_folio->page); folio_clear_f2fs_inline(dn->inode_folio);
clear_out: clear_out:
stat_dec_inline_inode(dn->inode); stat_dec_inline_inode(dn->inode);
clear_inode_flag(dn->inode, FI_INLINE_DATA); clear_inode_flag(dn->inode, FI_INLINE_DATA);
@ -286,7 +286,7 @@ int f2fs_write_inline_data(struct inode *inode, struct folio *folio)
set_inode_flag(inode, FI_APPEND_WRITE); set_inode_flag(inode, FI_APPEND_WRITE);
set_inode_flag(inode, FI_DATA_EXIST); set_inode_flag(inode, FI_DATA_EXIST);
clear_page_private_inline(&ifolio->page); folio_clear_f2fs_inline(ifolio);
f2fs_folio_put(ifolio, 1); f2fs_folio_put(ifolio, 1);
return 0; return 0;
} }

View File

@ -749,7 +749,7 @@ void f2fs_update_inode(struct inode *inode, struct folio *node_folio)
/* deleted inode */ /* deleted inode */
if (inode->i_nlink == 0) if (inode->i_nlink == 0)
clear_page_private_inline(&node_folio->page); folio_clear_f2fs_inline(node_folio);
init_idisk_time(inode); init_idisk_time(inode);
#ifdef CONFIG_F2FS_CHECK_FS #ifdef CONFIG_F2FS_CHECK_FS

View File

@ -1985,8 +1985,8 @@ void f2fs_flush_inline_data(struct f2fs_sb_info *sbi)
goto unlock; goto unlock;
/* flush inline_data, if it's async context. */ /* flush inline_data, if it's async context. */
if (page_private_inline(&folio->page)) { if (folio_test_f2fs_inline(folio)) {
clear_page_private_inline(&folio->page); folio_clear_f2fs_inline(folio);
folio_unlock(folio); folio_unlock(folio);
flush_inline_data(sbi, ino_of_node(folio)); flush_inline_data(sbi, ino_of_node(folio));
continue; continue;
@ -2067,8 +2067,8 @@ int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
goto write_node; goto write_node;
/* flush inline_data */ /* flush inline_data */
if (page_private_inline(&folio->page)) { if (folio_test_f2fs_inline(folio)) {
clear_page_private_inline(&folio->page); folio_clear_f2fs_inline(folio);
folio_unlock(folio); folio_unlock(folio);
flush_inline_data(sbi, ino_of_node(folio)); flush_inline_data(sbi, ino_of_node(folio));
goto lock_node; goto lock_node;
@ -2216,7 +2216,7 @@ static bool f2fs_dirty_node_folio(struct address_space *mapping,
#endif #endif
if (filemap_dirty_folio(mapping, folio)) { if (filemap_dirty_folio(mapping, folio)) {
inc_page_count(F2FS_M_SB(mapping), F2FS_DIRTY_NODES); inc_page_count(F2FS_M_SB(mapping), F2FS_DIRTY_NODES);
set_page_private_reference(&folio->page); folio_set_f2fs_reference(folio);
return true; return true;
} }
return false; return false;