Skip to content

Commit 635a52d

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: remove folio_detach_private() in .invalidate_folio and .release_folio
We have maintain PagePrivate and page_private and page reference w/ {set,clear}_page_private_*, it doesn't need to call folio_detach_private() in the end of .invalidate_folio and .release_folio, remove it and use f2fs_bug_on instead. Signed-off-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent 33560f8 commit 635a52d

3 files changed

Lines changed: 77 additions & 108 deletions

File tree

fs/f2fs/data.c

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3726,37 +3726,16 @@ void f2fs_invalidate_folio(struct folio *folio, size_t offset, size_t length)
37263726
f2fs_remove_dirty_inode(inode);
37273727
}
37283728
}
3729-
3730-
clear_page_private_reference(&folio->page);
3731-
clear_page_private_gcing(&folio->page);
3732-
3733-
if (test_opt(sbi, COMPRESS_CACHE) &&
3734-
inode->i_ino == F2FS_COMPRESS_INO(sbi))
3735-
clear_page_private_data(&folio->page);
3736-
3737-
folio_detach_private(folio);
3729+
clear_page_private_all(&folio->page);
37383730
}
37393731

37403732
bool f2fs_release_folio(struct folio *folio, gfp_t wait)
37413733
{
3742-
struct f2fs_sb_info *sbi;
3743-
37443734
/* If this is dirty folio, keep private data */
37453735
if (folio_test_dirty(folio))
37463736
return false;
37473737

3748-
sbi = F2FS_M_SB(folio->mapping);
3749-
if (test_opt(sbi, COMPRESS_CACHE)) {
3750-
struct inode *inode = folio->mapping->host;
3751-
3752-
if (inode->i_ino == F2FS_COMPRESS_INO(sbi))
3753-
clear_page_private_data(&folio->page);
3754-
}
3755-
3756-
clear_page_private_reference(&folio->page);
3757-
clear_page_private_gcing(&folio->page);
3758-
3759-
folio_detach_private(folio);
3738+
clear_page_private_all(&folio->page);
37603739
return true;
37613740
}
37623741

fs/f2fs/dir.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -905,14 +905,10 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
905905
f2fs_clear_page_cache_dirty_tag(page);
906906
clear_page_dirty_for_io(page);
907907
ClearPageUptodate(page);
908-
909-
clear_page_private_gcing(page);
908+
clear_page_private_all(page);
910909

911910
inode_dec_dirty_pages(dir);
912911
f2fs_remove_dirty_inode(dir);
913-
914-
detach_page_private(page);
915-
set_page_private(page, 0);
916912
}
917913
f2fs_put_page(page, 1);
918914

fs/f2fs/f2fs.h

Lines changed: 74 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,86 +1398,6 @@ enum {
13981398
PAGE_PRIVATE_MAX
13991399
};
14001400

1401-
#define PAGE_PRIVATE_GET_FUNC(name, flagname) \
1402-
static inline bool page_private_##name(struct page *page) \
1403-
{ \
1404-
return PagePrivate(page) && \
1405-
test_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)) && \
1406-
test_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
1407-
}
1408-
1409-
#define PAGE_PRIVATE_SET_FUNC(name, flagname) \
1410-
static inline void set_page_private_##name(struct page *page) \
1411-
{ \
1412-
if (!PagePrivate(page)) { \
1413-
get_page(page); \
1414-
SetPagePrivate(page); \
1415-
set_page_private(page, 0); \
1416-
} \
1417-
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)); \
1418-
set_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
1419-
}
1420-
1421-
#define PAGE_PRIVATE_CLEAR_FUNC(name, flagname) \
1422-
static inline void clear_page_private_##name(struct page *page) \
1423-
{ \
1424-
clear_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
1425-
if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER)) { \
1426-
set_page_private(page, 0); \
1427-
if (PagePrivate(page)) { \
1428-
ClearPagePrivate(page); \
1429-
put_page(page); \
1430-
}\
1431-
} \
1432-
}
1433-
1434-
PAGE_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
1435-
PAGE_PRIVATE_GET_FUNC(inline, INLINE_INODE);
1436-
PAGE_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
1437-
PAGE_PRIVATE_GET_FUNC(dummy, DUMMY_WRITE);
1438-
1439-
PAGE_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
1440-
PAGE_PRIVATE_SET_FUNC(inline, INLINE_INODE);
1441-
PAGE_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
1442-
PAGE_PRIVATE_SET_FUNC(dummy, DUMMY_WRITE);
1443-
1444-
PAGE_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
1445-
PAGE_PRIVATE_CLEAR_FUNC(inline, INLINE_INODE);
1446-
PAGE_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
1447-
PAGE_PRIVATE_CLEAR_FUNC(dummy, DUMMY_WRITE);
1448-
1449-
static inline unsigned long get_page_private_data(struct page *page)
1450-
{
1451-
unsigned long data = page_private(page);
1452-
1453-
if (!test_bit(PAGE_PRIVATE_NOT_POINTER, &data))
1454-
return 0;
1455-
return data >> PAGE_PRIVATE_MAX;
1456-
}
1457-
1458-
static inline void set_page_private_data(struct page *page, unsigned long data)
1459-
{
1460-
if (!PagePrivate(page)) {
1461-
get_page(page);
1462-
SetPagePrivate(page);
1463-
set_page_private(page, 0);
1464-
}
1465-
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page));
1466-
page_private(page) |= data << PAGE_PRIVATE_MAX;
1467-
}
1468-
1469-
static inline void clear_page_private_data(struct page *page)
1470-
{
1471-
page_private(page) &= GENMASK(PAGE_PRIVATE_MAX - 1, 0);
1472-
if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER)) {
1473-
set_page_private(page, 0);
1474-
if (PagePrivate(page)) {
1475-
ClearPagePrivate(page);
1476-
put_page(page);
1477-
}
1478-
}
1479-
}
1480-
14811401
/* For compression */
14821402
enum compress_algorithm_type {
14831403
COMPRESS_LZO,
@@ -2372,6 +2292,80 @@ void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...);
23722292
#define f2fs_debug(sbi, fmt, ...) \
23732293
f2fs_printk(sbi, KERN_DEBUG fmt, ##__VA_ARGS__)
23742294

2295+
#define PAGE_PRIVATE_GET_FUNC(name, flagname) \
2296+
static inline bool page_private_##name(struct page *page) \
2297+
{ \
2298+
return PagePrivate(page) && \
2299+
test_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)) && \
2300+
test_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
2301+
}
2302+
2303+
#define PAGE_PRIVATE_SET_FUNC(name, flagname) \
2304+
static inline void set_page_private_##name(struct page *page) \
2305+
{ \
2306+
if (!PagePrivate(page)) \
2307+
attach_page_private(page, (void *)0); \
2308+
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page)); \
2309+
set_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
2310+
}
2311+
2312+
#define PAGE_PRIVATE_CLEAR_FUNC(name, flagname) \
2313+
static inline void clear_page_private_##name(struct page *page) \
2314+
{ \
2315+
clear_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
2316+
if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER)) \
2317+
detach_page_private(page); \
2318+
}
2319+
2320+
PAGE_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
2321+
PAGE_PRIVATE_GET_FUNC(inline, INLINE_INODE);
2322+
PAGE_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
2323+
PAGE_PRIVATE_GET_FUNC(dummy, DUMMY_WRITE);
2324+
2325+
PAGE_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
2326+
PAGE_PRIVATE_SET_FUNC(inline, INLINE_INODE);
2327+
PAGE_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
2328+
PAGE_PRIVATE_SET_FUNC(dummy, DUMMY_WRITE);
2329+
2330+
PAGE_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
2331+
PAGE_PRIVATE_CLEAR_FUNC(inline, INLINE_INODE);
2332+
PAGE_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
2333+
PAGE_PRIVATE_CLEAR_FUNC(dummy, DUMMY_WRITE);
2334+
2335+
static inline unsigned long get_page_private_data(struct page *page)
2336+
{
2337+
unsigned long data = page_private(page);
2338+
2339+
if (!test_bit(PAGE_PRIVATE_NOT_POINTER, &data))
2340+
return 0;
2341+
return data >> PAGE_PRIVATE_MAX;
2342+
}
2343+
2344+
static inline void set_page_private_data(struct page *page, unsigned long data)
2345+
{
2346+
if (!PagePrivate(page))
2347+
attach_page_private(page, (void *)0);
2348+
set_bit(PAGE_PRIVATE_NOT_POINTER, &page_private(page));
2349+
page_private(page) |= data << PAGE_PRIVATE_MAX;
2350+
}
2351+
2352+
static inline void clear_page_private_data(struct page *page)
2353+
{
2354+
page_private(page) &= GENMASK(PAGE_PRIVATE_MAX - 1, 0);
2355+
if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER))
2356+
detach_page_private(page);
2357+
}
2358+
2359+
static inline void clear_page_private_all(struct page *page)
2360+
{
2361+
clear_page_private_data(page);
2362+
clear_page_private_reference(page);
2363+
clear_page_private_gcing(page);
2364+
clear_page_private_inline(page);
2365+
2366+
f2fs_bug_on(F2FS_P_SB(page), page_private(page));
2367+
}
2368+
23752369
static inline void dec_valid_block_count(struct f2fs_sb_info *sbi,
23762370
struct inode *inode,
23772371
block_t count)

0 commit comments

Comments
 (0)