close_range: unshare all fds for CLOSE_RANGE_UNSHARE | CLOSE_RANGE_CLOEXEC
[linux-2.6-microblaze.git] / fs / erofs / compress.h
index 3d45244..aea129d 100644 (file)
@@ -26,30 +26,58 @@ struct z_erofs_decompress_req {
        bool inplace_io, partial_decoding;
 };
 
+/* some special page->private (unsigned long, see below) */
+#define Z_EROFS_SHORTLIVED_PAGE                (-1UL << 2)
+#define Z_EROFS_PREALLOCATED_PAGE      (-2UL << 2)
+
 /*
- * - 0x5A110C8D ('sallocated', Z_EROFS_MAPPING_STAGING) -
- * used to mark temporary allocated pages from other
- * file/cached pages and NULL mapping pages.
+ * For all pages in a pcluster, page->private should be one of
+ * Type                         Last 2bits      page->private
+ * short-lived page             00              Z_EROFS_SHORTLIVED_PAGE
+ * preallocated page (tryalloc) 00              Z_EROFS_PREALLOCATED_PAGE
+ * cached/managed page          00              pointer to z_erofs_pcluster
+ * online page (file-backed,    01/10/11        sub-index << 2 | count
+ *              some pages can be used for inplace I/O)
+ *
+ * page->mapping should be one of
+ * Type                 page->mapping
+ * short-lived page     NULL
+ * preallocated page    NULL
+ * cached/managed page  non-NULL or NULL (invalidated/truncated page)
+ * online page          non-NULL
+ *
+ * For all managed pages, PG_private should be set with 1 extra refcount,
+ * which is used for page reclaim / migration.
  */
-#define Z_EROFS_MAPPING_STAGING         ((void *)0x5A110C8D)
 
-/* check if a page is marked as staging */
-static inline bool z_erofs_page_is_staging(struct page *page)
+/*
+ * short-lived pages are pages directly from buddy system with specific
+ * page->private (no need to set PagePrivate since these are non-LRU /
+ * non-movable pages and bypass reclaim / migration code).
+ */
+static inline bool z_erofs_is_shortlived_page(struct page *page)
 {
-       return page->mapping == Z_EROFS_MAPPING_STAGING;
+       if (page->private != Z_EROFS_SHORTLIVED_PAGE)
+               return false;
+
+       DBG_BUGON(page->mapping);
+       return true;
 }
 
-static inline bool z_erofs_put_stagingpage(struct list_head *pagepool,
-                                          struct page *page)
+static inline bool z_erofs_put_shortlivedpage(struct list_head *pagepool,
+                                             struct page *page)
 {
-       if (!z_erofs_page_is_staging(page))
+       if (!z_erofs_is_shortlived_page(page))
                return false;
 
-       /* staging pages should not be used by others at the same time */
-       if (page_ref_count(page) > 1)
+       /* short-lived pages should not be used by others at the same time */
+       if (page_ref_count(page) > 1) {
                put_page(page);
-       else
+       } else {
+               /* follow the pcluster rule above. */
+               set_page_private(page, 0);
                list_add(&page->lru, pagepool);
+       }
        return true;
 }