xref: /openbmc/linux/fs/nilfs2/page.h (revision 05bcf503)
1  /*
2   * page.h - buffer/page management specific to NILFS
3   *
4   * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5   *
6   * This program is free software; you can redistribute it and/or modify
7   * it under the terms of the GNU General Public License as published by
8   * the Free Software Foundation; either version 2 of the License, or
9   * (at your option) any later version.
10   *
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.
15   *
16   * You should have received a copy of the GNU General Public License
17   * along with this program; if not, write to the Free Software
18   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19   *
20   * Written by Ryusuke Konishi <ryusuke@osrg.net>,
21   *            Seiji Kihara <kihara@osrg.net>.
22   */
23  
24  #ifndef _NILFS_PAGE_H
25  #define _NILFS_PAGE_H
26  
27  #include <linux/buffer_head.h>
28  #include "nilfs.h"
29  
30  /*
31   * Extended buffer state bits
32   */
33  enum {
34  	BH_NILFS_Allocated = BH_PrivateStart,
35  	BH_NILFS_Node,
36  	BH_NILFS_Volatile,
37  	BH_NILFS_Checked,
38  	BH_NILFS_Redirected,
39  };
40  
41  BUFFER_FNS(NILFS_Node, nilfs_node)		/* nilfs node buffers */
42  BUFFER_FNS(NILFS_Volatile, nilfs_volatile)
43  BUFFER_FNS(NILFS_Checked, nilfs_checked)	/* buffer is verified */
44  BUFFER_FNS(NILFS_Redirected, nilfs_redirected)	/* redirected to a copy */
45  
46  
47  int __nilfs_clear_page_dirty(struct page *);
48  
49  struct buffer_head *nilfs_grab_buffer(struct inode *, struct address_space *,
50  				      unsigned long, unsigned long);
51  void nilfs_forget_buffer(struct buffer_head *);
52  void nilfs_copy_buffer(struct buffer_head *, struct buffer_head *);
53  int nilfs_page_buffers_clean(struct page *);
54  void nilfs_page_bug(struct page *);
55  
56  int nilfs_copy_dirty_pages(struct address_space *, struct address_space *);
57  void nilfs_copy_back_pages(struct address_space *, struct address_space *);
58  void nilfs_clear_dirty_pages(struct address_space *);
59  void nilfs_mapping_init(struct address_space *mapping, struct inode *inode,
60  			struct backing_dev_info *bdi);
61  unsigned nilfs_page_count_clean_buffers(struct page *, unsigned, unsigned);
62  unsigned long nilfs_find_uncommitted_extent(struct inode *inode,
63  					    sector_t start_blk,
64  					    sector_t *blkoff);
65  
66  #define NILFS_PAGE_BUG(page, m, a...) \
67  	do { nilfs_page_bug(page); BUG(); } while (0)
68  
69  static inline struct buffer_head *
70  nilfs_page_get_nth_block(struct page *page, unsigned int count)
71  {
72  	struct buffer_head *bh = page_buffers(page);
73  
74  	while (count-- > 0)
75  		bh = bh->b_this_page;
76  	get_bh(bh);
77  	return bh;
78  }
79  
80  #endif /* _NILFS_PAGE_H */
81