|
@@ -82,6 +82,7 @@ enum pageflags {
|
|
|
PG_arch_1,
|
|
|
PG_reserved,
|
|
|
PG_private, /* If pagecache, has fs-private data */
|
|
|
+ PG_private_2, /* If pagecache, has fs aux data */
|
|
|
PG_writeback, /* Page is under writeback */
|
|
|
#ifdef CONFIG_PAGEFLAGS_EXTENDED
|
|
|
PG_head, /* A head page */
|
|
@@ -108,6 +109,12 @@ enum pageflags {
|
|
|
/* Filesystems */
|
|
|
PG_checked = PG_owner_priv_1,
|
|
|
|
|
|
+ /* Two page bits are conscripted by FS-Cache to maintain local caching
|
|
|
+ * state. These bits are set on pages belonging to the netfs's inodes
|
|
|
+ * when those inodes are being locally cached.
|
|
|
+ */
|
|
|
+ PG_fscache = PG_private_2, /* page backed by cache */
|
|
|
+
|
|
|
/* XEN */
|
|
|
PG_pinned = PG_owner_priv_1,
|
|
|
PG_savepinned = PG_dirty,
|
|
@@ -194,8 +201,6 @@ PAGEFLAG(Checked, checked) /* Used by some filesystems */
|
|
|
PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */
|
|
|
PAGEFLAG(SavePinned, savepinned); /* Xen */
|
|
|
PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
|
|
|
-PAGEFLAG(Private, private) __CLEARPAGEFLAG(Private, private)
|
|
|
- __SETPAGEFLAG(Private, private)
|
|
|
PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
|
|
|
|
|
|
__PAGEFLAG(SlobPage, slob_page)
|
|
@@ -204,6 +209,16 @@ __PAGEFLAG(SlobFree, slob_free)
|
|
|
__PAGEFLAG(SlubFrozen, slub_frozen)
|
|
|
__PAGEFLAG(SlubDebug, slub_debug)
|
|
|
|
|
|
+/*
|
|
|
+ * Private page markings that may be used by the filesystem that owns the page
|
|
|
+ * for its own purposes.
|
|
|
+ * - PG_private and PG_private_2 cause releasepage() and co to be invoked
|
|
|
+ */
|
|
|
+PAGEFLAG(Private, private) __SETPAGEFLAG(Private, private)
|
|
|
+ __CLEARPAGEFLAG(Private, private)
|
|
|
+PAGEFLAG(Private2, private_2) TESTSCFLAG(Private2, private_2)
|
|
|
+PAGEFLAG(OwnerPriv1, owner_priv_1) TESTCLEARFLAG(OwnerPriv1, owner_priv_1)
|
|
|
+
|
|
|
/*
|
|
|
* Only test-and-set exist for PG_writeback. The unconditional operators are
|
|
|
* risky: they bypass page accounting.
|
|
@@ -384,9 +399,10 @@ static inline void __ClearPageTail(struct page *page)
|
|
|
* these flags set. It they are, there is a problem.
|
|
|
*/
|
|
|
#define PAGE_FLAGS_CHECK_AT_FREE \
|
|
|
- (1 << PG_lru | 1 << PG_private | 1 << PG_locked | \
|
|
|
- 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \
|
|
|
- 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
|
|
|
+ (1 << PG_lru | 1 << PG_locked | \
|
|
|
+ 1 << PG_private | 1 << PG_private_2 | \
|
|
|
+ 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \
|
|
|
+ 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
|
|
|
__PG_UNEVICTABLE | __PG_MLOCKED)
|
|
|
|
|
|
/*
|
|
@@ -397,4 +413,16 @@ static inline void __ClearPageTail(struct page *page)
|
|
|
#define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1)
|
|
|
|
|
|
#endif /* !__GENERATING_BOUNDS_H */
|
|
|
+
|
|
|
+/**
|
|
|
+ * page_has_private - Determine if page has private stuff
|
|
|
+ * @page: The page to be checked
|
|
|
+ *
|
|
|
+ * Determine if a page has private stuff, indicating that release routines
|
|
|
+ * should be invoked upon it.
|
|
|
+ */
|
|
|
+#define page_has_private(page) \
|
|
|
+ ((page)->flags & ((1 << PG_private) | \
|
|
|
+ (1 << PG_private_2)))
|
|
|
+
|
|
|
#endif /* PAGE_FLAGS_H */
|