Lines Matching refs:page

58 static inline struct ceph_snap_context *page_snap_context(struct page *page)  in page_snap_context()  argument
60 if (PagePrivate(page)) in page_snap_context()
61 return (void *)page->private; in page_snap_context()
69 static int ceph_set_page_dirty(struct page *page) in ceph_set_page_dirty() argument
71 struct address_space *mapping = page->mapping; in ceph_set_page_dirty()
78 return !TestSetPageDirty(page); in ceph_set_page_dirty()
80 if (PageDirty(page)) { in ceph_set_page_dirty()
82 mapping->host, page, page->index); in ceph_set_page_dirty()
83 BUG_ON(!PagePrivate(page)); in ceph_set_page_dirty()
106 mapping->host, page, page->index, in ceph_set_page_dirty()
116 BUG_ON(PagePrivate(page)); in ceph_set_page_dirty()
117 page->private = (unsigned long)snapc; in ceph_set_page_dirty()
118 SetPagePrivate(page); in ceph_set_page_dirty()
120 ret = __set_page_dirty_nobuffers(page); in ceph_set_page_dirty()
121 WARN_ON(!PageLocked(page)); in ceph_set_page_dirty()
122 WARN_ON(!page->mapping); in ceph_set_page_dirty()
132 static void ceph_invalidatepage(struct page *page, unsigned int offset, in ceph_invalidatepage() argument
137 struct ceph_snap_context *snapc = page_snap_context(page); in ceph_invalidatepage()
139 inode = page->mapping->host; in ceph_invalidatepage()
144 inode, page, page->index, offset, length); in ceph_invalidatepage()
148 ceph_invalidate_fscache_page(inode, page); in ceph_invalidatepage()
150 if (!PagePrivate(page)) in ceph_invalidatepage()
158 if (!PageDirty(page)) in ceph_invalidatepage()
159 pr_err("%p invalidatepage %p page not dirty\n", inode, page); in ceph_invalidatepage()
161 ClearPageChecked(page); in ceph_invalidatepage()
164 inode, page, page->index); in ceph_invalidatepage()
168 page->private = 0; in ceph_invalidatepage()
169 ClearPagePrivate(page); in ceph_invalidatepage()
172 static int ceph_releasepage(struct page *page, gfp_t g) in ceph_releasepage() argument
174 struct inode *inode = page->mapping ? page->mapping->host : NULL; in ceph_releasepage()
175 dout("%p releasepage %p idx %lu\n", inode, page, page->index); in ceph_releasepage()
176 WARN_ON(PageDirty(page)); in ceph_releasepage()
179 if (!ceph_release_fscache_page(page, g)) in ceph_releasepage()
182 return !PagePrivate(page); in ceph_releasepage()
188 static int readpage_nounlock(struct file *filp, struct page *page) in readpage_nounlock() argument
195 u64 off = page_offset(page); in readpage_nounlock()
199 zero_user_segment(page, 0, PAGE_CACHE_SIZE); in readpage_nounlock()
200 SetPageUptodate(page); in readpage_nounlock()
211 zero_user_segment(page, 0, PAGE_CACHE_SIZE); in readpage_nounlock()
212 SetPageUptodate(page); in readpage_nounlock()
216 err = ceph_readpage_from_fscache(inode, page); in readpage_nounlock()
221 inode, filp, page, page->index); in readpage_nounlock()
225 &page, 1, 0); in readpage_nounlock()
229 SetPageError(page); in readpage_nounlock()
230 ceph_fscache_readpage_cancel(inode, page); in readpage_nounlock()
235 zero_user_segment(page, err, PAGE_CACHE_SIZE); in readpage_nounlock()
237 flush_dcache_page(page); in readpage_nounlock()
239 SetPageUptodate(page); in readpage_nounlock()
240 ceph_readpage_to_fscache(inode, page); in readpage_nounlock()
246 static int ceph_readpage(struct file *filp, struct page *page) in ceph_readpage() argument
248 int r = readpage_nounlock(filp, page); in ceph_readpage()
249 unlock_page(page); in ceph_readpage()
273 struct page *page = osd_data->pages[i]; in finish_read() local
280 zero_user_segment(page, s, PAGE_CACHE_SIZE); in finish_read()
282 dout("finish_read %p uptodate %p idx %lu\n", inode, page, in finish_read()
283 page->index); in finish_read()
284 flush_dcache_page(page); in finish_read()
285 SetPageUptodate(page); in finish_read()
286 ceph_readpage_to_fscache(inode, page); in finish_read()
288 unlock_page(page); in finish_read()
289 page_cache_release(page); in finish_read()
295 static void ceph_unlock_page_vector(struct page **pages, int num_pages) in ceph_unlock_page_vector()
312 struct page *page = list_entry(page_list->prev, struct page, lru); in start_read() local
318 struct page **pages; in start_read()
323 off = (u64) page_offset(page); in start_read()
326 next_index = page->index; in start_read()
327 list_for_each_entry_reverse(page, page_list, lru) { in start_read()
328 if (page->index != next_index) in start_read()
354 page = list_entry(page_list->prev, struct page, lru); in start_read()
355 BUG_ON(PageLocked(page)); in start_read()
356 list_del(&page->lru); in start_read()
358 dout("start_read %p adding %p idx %lu\n", inode, page, in start_read()
359 page->index); in start_read()
360 if (add_to_page_cache_lru(page, &inode->i_data, page->index, in start_read()
362 ceph_fscache_uncache_page(inode, page); in start_read()
363 page_cache_release(page); in start_read()
365 inode, page); in start_read()
369 pages[i] = page; in start_read()
471 static int writepage_nounlock(struct page *page, struct writeback_control *wbc) in writepage_nounlock() argument
478 loff_t page_off = page_offset(page); in writepage_nounlock()
484 dout("writepage %p idx %lu\n", page, page->index); in writepage_nounlock()
486 if (!page->mapping || !page->mapping->host) { in writepage_nounlock()
487 dout("writepage %p - no mapping\n", page); in writepage_nounlock()
490 inode = page->mapping->host; in writepage_nounlock()
496 snapc = page_snap_context(page); in writepage_nounlock()
498 dout("writepage %p page %p not dirty?\n", inode, page); in writepage_nounlock()
504 inode, page, snapc); in writepage_nounlock()
521 dout("%p page eof %llu\n", page, snap_size); in writepage_nounlock()
528 inode, page, page->index, page_off, len, snapc); in writepage_nounlock()
535 ceph_readpage_to_fscache(inode, page); in writepage_nounlock()
537 set_page_writeback(page); in writepage_nounlock()
542 &inode->i_mtime, &page, 1); in writepage_nounlock()
544 dout("writepage setting page/mapping error %d %p\n", err, page); in writepage_nounlock()
545 SetPageError(page); in writepage_nounlock()
550 dout("writepage cleaned page %p\n", page); in writepage_nounlock()
553 page->private = 0; in writepage_nounlock()
554 ClearPagePrivate(page); in writepage_nounlock()
555 end_page_writeback(page); in writepage_nounlock()
562 static int ceph_writepage(struct page *page, struct writeback_control *wbc) in ceph_writepage() argument
565 struct inode *inode = page->mapping->host; in ceph_writepage()
568 err = writepage_nounlock(page, wbc); in ceph_writepage()
569 unlock_page(page); in ceph_writepage()
579 static void ceph_release_pages(struct page **pages, int num) in ceph_release_pages()
605 struct page *page; in writepages_finish() local
637 page = osd_data->pages[i]; in writepages_finish()
638 BUG_ON(!page); in writepages_finish()
639 WARN_ON(!PageUptodate(page)); in writepages_finish()
648 ceph_put_snap_context(page_snap_context(page)); in writepages_finish()
649 page->private = 0; in writepages_finish()
650 ClearPagePrivate(page); in writepages_finish()
651 dout("unlocking %d %p\n", i, page); in writepages_finish()
652 end_page_writeback(page); in writepages_finish()
661 generic_error_remove_page(inode->i_mapping, page); in writepages_finish()
663 unlock_page(page); in writepages_finish()
778 struct page **pages = NULL; in ceph_writepages_start()
780 struct page *page; in ceph_writepages_start() local
802 page = pvec.pages[i]; in ceph_writepages_start()
803 dout("? %p idx %lu\n", page, page->index); in ceph_writepages_start()
805 lock_page(page); /* first page */ in ceph_writepages_start()
806 else if (!trylock_page(page)) in ceph_writepages_start()
810 if (unlikely(!PageDirty(page)) || in ceph_writepages_start()
811 unlikely(page->mapping != mapping)) { in ceph_writepages_start()
812 dout("!dirty or !mapping %p\n", page); in ceph_writepages_start()
813 unlock_page(page); in ceph_writepages_start()
816 if (!wbc->range_cyclic && page->index > end) { in ceph_writepages_start()
817 dout("end of range %p\n", page); in ceph_writepages_start()
819 unlock_page(page); in ceph_writepages_start()
822 if (next && (page->index != next)) { in ceph_writepages_start()
823 dout("not consecutive %p\n", page); in ceph_writepages_start()
824 unlock_page(page); in ceph_writepages_start()
828 dout("waiting on writeback %p\n", page); in ceph_writepages_start()
829 wait_on_page_writeback(page); in ceph_writepages_start()
831 if (page_offset(page) >= snap_size) { in ceph_writepages_start()
832 dout("%p page eof %llu\n", page, snap_size); in ceph_writepages_start()
834 unlock_page(page); in ceph_writepages_start()
837 if (PageWriteback(page)) { in ceph_writepages_start()
838 dout("%p under writeback\n", page); in ceph_writepages_start()
839 unlock_page(page); in ceph_writepages_start()
844 pgsnapc = page_snap_context(page); in ceph_writepages_start()
848 unlock_page(page); in ceph_writepages_start()
854 if (!clear_page_dirty_for_io(page)) { in ceph_writepages_start()
855 dout("%p !clear_page_dirty_for_io\n", page); in ceph_writepages_start()
856 unlock_page(page); in ceph_writepages_start()
869 offset = (u64)page_offset(page); in ceph_writepages_start()
882 unlock_page(page); in ceph_writepages_start()
906 inode, page, page->index); in ceph_writepages_start()
916 set_page_writeback(page); in ceph_writepages_start()
917 pages[locked_pages] = page; in ceph_writepages_start()
919 next = page->index + 1; in ceph_writepages_start()
1031 struct page *page) in ceph_update_writeable_page() argument
1045 wait_on_page_writeback(page); in ceph_update_writeable_page()
1051 snapc = page_snap_context(page); in ceph_update_writeable_page()
1063 page, snapc); in ceph_update_writeable_page()
1069 unlock_page(page); in ceph_update_writeable_page()
1082 page, snapc); in ceph_update_writeable_page()
1083 if (!clear_page_dirty_for_io(page)) in ceph_update_writeable_page()
1085 r = writepage_nounlock(page, NULL); in ceph_update_writeable_page()
1091 if (PageUptodate(page)) { in ceph_update_writeable_page()
1092 dout(" page %p already uptodate\n", page); in ceph_update_writeable_page()
1107 page, pos_in_page, end_in_page, (int)PAGE_CACHE_SIZE); in ceph_update_writeable_page()
1108 zero_user_segments(page, in ceph_update_writeable_page()
1116 r = readpage_nounlock(file, page); in ceph_update_writeable_page()
1121 unlock_page(page); in ceph_update_writeable_page()
1131 struct page **pagep, void **fsdata) in ceph_write_begin()
1134 struct page *page; in ceph_write_begin() local
1140 page = grab_cache_page_write_begin(mapping, index, 0); in ceph_write_begin()
1141 if (!page) in ceph_write_begin()
1143 *pagep = page; in ceph_write_begin()
1146 inode, page, (int)pos, (int)len); in ceph_write_begin()
1148 r = ceph_update_writeable_page(file, pos, len, page); in ceph_write_begin()
1150 page_cache_release(page); in ceph_write_begin()
1152 *pagep = page; in ceph_write_begin()
1165 struct page *page, void *fsdata) in ceph_write_end() argument
1174 inode, page, (int)pos, (int)copied, (int)len); in ceph_write_end()
1178 zero_user_segment(page, from+copied, len); in ceph_write_end()
1185 if (!PageUptodate(page)) in ceph_write_end()
1186 SetPageUptodate(page); in ceph_write_end()
1188 set_page_dirty(page); in ceph_write_end()
1190 unlock_page(page); in ceph_write_end()
1192 page_cache_release(page); in ceph_write_end()
1234 struct page *pinned_page = NULL; in ceph_filemap_fault()
1280 struct page *page = find_or_create_page(mapping, 0, in ceph_filemap_fault() local
1283 if (!page) { in ceph_filemap_fault()
1287 ret1 = __ceph_do_getattr(inode, page, in ceph_filemap_fault()
1290 unlock_page(page); in ceph_filemap_fault()
1291 page_cache_release(page); in ceph_filemap_fault()
1296 zero_user_segment(page, ret1, PAGE_CACHE_SIZE); in ceph_filemap_fault()
1298 flush_dcache_page(page); in ceph_filemap_fault()
1299 SetPageUptodate(page); in ceph_filemap_fault()
1300 vmf->page = page; in ceph_filemap_fault()
1318 struct page *page = vmf->page; in ceph_page_mkwrite() local
1319 loff_t off = page_offset(page); in ceph_page_mkwrite()
1325 struct page *locked_page = NULL; in ceph_page_mkwrite()
1327 lock_page(page); in ceph_page_mkwrite()
1328 locked_page = page; in ceph_page_mkwrite()
1365 lock_page(page); in ceph_page_mkwrite()
1369 (page->mapping != inode->i_mapping)) in ceph_page_mkwrite()
1372 ret = ceph_update_writeable_page(vma->vm_file, off, len, page); in ceph_page_mkwrite()
1375 set_page_dirty(page); in ceph_page_mkwrite()
1386 unlock_page(page); in ceph_page_mkwrite()
1405 void ceph_fill_inline_data(struct inode *inode, struct page *locked_page, in ceph_fill_inline_data()
1409 struct page *page; in ceph_fill_inline_data() local
1412 page = locked_page; in ceph_fill_inline_data()
1416 page = find_or_create_page(mapping, 0, in ceph_fill_inline_data()
1418 if (!page) in ceph_fill_inline_data()
1420 if (PageUptodate(page)) { in ceph_fill_inline_data()
1421 unlock_page(page); in ceph_fill_inline_data()
1422 page_cache_release(page); in ceph_fill_inline_data()
1431 void *kaddr = kmap_atomic(page); in ceph_fill_inline_data()
1436 if (page != locked_page) { in ceph_fill_inline_data()
1438 zero_user_segment(page, len, PAGE_CACHE_SIZE); in ceph_fill_inline_data()
1440 flush_dcache_page(page); in ceph_fill_inline_data()
1442 SetPageUptodate(page); in ceph_fill_inline_data()
1443 unlock_page(page); in ceph_fill_inline_data()
1444 page_cache_release(page); in ceph_fill_inline_data()
1448 int ceph_uninline_data(struct file *filp, struct page *locked_page) in ceph_uninline_data()
1454 struct page *page = NULL; in ceph_uninline_data() local
1471 page = locked_page; in ceph_uninline_data()
1472 WARN_ON(!PageUptodate(page)); in ceph_uninline_data()
1475 page = find_get_page(inode->i_mapping, 0); in ceph_uninline_data()
1476 if (page) { in ceph_uninline_data()
1477 if (PageUptodate(page)) { in ceph_uninline_data()
1479 lock_page(page); in ceph_uninline_data()
1481 page_cache_release(page); in ceph_uninline_data()
1482 page = NULL; in ceph_uninline_data()
1487 if (page) { in ceph_uninline_data()
1492 page = __page_cache_alloc(GFP_NOFS); in ceph_uninline_data()
1493 if (!page) { in ceph_uninline_data()
1497 err = __ceph_do_getattr(inode, page, in ceph_uninline_data()
1539 osd_req_op_extent_osd_data_pages(req, 1, &page, len, 0, false, false); in ceph_uninline_data()
1572 if (page && page != locked_page) { in ceph_uninline_data()
1574 unlock_page(page); in ceph_uninline_data()
1575 page_cache_release(page); in ceph_uninline_data()
1577 __free_pages(page, 0); in ceph_uninline_data()