Re: [f2fs-dev] [RFC PATCH v2 01/10] f2fs: extend folio state for large folio write path

Chao Yu via Linux-f2fs-devel <[email protected]>
Newsgroups net.sourceforge.lists.linux-f2fs-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
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);\
> }
> 



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.