diff options
Diffstat (limited to 'fs/btrfs/ordered-data.h')
-rw-r--r-- | fs/btrfs/ordered-data.h | 71 |
1 files changed, 60 insertions, 11 deletions
diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h index 4fa78736423e..33292c5fe90c 100644 --- a/fs/btrfs/ordered-data.h +++ b/fs/btrfs/ordered-data.h | |||
@@ -20,24 +20,73 @@ | |||
20 | #define __BTRFS_ORDERED_DATA__ | 20 | #define __BTRFS_ORDERED_DATA__ |
21 | 21 | ||
22 | struct btrfs_ordered_inode_tree { | 22 | struct btrfs_ordered_inode_tree { |
23 | rwlock_t lock; | 23 | struct mutex mutex; |
24 | struct rb_root tree; | 24 | struct rb_root tree; |
25 | struct rb_node *last; | ||
25 | }; | 26 | }; |
26 | 27 | ||
28 | struct btrfs_sector_sum { | ||
29 | u64 offset; | ||
30 | u32 sum; | ||
31 | }; | ||
32 | |||
33 | struct btrfs_ordered_sum { | ||
34 | u64 file_offset; | ||
35 | u64 len; | ||
36 | struct list_head list; | ||
37 | struct btrfs_sector_sum sums; | ||
38 | }; | ||
39 | |||
40 | /* bits for the flags field */ | ||
41 | #define BTRFS_ORDERED_IO_DONE 0 /* set when all the pages are written */ | ||
42 | #define BTRFS_ORDERED_COMPLETE 1 /* set when removed from the tree */ | ||
43 | #define BTRFS_ORDERED_START 2 /* set when tree setup */ | ||
44 | |||
45 | struct btrfs_ordered_extent { | ||
46 | u64 file_offset; | ||
47 | u64 start; | ||
48 | u64 len; | ||
49 | unsigned long flags; | ||
50 | atomic_t refs; | ||
51 | struct list_head list; | ||
52 | struct inode *inode; | ||
53 | wait_queue_head_t wait; | ||
54 | struct rb_node rb_node; | ||
55 | }; | ||
56 | |||
57 | |||
58 | static inline int btrfs_ordered_sum_size(struct btrfs_root *root, u64 bytes) | ||
59 | { | ||
60 | unsigned long num_sectors = (bytes + root->sectorsize - 1) / | ||
61 | root->sectorsize; | ||
62 | return sizeof(struct btrfs_ordered_sum) + | ||
63 | num_sectors * sizeof(struct btrfs_sector_sum); | ||
64 | } | ||
65 | |||
27 | static inline void | 66 | static inline void |
28 | btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t) | 67 | btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t) |
29 | { | 68 | { |
30 | rwlock_init(&t->lock); | 69 | mutex_init(&t->mutex); |
31 | t->tree.rb_node = NULL; | 70 | t->tree.rb_node = NULL; |
71 | t->last = NULL; | ||
32 | } | 72 | } |
33 | 73 | ||
34 | int btrfs_add_ordered_inode(struct inode *inode); | 74 | int btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry); |
35 | int btrfs_find_del_first_ordered_inode(struct btrfs_ordered_inode_tree *tree, | 75 | int btrfs_remove_ordered_extent(struct inode *inode, |
36 | u64 *root_objectid, u64 *objectid, | 76 | struct btrfs_ordered_extent *entry); |
37 | struct inode **inode); | 77 | int btrfs_dec_test_ordered_pending(struct inode *inode, |
38 | int btrfs_find_first_ordered_inode(struct btrfs_ordered_inode_tree *tree, | 78 | u64 file_offset, u64 io_size); |
39 | u64 *root_objectid, u64 *objectid, | 79 | int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset, |
40 | struct inode **inode); | 80 | u64 start, u64 len); |
41 | void btrfs_del_ordered_inode(struct inode *inode, int force); | 81 | int btrfs_add_ordered_sum(struct inode *inode, struct btrfs_ordered_sum *sum); |
42 | int btrfs_ordered_throttle(struct btrfs_root *root, struct inode *inode); | 82 | struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode, |
83 | u64 file_offset); | ||
84 | void btrfs_wait_ordered_extent(struct inode *inode, | ||
85 | struct btrfs_ordered_extent *entry); | ||
86 | void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len); | ||
87 | struct btrfs_ordered_extent * | ||
88 | btrfs_lookup_first_ordered_extent(struct inode * inode, u64 file_offset); | ||
89 | int btrfs_add_ordered_pending(struct inode *inode, | ||
90 | struct btrfs_ordered_extent *ordered, | ||
91 | u64 start, u64 len); | ||
43 | #endif | 92 | #endif |