blob: d913ce01248dfb5e056b0217a95a2c19683495ef [file] [log] [blame]
Chris Masona52d9a82007-08-27 16:49:44 -04001#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
Chris Mason07157aa2007-08-30 08:50:51 -04009struct 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);
Christoph Hellwig0e2752a2007-09-10 20:02:33 -040014 void (*writepage_end_io_hook)(struct page *page, u64 start, u64 end);
Chris Mason07157aa2007-08-30 08:50:51 -040015};
16
Chris Masona52d9a82007-08-27 16:49:44 -040017struct extent_map_tree {
18 struct rb_root map;
19 struct rb_root state;
20 struct address_space *mapping;
21 rwlock_t lock;
Chris Mason07157aa2007-08-30 08:50:51 -040022 struct extent_map_ops *ops;
Chris Masona52d9a82007-08-27 16:49:44 -040023};
24
25/* note, this must start with the same fields as fs/extent_map.c:tree_entry */
26struct 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 */
39struct 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;
Chris Mason07157aa2007-08-30 08:50:51 -040047
48 /* for use by the FS */
49 u64 private;
50
Chris Masona52d9a82007-08-27 16:49:44 -040051 struct list_head list;
52};
53
54struct extent_buffer {
55 u64 start;
56 u64 end; /* inclusive */
57 char *addr;
58 struct page *pages[];
59};
60
61typedef 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
67void extent_map_tree_init(struct extent_map_tree *tree,
68 struct address_space *mapping, gfp_t mask);
69struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
70 u64 start, u64 end);
71int add_extent_mapping(struct extent_map_tree *tree,
72 struct extent_map *em);
73int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
74int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page);
75int lock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
76int unlock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
77struct extent_map *alloc_extent_map(gfp_t mask);
78void free_extent_map(struct extent_map *em);
79int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
80 get_extent_t *get_extent);
81void __init extent_map_init(void);
82void __exit extent_map_exit(void);
83int extent_clean_all_trees(struct extent_map_tree *tree);
84int set_extent_uptodate(struct extent_map_tree *tree, u64 start, u64 end,
85 gfp_t mask);
86int set_extent_new(struct extent_map_tree *tree, u64 start, u64 end,
87 gfp_t mask);
88int set_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end,
89 gfp_t mask);
Chris Masonb888db22007-08-27 16:49:44 -040090int set_extent_delalloc(struct extent_map_tree *tree, u64 start, u64 end,
91 gfp_t mask);
Chris Masona52d9a82007-08-27 16:49:44 -040092int extent_invalidatepage(struct extent_map_tree *tree,
93 struct page *page, unsigned long offset);
94int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
95 get_extent_t *get_extent,
96 struct writeback_control *wbc);
97int 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);
100int extent_commit_write(struct extent_map_tree *tree,
101 struct inode *inode, struct page *page,
102 unsigned from, unsigned to);
Christoph Hellwigd396c6f2007-09-10 20:02:30 -0400103sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
104 get_extent_t *get_extent);
Chris Masona52d9a82007-08-27 16:49:44 -0400105int set_range_dirty(struct extent_map_tree *tree, u64 start, u64 end);
Chris Mason07157aa2007-08-30 08:50:51 -0400106int set_state_private(struct extent_map_tree *tree, u64 start, u64 private);
107int get_state_private(struct extent_map_tree *tree, u64 start, u64 *private);
Christoph Hellwigb3cfa352007-09-17 11:25:58 -0400108void set_page_extent_mapped(struct page *page);
Chris Masona52d9a82007-08-27 16:49:44 -0400109#endif