Lines Matching refs:page
205 static void prelock_page(struct super_block *sb, struct page *page, int lock) in prelock_page() argument
209 BUG_ON(!PageLocked(page)); in prelock_page()
211 BUG_ON(PagePreLocked(page)); in prelock_page()
212 SetPagePreLocked(page); in prelock_page()
215 if (PagePreLocked(page)) in prelock_page()
218 SetPagePreLocked(page); in prelock_page()
222 static void preunlock_page(struct super_block *sb, struct page *page, int lock) in preunlock_page() argument
226 BUG_ON(!PageLocked(page)); in preunlock_page()
228 ClearPagePreLocked(page); in preunlock_page()
231 BUG_ON(!PagePreLocked(page)); in preunlock_page()
235 ClearPagePreLocked(page); in preunlock_page()
247 void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock) in logfs_get_wblocks() argument
251 if (page) in logfs_get_wblocks()
252 prelock_page(sb, page, lock); in logfs_get_wblocks()
262 void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock) in logfs_put_wblocks() argument
266 if (page) in logfs_put_wblocks()
267 preunlock_page(sb, page, lock); in logfs_put_wblocks()
274 static struct page *logfs_get_read_page(struct inode *inode, u64 bix, in logfs_get_read_page()
281 static void logfs_put_read_page(struct page *page) in logfs_put_read_page() argument
283 unlock_page(page); in logfs_put_read_page()
284 page_cache_release(page); in logfs_put_read_page()
287 static void logfs_lock_write_page(struct page *page) in logfs_lock_write_page() argument
291 while (unlikely(!trylock_page(page))) { in logfs_lock_write_page()
297 if (PagePreLocked(page)) { in logfs_lock_write_page()
307 BUG_ON(!PageLocked(page)); in logfs_lock_write_page()
310 static struct page *logfs_get_write_page(struct inode *inode, u64 bix, in logfs_get_write_page()
315 struct page *page; in logfs_get_write_page() local
319 page = find_get_page(mapping, index); in logfs_get_write_page()
320 if (!page) { in logfs_get_write_page()
321 page = __page_cache_alloc(GFP_NOFS); in logfs_get_write_page()
322 if (!page) in logfs_get_write_page()
324 err = add_to_page_cache_lru(page, mapping, index, GFP_NOFS); in logfs_get_write_page()
326 page_cache_release(page); in logfs_get_write_page()
331 } else logfs_lock_write_page(page); in logfs_get_write_page()
332 BUG_ON(!PageLocked(page)); in logfs_get_write_page()
333 return page; in logfs_get_write_page()
336 static void logfs_unlock_write_page(struct page *page) in logfs_unlock_write_page() argument
338 if (!PagePreLocked(page)) in logfs_unlock_write_page()
339 unlock_page(page); in logfs_unlock_write_page()
342 static void logfs_put_write_page(struct page *page) in logfs_put_write_page() argument
344 logfs_unlock_write_page(page); in logfs_put_write_page()
345 page_cache_release(page); in logfs_put_write_page()
348 static struct page *logfs_get_page(struct inode *inode, u64 bix, level_t level, in logfs_get_page()
357 static void logfs_put_page(struct page *page, int rw) in logfs_put_page() argument
360 logfs_put_read_page(page); in logfs_put_page()
362 logfs_put_write_page(page); in logfs_put_page()
391 struct page *page; in indirect_write_block() local
395 page = block->page; in indirect_write_block()
396 inode = page->mapping->host; in indirect_write_block()
397 logfs_lock_write_page(page); in indirect_write_block()
398 ret = logfs_write_buf(inode, page, 0); in indirect_write_block()
399 logfs_unlock_write_page(page); in indirect_write_block()
507 struct page *page = block->page; in indirect_write_alias() local
518 ino = page->mapping->host->i_ino; in indirect_write_alias()
519 logfs_unpack_index(page->index, &bix, &level); in indirect_write_alias()
520 child = kmap_atomic(page); in indirect_write_alias()
561 struct page *page = block->page; in indirect_free_block() local
563 if (PagePrivate(page)) { in indirect_free_block()
564 ClearPagePrivate(page); in indirect_free_block()
565 page_cache_release(page); in indirect_free_block()
566 set_page_private(page, 0); in indirect_free_block()
615 void initialize_block_counters(struct page *page, struct logfs_block *block, in initialize_block_counters() argument
624 if (page->index < first_indirect_block()) { in initialize_block_counters()
628 if (page->index == first_indirect_block()) { in initialize_block_counters()
644 static void alloc_data_block(struct inode *inode, struct page *page) in alloc_data_block() argument
650 if (PagePrivate(page)) in alloc_data_block()
653 logfs_unpack_index(page->index, &bix, &level); in alloc_data_block()
655 block->page = page; in alloc_data_block()
657 SetPagePrivate(page); in alloc_data_block()
658 page_cache_get(page); in alloc_data_block()
659 set_page_private(page, (unsigned long) block); in alloc_data_block()
664 static void alloc_indirect_block(struct inode *inode, struct page *page, in alloc_indirect_block() argument
670 if (PagePrivate(page)) in alloc_indirect_block()
673 alloc_data_block(inode, page); in alloc_indirect_block()
675 block = logfs_block(page); in alloc_indirect_block()
676 array = kmap_atomic(page); in alloc_indirect_block()
677 initialize_block_counters(page, block, array, page_is_empty); in alloc_indirect_block()
681 static void block_set_pointer(struct page *page, int index, u64 ptr) in block_set_pointer() argument
683 struct logfs_block *block = logfs_block(page); in block_set_pointer()
688 array = kmap_atomic(page); in block_set_pointer()
692 SetPageUptodate(page); in block_set_pointer()
699 static u64 block_get_pointer(struct page *page, int index) in block_get_pointer() argument
704 block = kmap_atomic(page); in block_get_pointer()
710 static int logfs_read_empty(struct page *page) in logfs_read_empty() argument
712 zero_user_segment(page, 0, PAGE_CACHE_SIZE); in logfs_read_empty()
716 static int logfs_read_direct(struct inode *inode, struct page *page) in logfs_read_direct() argument
719 pgoff_t index = page->index; in logfs_read_direct()
724 return logfs_read_empty(page); in logfs_read_direct()
726 return logfs_segment_read(inode, page, block, index, 0); in logfs_read_direct()
729 static int logfs_read_loop(struct inode *inode, struct page *page, in logfs_read_loop() argument
736 struct page *ipage; in logfs_read_loop()
738 logfs_unpack_index(page->index, &bix, &target_level); in logfs_read_loop()
740 return logfs_read_empty(page); in logfs_read_loop()
743 return logfs_read_empty(page); in logfs_read_loop()
761 return logfs_read_empty(page); in logfs_read_loop()
764 return logfs_segment_read(inode, page, bofs, bix, 0); in logfs_read_loop()
767 static int logfs_read_block(struct inode *inode, struct page *page, in logfs_read_block() argument
770 pgoff_t index = page->index; in logfs_read_block()
773 return logfs_read_direct(inode, page); in logfs_read_block()
774 return logfs_read_loop(inode, page, rw_context); in logfs_read_block()
783 struct page *ipage; in logfs_exist_loop()
836 struct page *page; in seek_holedata_loop() local
842 page = logfs_get_read_page(inode, bix, level); in seek_holedata_loop()
843 if (!page) in seek_holedata_loop()
846 ret = logfs_segment_read(inode, page, bofs, bix, level); in seek_holedata_loop()
848 logfs_put_read_page(page); in seek_holedata_loop()
853 rblock = kmap_atomic(page); in seek_holedata_loop()
865 logfs_put_read_page(page); in seek_holedata_loop()
870 logfs_put_read_page(page); in seek_holedata_loop()
967 struct page *page; in __logfs_is_valid_loop() local
970 page = logfs_get_write_page(inode, bix, level); in __logfs_is_valid_loop()
971 BUG_ON(!page); in __logfs_is_valid_loop()
973 ret = logfs_segment_read(inode, page, bofs, bix, level); in __logfs_is_valid_loop()
975 logfs_put_write_page(page); in __logfs_is_valid_loop()
979 bofs = block_get_pointer(page, get_bits(bix, SUBLEVEL(level))); in __logfs_is_valid_loop()
980 logfs_put_write_page(page); in __logfs_is_valid_loop()
1063 int logfs_readpage_nolock(struct page *page) in logfs_readpage_nolock() argument
1065 struct inode *inode = page->mapping->host; in logfs_readpage_nolock()
1068 ret = logfs_read_block(inode, page, READ); in logfs_readpage_nolock()
1071 ClearPageUptodate(page); in logfs_readpage_nolock()
1072 SetPageError(page); in logfs_readpage_nolock()
1074 SetPageUptodate(page); in logfs_readpage_nolock()
1075 ClearPageError(page); in logfs_readpage_nolock()
1077 flush_dcache_page(page); in logfs_readpage_nolock()
1101 int get_page_reserve(struct inode *inode, struct page *page) in get_page_reserve() argument
1104 struct logfs_block *block = logfs_block(page); in get_page_reserve()
1110 logfs_get_wblocks(inode->i_sb, page, WF_LOCK); in get_page_reserve()
1118 alloc_data_block(inode, page); in get_page_reserve()
1119 block = logfs_block(page); in get_page_reserve()
1124 logfs_put_wblocks(inode->i_sb, page, WF_LOCK); in get_page_reserve()
1274 static void fill_shadow_tree(struct inode *inode, struct page *page, in fill_shadow_tree() argument
1278 struct logfs_block *block = logfs_block(page); in fill_shadow_tree()
1281 if (PagePrivate(page)) { in fill_shadow_tree()
1340 static int logfs_write_i0(struct inode *inode, struct page *page, in logfs_write_i0() argument
1348 logfs_unpack_index(page->index, &bix, &level); in logfs_write_i0()
1355 err = logfs_segment_write(inode, page, shadow); in logfs_write_i0()
1366 alloc_indirect_block(inode, page, 0); in logfs_write_i0()
1367 full = logfs_block(page)->full == LOGFS_BLOCK_FACTOR; in logfs_write_i0()
1369 fill_shadow_tree(inode, page, shadow); in logfs_write_i0()
1376 static int logfs_write_direct(struct inode *inode, struct page *page, in logfs_write_direct() argument
1381 .ofs = li->li_data[page->index], in logfs_write_direct()
1388 err = logfs_write_i0(inode, page, &wc); in logfs_write_direct()
1392 li->li_data[page->index] = wc.ofs; in logfs_write_direct()
1394 page->index + INODE_POINTER_OFS); in logfs_write_direct()
1398 static int ptr_change(u64 ofs, struct page *page) in ptr_change() argument
1400 struct logfs_block *block = logfs_block(page); in ptr_change()
1416 static int __logfs_write_rec(struct inode *inode, struct page *page, in __logfs_write_rec() argument
1422 struct page *ipage; in __logfs_write_rec()
1443 ret = __logfs_write_rec(inode, page, &child_wc, bix, in __logfs_write_rec()
1446 ret = logfs_write_i0(inode, page, &child_wc); in __logfs_write_rec()
1467 static int logfs_write_rec(struct inode *inode, struct page *page, in logfs_write_rec() argument
1480 ret = __logfs_write_rec(inode, page, &wc, bix, target_level, in logfs_write_rec()
1483 ret = logfs_write_i0(inode, page, &wc); in logfs_write_rec()
1513 struct page *page; in grow_inode() local
1521 page = logfs_get_write_page(inode, I0_BLOCKS + 1, in grow_inode()
1523 if (!page) in grow_inode()
1525 logfs_read_empty(page); in grow_inode()
1526 alloc_indirect_block(inode, page, 1); in grow_inode()
1527 block_set_pointer(page, 0, li->li_data[INDIRECT_INDEX]); in grow_inode()
1528 err = logfs_write_i0(inode, page, &wc); in grow_inode()
1529 logfs_put_write_page(page); in grow_inode()
1540 static int __logfs_write_buf(struct inode *inode, struct page *page, long flags) in __logfs_write_buf() argument
1543 pgoff_t index = page->index; in __logfs_write_buf()
1552 if (logfs_block(page) && logfs_block(page)->reserved_bytes) in __logfs_write_buf()
1553 super->s_dirty_pages -= logfs_block(page)->reserved_bytes; in __logfs_write_buf()
1556 return logfs_write_direct(inode, page, flags); in __logfs_write_buf()
1562 return logfs_write_rec(inode, page, bix, level, flags); in __logfs_write_buf()
1565 int logfs_write_buf(struct inode *inode, struct page *page, long flags) in logfs_write_buf() argument
1570 logfs_get_wblocks(sb, page, flags & WF_LOCK); in logfs_write_buf()
1571 ret = __logfs_write_buf(inode, page, flags); in logfs_write_buf()
1572 logfs_put_wblocks(sb, page, flags & WF_LOCK); in logfs_write_buf()
1576 static int __logfs_delete(struct inode *inode, struct page *page) in __logfs_delete() argument
1583 if (page->index < I0_BLOCKS) in __logfs_delete()
1584 return logfs_write_direct(inode, page, flags); in __logfs_delete()
1585 err = grow_inode(inode, page->index, 0); in __logfs_delete()
1588 return logfs_write_rec(inode, page, page->index, 0, flags); in __logfs_delete()
1595 struct page *page; in logfs_delete() local
1598 page = logfs_get_read_page(inode, index, 0); in logfs_delete()
1599 if (!page) in logfs_delete()
1602 logfs_get_wblocks(sb, page, 1); in logfs_delete()
1603 ret = __logfs_delete(inode, page); in logfs_delete()
1604 logfs_put_wblocks(sb, page, 1); in logfs_delete()
1606 logfs_put_read_page(page); in logfs_delete()
1615 struct page *page; in logfs_rewrite_block() local
1618 page = logfs_get_write_page(inode, bix, level); in logfs_rewrite_block()
1619 if (!page) in logfs_rewrite_block()
1622 err = logfs_segment_read(inode, page, ofs, bix, level); in logfs_rewrite_block()
1625 alloc_indirect_block(inode, page, 0); in logfs_rewrite_block()
1626 err = logfs_write_buf(inode, page, flags); in logfs_rewrite_block()
1636 err = __logfs_write_inode(inode, page, flags); in logfs_rewrite_block()
1640 logfs_put_write_page(page); in logfs_rewrite_block()
1644 static int truncate_data_block(struct inode *inode, struct page *page, in truncate_data_block() argument
1647 loff_t pageofs = page->index << inode->i_sb->s_blocksize_bits; in truncate_data_block()
1656 logfs_unpack_index(page->index, &bix, &level); in truncate_data_block()
1659 err = logfs_segment_read(inode, page, ofs, bix, level); in truncate_data_block()
1663 zero_user_segment(page, size - pageofs, PAGE_CACHE_SIZE); in truncate_data_block()
1664 return logfs_segment_write(inode, page, shadow); in truncate_data_block()
1667 static int logfs_truncate_i0(struct inode *inode, struct page *page, in logfs_truncate_i0() argument
1675 logfs_unpack_index(page->index, &bix, &level); in logfs_truncate_i0()
1679 err = truncate_data_block(inode, page, wc->ofs, shadow, size); in logfs_truncate_i0()
1687 fill_shadow_tree(inode, page, shadow); in logfs_truncate_i0()
1696 struct page *page; in logfs_truncate_direct() local
1710 page = logfs_get_write_page(inode, e, 0); in logfs_truncate_direct()
1711 if (!page) in logfs_truncate_direct()
1713 err = logfs_segment_read(inode, page, wc.ofs, e, 0); in logfs_truncate_direct()
1715 logfs_put_write_page(page); in logfs_truncate_direct()
1718 err = logfs_truncate_i0(inode, page, &wc, size); in logfs_truncate_direct()
1719 logfs_put_write_page(page); in logfs_truncate_direct()
1765 static int __logfs_truncate_rec(struct inode *inode, struct page *ipage, in __logfs_truncate_rec()
1772 struct page *page; in __logfs_truncate_rec() local
1790 page = logfs_get_write_page(inode, child_bix, SUBLEVEL(level)); in __logfs_truncate_rec()
1791 if (!page) in __logfs_truncate_rec()
1795 err = __logfs_truncate_rec(inode, page, &child_wc, size); in __logfs_truncate_rec()
1797 err = logfs_truncate_i0(inode, page, &child_wc, size); in __logfs_truncate_rec()
1798 logfs_put_write_page(page); in __logfs_truncate_rec()
1825 struct page *page; in logfs_truncate_rec() local
1833 page = logfs_get_write_page(inode, 0, LEVEL(li->li_height)); in logfs_truncate_rec()
1834 if (!page) in logfs_truncate_rec()
1837 err = __logfs_truncate_rec(inode, page, &wc, size); in logfs_truncate_rec()
1838 logfs_put_write_page(page); in logfs_truncate_rec()
1904 static void move_page_to_inode(struct inode *inode, struct page *page) in move_page_to_inode() argument
1907 struct logfs_block *block = logfs_block(page); in move_page_to_inode()
1919 block->page = NULL; in move_page_to_inode()
1920 if (PagePrivate(page)) { in move_page_to_inode()
1921 ClearPagePrivate(page); in move_page_to_inode()
1922 page_cache_release(page); in move_page_to_inode()
1923 set_page_private(page, 0); in move_page_to_inode()
1927 static void move_inode_to_page(struct page *page, struct inode *inode) in move_inode_to_page() argument
1937 BUG_ON(PagePrivate(page)); in move_inode_to_page()
1939 block->page = page; in move_inode_to_page()
1941 if (!PagePrivate(page)) { in move_inode_to_page()
1942 SetPagePrivate(page); in move_inode_to_page()
1943 page_cache_get(page); in move_inode_to_page()
1944 set_page_private(page, (unsigned long) block); in move_inode_to_page()
1956 struct page *page; in logfs_read_inode() local
1965 page = read_cache_page(master_inode->i_mapping, ino, in logfs_read_inode()
1967 if (IS_ERR(page)) in logfs_read_inode()
1968 return PTR_ERR(page); in logfs_read_inode()
1970 di = kmap_atomic(page); in logfs_read_inode()
1973 move_page_to_inode(inode, page); in logfs_read_inode()
1974 page_cache_release(page); in logfs_read_inode()
1979 static struct page *inode_to_page(struct inode *inode) in inode_to_page()
1983 struct page *page; in inode_to_page() local
1987 page = logfs_get_write_page(master_inode, inode->i_ino, 0); in inode_to_page()
1988 if (!page) in inode_to_page()
1991 di = kmap_atomic(page); in inode_to_page()
1994 move_inode_to_page(page, inode); in inode_to_page()
1995 return page; in inode_to_page()
2003 struct page *page; in do_write_inode() local
2014 page = inode_to_page(inode); in do_write_inode()
2015 if (!page) in do_write_inode()
2019 err = logfs_write_buf(master_inode, page, 0); in do_write_inode()
2021 move_page_to_inode(inode, page); in do_write_inode()
2023 logfs_put_write_page(page); in do_write_inode()
2034 struct page *page; in logfs_mod_segment_entry() local
2043 page = logfs_get_write_page(inode, page_no, 0); in logfs_mod_segment_entry()
2044 BUG_ON(!page); /* FIXME: We need some reserve page for this case */ in logfs_mod_segment_entry()
2045 if (!PageUptodate(page)) in logfs_mod_segment_entry()
2046 logfs_read_block(inode, page, WRITE); in logfs_mod_segment_entry()
2049 alloc_indirect_block(inode, page, 0); in logfs_mod_segment_entry()
2050 se = kmap_atomic(page); in logfs_mod_segment_entry()
2053 logfs_set_alias(sb, logfs_block(page), child_no); in logfs_mod_segment_entry()
2058 logfs_put_write_page(page); in logfs_mod_segment_entry()
2132 int __logfs_write_inode(struct inode *inode, struct page *page, long flags) in __logfs_write_inode() argument
2137 logfs_get_wblocks(sb, page, flags & WF_LOCK); in __logfs_write_inode()
2139 logfs_put_wblocks(sb, page, flags & WF_LOCK); in __logfs_write_inode()
2147 struct page *page; in do_delete_inode() local
2150 page = logfs_get_write_page(master_inode, inode->i_ino, 0); in do_delete_inode()
2151 if (!page) in do_delete_inode()
2154 move_inode_to_page(page, inode); in do_delete_inode()
2156 logfs_get_wblocks(sb, page, 1); in do_delete_inode()
2157 ret = __logfs_delete(master_inode, page); in do_delete_inode()
2158 logfs_put_wblocks(sb, page, 1); in do_delete_inode()
2160 logfs_put_write_page(page); in do_delete_inode()
2173 struct page *page; in logfs_evict_inode() local
2198 page = inode_to_page(inode); in logfs_evict_inode()
2199 BUG_ON(!page); /* FIXME: Use emergency page */ in logfs_evict_inode()
2200 logfs_put_write_page(page); in logfs_evict_inode()
2206 struct page *page; in btree_write_block() local
2210 page = logfs_get_write_page(inode, block->bix, block->level); in btree_write_block()
2212 err = logfs_readpage_nolock(page); in btree_write_block()
2214 BUG_ON(!PagePrivate(page)); in btree_write_block()
2215 BUG_ON(logfs_block(page) != block); in btree_write_block()
2216 err = __logfs_write_buf(inode, page, 0); in btree_write_block()
2218 BUG_ON(PagePrivate(page) || page->private); in btree_write_block()
2220 logfs_put_write_page(page); in btree_write_block()
2244 struct page *page; in logfs_inode_write() local
2249 page = logfs_get_write_page(inode, bix, 0); in logfs_inode_write()
2250 if (!page) in logfs_inode_write()
2253 pagebuf = kmap_atomic(page); in logfs_inode_write()
2255 flush_dcache_page(page); in logfs_inode_write()
2261 err = logfs_write_buf(inode, page, flags); in logfs_inode_write()
2262 logfs_put_write_page(page); in logfs_inode_write()