Btrfs: [PATCH] extent_map: add writepage_end_io hook
[safe/jmp/linux-2.6] / fs / btrfs / extent_map.h
1 #ifndef __EXTENTMAP__
2 #define __EXTENTMAP__
3
4 #include <linux/rbtree.h>
5
6 #define EXTENT_MAP_INLINE (u64)-2
7 #define EXTENT_MAP_DELALLOC (u64)-1
8
9 struct extent_map_ops {
10         int (*fill_delalloc)(struct inode *inode, u64 start, u64 end);
11         int (*writepage_io_hook)(struct page *page, u64 start, u64 end);
12         int (*readpage_io_hook)(struct page *page, u64 start, u64 end);
13         int (*readpage_end_io_hook)(struct page *page, u64 start, u64 end);
14         void (*writepage_end_io_hook)(struct page *page, u64 start, u64 end);
15 };
16
17 struct extent_map_tree {
18         struct rb_root map;
19         struct rb_root state;
20         struct address_space *mapping;
21         rwlock_t lock;
22         struct extent_map_ops *ops;
23 };
24
25 /* note, this must start with the same fields as fs/extent_map.c:tree_entry */
26 struct extent_map {
27         u64 start;
28         u64 end; /* inclusive */
29         int in_tree;
30         struct rb_node rb_node;
31         /* block_start and block_end are in bytes */
32         u64 block_start;
33         u64 block_end; /* inclusive */
34         struct block_device *bdev;
35         atomic_t refs;
36 };
37
38 /* note, this must start with the same fields as fs/extent_map.c:tree_entry */
39 struct extent_state {
40         u64 start;
41         u64 end; /* inclusive */
42         int in_tree;
43         struct rb_node rb_node;
44         wait_queue_head_t wq;
45         atomic_t refs;
46         unsigned long state;
47
48         /* for use by the FS */
49         u64 private;
50
51         struct list_head list;
52 };
53
54 struct extent_buffer {
55         u64 start;
56         u64 end; /* inclusive */
57         char *addr;
58         struct page *pages[];
59 };
60
61 typedef struct extent_map *(get_extent_t)(struct inode *inode,
62                                           struct page *page,
63                                           size_t page_offset,
64                                           u64 start, u64 end,
65                                           int create);
66
67 void extent_map_tree_init(struct extent_map_tree *tree,
68                           struct address_space *mapping, gfp_t mask);
69 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
70                                          u64 start, u64 end);
71 int add_extent_mapping(struct extent_map_tree *tree,
72                        struct extent_map *em);
73 int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
74 int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page);
75 int lock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
76 int unlock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
77 struct extent_map *alloc_extent_map(gfp_t mask);
78 void free_extent_map(struct extent_map *em);
79 int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
80                           get_extent_t *get_extent);
81 void __init extent_map_init(void);
82 void __exit extent_map_exit(void);
83 int extent_clean_all_trees(struct extent_map_tree *tree);
84 int set_extent_uptodate(struct extent_map_tree *tree, u64 start, u64 end,
85                         gfp_t mask);
86 int set_extent_new(struct extent_map_tree *tree, u64 start, u64 end,
87                    gfp_t mask);
88 int set_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end,
89                      gfp_t mask);
90 int set_extent_delalloc(struct extent_map_tree *tree, u64 start, u64 end,
91                      gfp_t mask);
92 int extent_invalidatepage(struct extent_map_tree *tree,
93                           struct page *page, unsigned long offset);
94 int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
95                           get_extent_t *get_extent,
96                           struct writeback_control *wbc);
97 int extent_prepare_write(struct extent_map_tree *tree,
98                          struct inode *inode, struct page *page,
99                          unsigned from, unsigned to, get_extent_t *get_extent);
100 int extent_commit_write(struct extent_map_tree *tree,
101                         struct inode *inode, struct page *page,
102                         unsigned from, unsigned to);
103 sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
104                 get_extent_t *get_extent);
105 int set_range_dirty(struct extent_map_tree *tree, u64 start, u64 end);
106 int set_state_private(struct extent_map_tree *tree, u64 start, u64 private);
107 int get_state_private(struct extent_map_tree *tree, u64 start, u64 *private);
108 #endif