]> Pileus Git - ~andy/linux/blob - fs/btrfs/extent_map.h
Btrfs: Add delayed allocation to the extent based page tree code
[~andy/linux] / 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_tree {
10         struct rb_root map;
11         struct rb_root state;
12         struct address_space *mapping;
13         rwlock_t lock;
14         int (*fill_delalloc)(struct inode *inode, u64 start, u64 end);
15 };
16
17 /* note, this must start with the same fields as fs/extent_map.c:tree_entry */
18 struct extent_map {
19         u64 start;
20         u64 end; /* inclusive */
21         int in_tree;
22         struct rb_node rb_node;
23         /* block_start and block_end are in bytes */
24         u64 block_start;
25         u64 block_end; /* inclusive */
26         struct block_device *bdev;
27         atomic_t refs;
28 };
29
30 /* note, this must start with the same fields as fs/extent_map.c:tree_entry */
31 struct extent_state {
32         u64 start;
33         u64 end; /* inclusive */
34         int in_tree;
35         struct rb_node rb_node;
36         wait_queue_head_t wq;
37         atomic_t refs;
38         unsigned long state;
39         struct list_head list;
40 };
41
42 struct extent_buffer {
43         u64 start;
44         u64 end; /* inclusive */
45         char *addr;
46         struct page *pages[];
47 };
48
49 typedef struct extent_map *(get_extent_t)(struct inode *inode,
50                                           struct page *page,
51                                           size_t page_offset,
52                                           u64 start, u64 end,
53                                           int create);
54
55 void extent_map_tree_init(struct extent_map_tree *tree,
56                           struct address_space *mapping, gfp_t mask);
57 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
58                                          u64 start, u64 end);
59 int add_extent_mapping(struct extent_map_tree *tree,
60                        struct extent_map *em);
61 int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
62 int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page);
63 int lock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
64 int unlock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
65 struct extent_map *alloc_extent_map(gfp_t mask);
66 void free_extent_map(struct extent_map *em);
67 int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
68                           get_extent_t *get_extent);
69 void __init extent_map_init(void);
70 void __exit extent_map_exit(void);
71 int extent_clean_all_trees(struct extent_map_tree *tree);
72 int set_extent_uptodate(struct extent_map_tree *tree, u64 start, u64 end,
73                         gfp_t mask);
74 int set_extent_new(struct extent_map_tree *tree, u64 start, u64 end,
75                    gfp_t mask);
76 int set_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end,
77                      gfp_t mask);
78 int set_extent_delalloc(struct extent_map_tree *tree, u64 start, u64 end,
79                      gfp_t mask);
80 int extent_invalidatepage(struct extent_map_tree *tree,
81                           struct page *page, unsigned long offset);
82 int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
83                           get_extent_t *get_extent,
84                           struct writeback_control *wbc);
85 int extent_prepare_write(struct extent_map_tree *tree,
86                          struct inode *inode, struct page *page,
87                          unsigned from, unsigned to, get_extent_t *get_extent);
88 int extent_commit_write(struct extent_map_tree *tree,
89                         struct inode *inode, struct page *page,
90                         unsigned from, unsigned to);
91 int set_range_dirty(struct extent_map_tree *tree, u64 start, u64 end);
92 #endif