1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Buffer/page management specific to NILFS 4 * 5 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 6 * 7 * Written by Ryusuke Konishi and Seiji Kihara. 8 */ 9 10 #ifndef _NILFS_PAGE_H 11 #define _NILFS_PAGE_H 12 13 #include <linux/buffer_head.h> 14 #include "nilfs.h" 15 16 /* 17 * Extended buffer state bits 18 */ 19 enum { 20 BH_NILFS_Allocated = BH_PrivateStart, 21 BH_NILFS_Node, 22 BH_NILFS_Volatile, 23 BH_NILFS_Checked, 24 BH_NILFS_Redirected, 25 }; 26 27 BUFFER_FNS(NILFS_Node, nilfs_node) /* nilfs node buffers */ 28 BUFFER_FNS(NILFS_Volatile, nilfs_volatile) 29 BUFFER_FNS(NILFS_Checked, nilfs_checked) /* buffer is verified */ 30 BUFFER_FNS(NILFS_Redirected, nilfs_redirected) /* redirected to a copy */ 31 32 33 int __nilfs_clear_page_dirty(struct page *); 34 35 struct buffer_head *nilfs_grab_buffer(struct inode *, struct address_space *, 36 unsigned long, unsigned long); 37 void nilfs_forget_buffer(struct buffer_head *); 38 void nilfs_copy_buffer(struct buffer_head *, struct buffer_head *); 39 int nilfs_page_buffers_clean(struct page *); 40 void nilfs_page_bug(struct page *); 41 42 int nilfs_copy_dirty_pages(struct address_space *, struct address_space *); 43 void nilfs_copy_back_pages(struct address_space *, struct address_space *); 44 void nilfs_clear_dirty_page(struct page *, bool); 45 void nilfs_clear_dirty_pages(struct address_space *, bool); 46 unsigned int nilfs_page_count_clean_buffers(struct page *, unsigned int, 47 unsigned int); 48 unsigned long nilfs_find_uncommitted_extent(struct inode *inode, 49 sector_t start_blk, 50 sector_t *blkoff); 51 52 #define NILFS_PAGE_BUG(page, m, a...) \ 53 do { nilfs_page_bug(page); BUG(); } while (0) 54 55 static inline struct buffer_head * 56 nilfs_page_get_nth_block(struct page *page, unsigned int count) 57 { 58 struct buffer_head *bh = page_buffers(page); 59 60 while (count-- > 0) 61 bh = bh->b_this_page; 62 get_bh(bh); 63 return bh; 64 } 65 66 #endif /* _NILFS_PAGE_H */ 67