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()
110 mapping->host, page, page->index, in ceph_set_page_dirty()
120 BUG_ON(PagePrivate(page)); in ceph_set_page_dirty()
121 page->private = (unsigned long)snapc; in ceph_set_page_dirty()
122 SetPagePrivate(page); in ceph_set_page_dirty()
124 ret = __set_page_dirty_nobuffers(page); in ceph_set_page_dirty()
125 WARN_ON(!PageLocked(page)); in ceph_set_page_dirty()
126 WARN_ON(!page->mapping); in ceph_set_page_dirty()
136 static void ceph_invalidatepage(struct page *page, unsigned int offset, in ceph_invalidatepage() argument
141 struct ceph_snap_context *snapc = page_snap_context(page); in ceph_invalidatepage()
143 inode = page->mapping->host; in ceph_invalidatepage()
148 inode, page, page->index, offset, length); in ceph_invalidatepage()
152 ceph_invalidate_fscache_page(inode, page); in ceph_invalidatepage()
154 if (!PagePrivate(page)) in ceph_invalidatepage()
162 if (!PageDirty(page)) in ceph_invalidatepage()
163 pr_err("%p invalidatepage %p page not dirty\n", inode, page); in ceph_invalidatepage()
165 ClearPageChecked(page); in ceph_invalidatepage()
168 inode, page, page->index); in ceph_invalidatepage()
172 page->private = 0; in ceph_invalidatepage()
173 ClearPagePrivate(page); in ceph_invalidatepage()
176 static int ceph_releasepage(struct page *page, gfp_t g) in ceph_releasepage() argument
178 struct inode *inode = page->mapping ? page->mapping->host : NULL; in ceph_releasepage()
179 dout("%p releasepage %p idx %lu\n", inode, page, page->index); in ceph_releasepage()
180 WARN_ON(PageDirty(page)); in ceph_releasepage()
183 if (!ceph_release_fscache_page(page, g)) in ceph_releasepage()
186 return !PagePrivate(page); in ceph_releasepage()
192 static int readpage_nounlock(struct file *filp, struct page *page) in readpage_nounlock() argument
199 u64 off = page_offset(page); in readpage_nounlock()
203 zero_user_segment(page, 0, PAGE_CACHE_SIZE); in readpage_nounlock()
204 SetPageUptodate(page); in readpage_nounlock()
215 zero_user_segment(page, 0, PAGE_CACHE_SIZE); in readpage_nounlock()
216 SetPageUptodate(page); in readpage_nounlock()
220 err = ceph_readpage_from_fscache(inode, page); in readpage_nounlock()
225 inode, filp, page, page->index); in readpage_nounlock()
229 &page, 1, 0); in readpage_nounlock()
233 SetPageError(page); in readpage_nounlock()
234 ceph_fscache_readpage_cancel(inode, page); in readpage_nounlock()
239 zero_user_segment(page, err, PAGE_CACHE_SIZE); in readpage_nounlock()
241 flush_dcache_page(page); in readpage_nounlock()
243 SetPageUptodate(page); in readpage_nounlock()
244 ceph_readpage_to_fscache(inode, page); in readpage_nounlock()
250 static int ceph_readpage(struct file *filp, struct page *page) in ceph_readpage() argument
252 int r = readpage_nounlock(filp, page); in ceph_readpage()
253 unlock_page(page); in ceph_readpage()
277 struct page *page = osd_data->pages[i]; in finish_read() local
284 zero_user_segment(page, s, PAGE_CACHE_SIZE); in finish_read()
286 dout("finish_read %p uptodate %p idx %lu\n", inode, page, in finish_read()
287 page->index); in finish_read()
288 flush_dcache_page(page); in finish_read()
289 SetPageUptodate(page); in finish_read()
290 ceph_readpage_to_fscache(inode, page); in finish_read()
292 unlock_page(page); in finish_read()
293 page_cache_release(page); in finish_read()
299 static void ceph_unlock_page_vector(struct page **pages, int num_pages) in ceph_unlock_page_vector()
316 struct page *page = list_entry(page_list->prev, struct page, lru); in start_read() local
322 struct page **pages; in start_read()
327 off = (u64) page_offset(page); in start_read()
330 next_index = page->index; in start_read()
331 list_for_each_entry_reverse(page, page_list, lru) { in start_read()
332 if (page->index != next_index) in start_read()
358 page = list_entry(page_list->prev, struct page, lru); in start_read()
359 BUG_ON(PageLocked(page)); in start_read()
360 list_del(&page->lru); in start_read()
362 dout("start_read %p adding %p idx %lu\n", inode, page, in start_read()
363 page->index); in start_read()
364 if (add_to_page_cache_lru(page, &inode->i_data, page->index, in start_read()
366 ceph_fscache_uncache_page(inode, page); in start_read()
367 page_cache_release(page); in start_read()
369 inode, page); in start_read()
373 pages[i] = page; in start_read()
475 static int writepage_nounlock(struct page *page, struct writeback_control *wbc) in writepage_nounlock() argument
482 loff_t page_off = page_offset(page); in writepage_nounlock()
489 dout("writepage %p idx %lu\n", page, page->index); in writepage_nounlock()
491 if (!page->mapping || !page->mapping->host) { in writepage_nounlock()
492 dout("writepage %p - no mapping\n", page); in writepage_nounlock()
495 inode = page->mapping->host; in writepage_nounlock()
501 snapc = page_snap_context(page); in writepage_nounlock()
503 dout("writepage %p page %p not dirty?\n", inode, page); in writepage_nounlock()
509 inode, page, snapc); in writepage_nounlock()
526 dout("%p page eof %llu\n", page, snap_size); in writepage_nounlock()
533 inode, page, page->index, page_off, len, snapc); in writepage_nounlock()
540 ceph_readpage_to_fscache(inode, page); in writepage_nounlock()
542 set_page_writeback(page); in writepage_nounlock()
547 &inode->i_mtime, &page, 1); in writepage_nounlock()
549 dout("writepage setting page/mapping error %d %p\n", err, page); in writepage_nounlock()
550 SetPageError(page); in writepage_nounlock()
555 dout("writepage cleaned page %p\n", page); in writepage_nounlock()
558 page->private = 0; in writepage_nounlock()
559 ClearPagePrivate(page); in writepage_nounlock()
560 end_page_writeback(page); in writepage_nounlock()
567 static int ceph_writepage(struct page *page, struct writeback_control *wbc) in ceph_writepage() argument
570 struct inode *inode = page->mapping->host; in ceph_writepage()
573 err = writepage_nounlock(page, wbc); in ceph_writepage()
574 unlock_page(page); in ceph_writepage()
584 static void ceph_release_pages(struct page **pages, int num) in ceph_release_pages()
610 struct page *page; in writepages_finish() local
642 page = osd_data->pages[i]; in writepages_finish()
643 BUG_ON(!page); in writepages_finish()
644 WARN_ON(!PageUptodate(page)); in writepages_finish()
653 ceph_put_snap_context(page_snap_context(page)); in writepages_finish()
654 page->private = 0; in writepages_finish()
655 ClearPagePrivate(page); in writepages_finish()
656 dout("unlocking %d %p\n", i, page); in writepages_finish()
657 end_page_writeback(page); in writepages_finish()
666 generic_error_remove_page(inode->i_mapping, page); in writepages_finish()
668 unlock_page(page); in writepages_finish()
783 struct page **pages = NULL; in ceph_writepages_start()
785 struct page *page; in ceph_writepages_start() local
807 page = pvec.pages[i]; in ceph_writepages_start()
808 dout("? %p idx %lu\n", page, page->index); in ceph_writepages_start()
810 lock_page(page); /* first page */ in ceph_writepages_start()
811 else if (!trylock_page(page)) in ceph_writepages_start()
815 if (unlikely(!PageDirty(page)) || in ceph_writepages_start()
816 unlikely(page->mapping != mapping)) { in ceph_writepages_start()
817 dout("!dirty or !mapping %p\n", page); in ceph_writepages_start()
818 unlock_page(page); in ceph_writepages_start()
821 if (!wbc->range_cyclic && page->index > end) { in ceph_writepages_start()
822 dout("end of range %p\n", page); in ceph_writepages_start()
824 unlock_page(page); in ceph_writepages_start()
827 if (next && (page->index != next)) { in ceph_writepages_start()
828 dout("not consecutive %p\n", page); in ceph_writepages_start()
829 unlock_page(page); in ceph_writepages_start()
833 dout("waiting on writeback %p\n", page); in ceph_writepages_start()
834 wait_on_page_writeback(page); in ceph_writepages_start()
836 if (page_offset(page) >= in ceph_writepages_start()
838 dout("%p page eof %llu\n", page, in ceph_writepages_start()
841 unlock_page(page); in ceph_writepages_start()
844 if (PageWriteback(page)) { in ceph_writepages_start()
845 dout("%p under writeback\n", page); in ceph_writepages_start()
846 unlock_page(page); in ceph_writepages_start()
851 pgsnapc = page_snap_context(page); in ceph_writepages_start()
855 unlock_page(page); in ceph_writepages_start()
861 if (!clear_page_dirty_for_io(page)) { in ceph_writepages_start()
862 dout("%p !clear_page_dirty_for_io\n", page); in ceph_writepages_start()
863 unlock_page(page); in ceph_writepages_start()
876 offset = (u64)page_offset(page); in ceph_writepages_start()
889 unlock_page(page); in ceph_writepages_start()
914 inode, page, page->index); in ceph_writepages_start()
924 set_page_writeback(page); in ceph_writepages_start()
925 pages[locked_pages] = page; in ceph_writepages_start()
927 next = page->index + 1; in ceph_writepages_start()
1047 struct page *page) in ceph_update_writeable_page() argument
1060 wait_on_page_writeback(page); in ceph_update_writeable_page()
1062 snapc = page_snap_context(page); in ceph_update_writeable_page()
1073 page, snapc); in ceph_update_writeable_page()
1079 unlock_page(page); in ceph_update_writeable_page()
1092 page, snapc); in ceph_update_writeable_page()
1093 if (!clear_page_dirty_for_io(page)) in ceph_update_writeable_page()
1095 r = writepage_nounlock(page, NULL); in ceph_update_writeable_page()
1101 if (PageUptodate(page)) { in ceph_update_writeable_page()
1102 dout(" page %p already uptodate\n", page); in ceph_update_writeable_page()
1117 page, pos_in_page, end_in_page, (int)PAGE_CACHE_SIZE); in ceph_update_writeable_page()
1118 zero_user_segments(page, in ceph_update_writeable_page()
1125 r = readpage_nounlock(file, page); in ceph_update_writeable_page()
1130 unlock_page(page); in ceph_update_writeable_page()
1140 struct page **pagep, void **fsdata) in ceph_write_begin()
1143 struct page *page; in ceph_write_begin() local
1149 page = grab_cache_page_write_begin(mapping, index, 0); in ceph_write_begin()
1150 if (!page) in ceph_write_begin()
1152 *pagep = page; in ceph_write_begin()
1155 inode, page, (int)pos, (int)len); in ceph_write_begin()
1157 r = ceph_update_writeable_page(file, pos, len, page); in ceph_write_begin()
1159 page_cache_release(page); in ceph_write_begin()
1161 *pagep = page; in ceph_write_begin()
1173 struct page *page, void *fsdata) in ceph_write_end() argument
1180 inode, page, (int)pos, (int)copied, (int)len); in ceph_write_end()
1184 zero_user_segment(page, from+copied, len); in ceph_write_end()
1191 if (!PageUptodate(page)) in ceph_write_end()
1192 SetPageUptodate(page); in ceph_write_end()
1194 set_page_dirty(page); in ceph_write_end()
1196 unlock_page(page); in ceph_write_end()
1197 page_cache_release(page); in ceph_write_end()
1239 struct page *pinned_page = NULL; in ceph_filemap_fault()
1285 struct page *page = find_or_create_page(mapping, 0, in ceph_filemap_fault() local
1288 if (!page) { in ceph_filemap_fault()
1292 ret1 = __ceph_do_getattr(inode, page, in ceph_filemap_fault()
1295 unlock_page(page); in ceph_filemap_fault()
1296 page_cache_release(page); in ceph_filemap_fault()
1301 zero_user_segment(page, ret1, PAGE_CACHE_SIZE); in ceph_filemap_fault()
1303 flush_dcache_page(page); in ceph_filemap_fault()
1304 SetPageUptodate(page); in ceph_filemap_fault()
1305 vmf->page = page; in ceph_filemap_fault()
1323 struct page *page = vmf->page; in ceph_page_mkwrite() local
1324 loff_t off = page_offset(page); in ceph_page_mkwrite()
1334 struct page *locked_page = NULL; in ceph_page_mkwrite()
1336 lock_page(page); in ceph_page_mkwrite()
1337 locked_page = page; in ceph_page_mkwrite()
1377 lock_page(page); in ceph_page_mkwrite()
1381 (page->mapping != inode->i_mapping)) in ceph_page_mkwrite()
1384 ret = ceph_update_writeable_page(vma->vm_file, off, len, page); in ceph_page_mkwrite()
1387 set_page_dirty(page); in ceph_page_mkwrite()
1397 unlock_page(page); in ceph_page_mkwrite()
1419 void ceph_fill_inline_data(struct inode *inode, struct page *locked_page, in ceph_fill_inline_data()
1423 struct page *page; in ceph_fill_inline_data() local
1426 page = locked_page; in ceph_fill_inline_data()
1430 page = find_or_create_page(mapping, 0, in ceph_fill_inline_data()
1433 if (!page) in ceph_fill_inline_data()
1435 if (PageUptodate(page)) { in ceph_fill_inline_data()
1436 unlock_page(page); in ceph_fill_inline_data()
1437 page_cache_release(page); in ceph_fill_inline_data()
1446 void *kaddr = kmap_atomic(page); in ceph_fill_inline_data()
1451 if (page != locked_page) { in ceph_fill_inline_data()
1453 zero_user_segment(page, len, PAGE_CACHE_SIZE); in ceph_fill_inline_data()
1455 flush_dcache_page(page); in ceph_fill_inline_data()
1457 SetPageUptodate(page); in ceph_fill_inline_data()
1458 unlock_page(page); in ceph_fill_inline_data()
1459 page_cache_release(page); in ceph_fill_inline_data()
1463 int ceph_uninline_data(struct file *filp, struct page *locked_page) in ceph_uninline_data()
1469 struct page *page = NULL; in ceph_uninline_data() local
1486 page = locked_page; in ceph_uninline_data()
1487 WARN_ON(!PageUptodate(page)); in ceph_uninline_data()
1490 page = find_get_page(inode->i_mapping, 0); in ceph_uninline_data()
1491 if (page) { in ceph_uninline_data()
1492 if (PageUptodate(page)) { in ceph_uninline_data()
1494 lock_page(page); in ceph_uninline_data()
1496 page_cache_release(page); in ceph_uninline_data()
1497 page = NULL; in ceph_uninline_data()
1502 if (page) { in ceph_uninline_data()
1507 page = __page_cache_alloc(GFP_NOFS); in ceph_uninline_data()
1508 if (!page) { in ceph_uninline_data()
1512 err = __ceph_do_getattr(inode, page, in ceph_uninline_data()
1553 osd_req_op_extent_osd_data_pages(req, 1, &page, len, 0, false, false); in ceph_uninline_data()
1586 if (page && page != locked_page) { in ceph_uninline_data()
1588 unlock_page(page); in ceph_uninline_data()
1589 page_cache_release(page); in ceph_uninline_data()
1591 __free_pages(page, 0); in ceph_uninline_data()
1627 struct page **pages; in __ceph_pool_perm_get()