Re: [f2fs-dev] [RFC PATCH v2 01/10] f2fs: extend folio state for large folio write path
From: Chao Yu
Date: Thu Jul 09 2026 - 23:07:04 EST
On 7/10/26 09:15, Nanzhe Zhao wrote:
Seems there are redundant codes below, let's have a try to wrap them w/ a macro for cleanup?
Got it, thanks!
How about the following example implementation?
Good, please go ahead.
Thanks,
static inline unsigned long f2fs_folio_get_private_flags(const struct folio *folio)
{
if (f2fs_folio_has_state(folio)) {
struct f2fs_folio_state *ffs = folio->private;
return ffs->private_flags;
}
return (unsigned long)folio->private;
}
static inline void f2fs_folio_set_private_flags(struct folio *folio,
unsigned long flags)
{
if (f2fs_folio_has_state(folio)) {
struct f2fs_folio_state *ffs = folio->private;
ffs->private_flags |= flags;
return;
}
if (!folio_test_private(folio))
folio_attach_private(folio, (void *)flags);
else
folio->private = (void *)((unsigned long)folio->private | flags);
}
static inline void f2fs_folio_clear_private_flags(struct folio *folio,
unsigned long flags)
{
unsigned long private;
if (f2fs_folio_has_state(folio)) {
struct f2fs_folio_state *ffs = folio->private;
ffs->private_flags &= ~flags;
return;
}
private = (unsigned long)folio->private;
private &= ~flags;
if (private == BIT(PAGE_PRIVATE_NOT_POINTER))
folio_detach_private(folio);
else
folio->private = (void *)private;
}
#define PAGE_PRIVATE_GET_FUNC(name, flagname) \
static inline bool folio_test_f2fs_##name(const struct folio *folio)\
{\
unsigned long priv = f2fs_folio_get_private_flags(folio);\
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)\
{\
return PagePrivate(page) &&\
test_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)) &&\
test_bit(PAGE_PRIVATE_##flagname, &page_private(page));\
}
#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);\
f2fs_folio_set_private_flags(folio, v);\
}\
static inline void set_page_private_##name(struct page *page)\
{\
if (!PagePrivate(page))\
attach_page_private(page, (void *)0);\
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page));\
set_bit(PAGE_PRIVATE_##flagname, &page_private(page));\
}
#define PAGE_PRIVATE_CLEAR_FUNC(name, flagname) \
static inline void folio_clear_f2fs_##name(struct folio *folio)\
{\
f2fs_folio_clear_private_flags(folio,\
1UL << PAGE_PRIVATE_##flagname);\
}\
static inline void clear_page_private_##name(struct page *page)\
{\
clear_bit(PAGE_PRIVATE_##flagname, &page_private(page));\
if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER))\
detach_page_private(page);\
}