Line data Source code
1 : /* 2 : * Compatibility functions which bloat the callers too much to make inline. 3 : * All of the callers of these functions should be converted to use folios 4 : * eventually. 5 : */ 6 : 7 : #include <linux/migrate.h> 8 : #include <linux/pagemap.h> 9 : #include <linux/swap.h> 10 : #include "internal.h" 11 : 12 0 : struct address_space *page_mapping(struct page *page) 13 : { 14 0 : return folio_mapping(page_folio(page)); 15 : } 16 : EXPORT_SYMBOL(page_mapping); 17 : 18 0 : void unlock_page(struct page *page) 19 : { 20 0 : return folio_unlock(page_folio(page)); 21 : } 22 : EXPORT_SYMBOL(unlock_page); 23 : 24 0 : void end_page_writeback(struct page *page) 25 : { 26 0 : return folio_end_writeback(page_folio(page)); 27 : } 28 : EXPORT_SYMBOL(end_page_writeback); 29 : 30 0 : void wait_on_page_writeback(struct page *page) 31 : { 32 0 : return folio_wait_writeback(page_folio(page)); 33 : } 34 : EXPORT_SYMBOL_GPL(wait_on_page_writeback); 35 : 36 0 : void wait_for_stable_page(struct page *page) 37 : { 38 0 : return folio_wait_stable(page_folio(page)); 39 : } 40 : EXPORT_SYMBOL_GPL(wait_for_stable_page); 41 : 42 0 : bool page_mapped(struct page *page) 43 : { 44 0 : return folio_mapped(page_folio(page)); 45 : } 46 : EXPORT_SYMBOL(page_mapped); 47 : 48 0 : void mark_page_accessed(struct page *page) 49 : { 50 0 : folio_mark_accessed(page_folio(page)); 51 0 : } 52 : EXPORT_SYMBOL(mark_page_accessed); 53 : 54 : #ifdef CONFIG_MIGRATION 55 0 : int migrate_page_move_mapping(struct address_space *mapping, 56 : struct page *newpage, struct page *page, int extra_count) 57 : { 58 0 : return folio_migrate_mapping(mapping, page_folio(newpage), 59 0 : page_folio(page), extra_count); 60 : } 61 : EXPORT_SYMBOL(migrate_page_move_mapping); 62 : 63 0 : void migrate_page_states(struct page *newpage, struct page *page) 64 : { 65 0 : folio_migrate_flags(page_folio(newpage), page_folio(page)); 66 0 : } 67 : EXPORT_SYMBOL(migrate_page_states); 68 : 69 0 : void migrate_page_copy(struct page *newpage, struct page *page) 70 : { 71 0 : folio_migrate_copy(page_folio(newpage), page_folio(page)); 72 0 : } 73 : EXPORT_SYMBOL(migrate_page_copy); 74 : #endif 75 : 76 0 : bool set_page_writeback(struct page *page) 77 : { 78 0 : return folio_start_writeback(page_folio(page)); 79 : } 80 : EXPORT_SYMBOL(set_page_writeback); 81 : 82 0 : bool set_page_dirty(struct page *page) 83 : { 84 0 : return folio_mark_dirty(page_folio(page)); 85 : } 86 : EXPORT_SYMBOL(set_page_dirty); 87 : 88 0 : int __set_page_dirty_nobuffers(struct page *page) 89 : { 90 0 : return filemap_dirty_folio(page_mapping(page), page_folio(page)); 91 : } 92 : EXPORT_SYMBOL(__set_page_dirty_nobuffers); 93 : 94 0 : bool clear_page_dirty_for_io(struct page *page) 95 : { 96 0 : return folio_clear_dirty_for_io(page_folio(page)); 97 : } 98 : EXPORT_SYMBOL(clear_page_dirty_for_io); 99 : 100 0 : bool redirty_page_for_writepage(struct writeback_control *wbc, 101 : struct page *page) 102 : { 103 0 : return folio_redirty_for_writepage(wbc, page_folio(page)); 104 : } 105 : EXPORT_SYMBOL(redirty_page_for_writepage); 106 : 107 0 : void lru_cache_add(struct page *page) 108 : { 109 0 : folio_add_lru(page_folio(page)); 110 0 : } 111 : EXPORT_SYMBOL(lru_cache_add); 112 : 113 0 : int add_to_page_cache_lru(struct page *page, struct address_space *mapping, 114 : pgoff_t index, gfp_t gfp) 115 : { 116 0 : return filemap_add_folio(mapping, page_folio(page), index, gfp); 117 : } 118 : EXPORT_SYMBOL(add_to_page_cache_lru); 119 : 120 : noinline 121 0 : struct page *pagecache_get_page(struct address_space *mapping, pgoff_t index, 122 : int fgp_flags, gfp_t gfp) 123 : { 124 : struct folio *folio; 125 : 126 0 : folio = __filemap_get_folio(mapping, index, fgp_flags, gfp); 127 0 : if ((fgp_flags & FGP_HEAD) || !folio || xa_is_value(folio)) 128 0 : return &folio->page; 129 0 : return folio_file_page(folio, index); 130 : } 131 : EXPORT_SYMBOL(pagecache_get_page); 132 : 133 0 : struct page *grab_cache_page_write_begin(struct address_space *mapping, 134 : pgoff_t index, unsigned flags) 135 : { 136 0 : unsigned fgp_flags = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE; 137 : 138 0 : if (flags & AOP_FLAG_NOFS) 139 0 : fgp_flags |= FGP_NOFS; 140 0 : return pagecache_get_page(mapping, index, fgp_flags, 141 : mapping_gfp_mask(mapping)); 142 : } 143 : EXPORT_SYMBOL(grab_cache_page_write_begin); 144 : 145 0 : void delete_from_page_cache(struct page *page) 146 : { 147 0 : return filemap_remove_folio(page_folio(page)); 148 : } 149 : 150 0 : int try_to_release_page(struct page *page, gfp_t gfp) 151 : { 152 0 : return filemap_release_folio(page_folio(page), gfp); 153 : } 154 : EXPORT_SYMBOL(try_to_release_page); 155 : 156 0 : int isolate_lru_page(struct page *page) 157 : { 158 0 : if (WARN_RATELIMIT(PageTail(page), "trying to isolate tail page")) 159 : return -EBUSY; 160 0 : return folio_isolate_lru((struct folio *)page); 161 : } 162 : 163 0 : void putback_lru_page(struct page *page) 164 : { 165 0 : folio_putback_lru(page_folio(page)); 166 0 : }