diff options
Diffstat (limited to 'fs/btrfs/ordered-data.h')
-rw-r--r-- | fs/btrfs/ordered-data.h | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h index 33f0d9e91b11..98f491d1022b 100644 --- a/fs/btrfs/ordered-data.h +++ b/fs/btrfs/ordered-data.h | |||
@@ -19,12 +19,19 @@ | |||
19 | #ifndef __BTRFS_ORDERED_DATA__ | 19 | #ifndef __BTRFS_ORDERED_DATA__ |
20 | #define __BTRFS_ORDERED_DATA__ | 20 | #define __BTRFS_ORDERED_DATA__ |
21 | 21 | ||
22 | /* one of these per inode */ | ||
22 | struct btrfs_ordered_inode_tree { | 23 | struct btrfs_ordered_inode_tree { |
23 | struct mutex mutex; | 24 | struct mutex mutex; |
24 | struct rb_root tree; | 25 | struct rb_root tree; |
25 | struct rb_node *last; | 26 | struct rb_node *last; |
26 | }; | 27 | }; |
27 | 28 | ||
29 | /* | ||
30 | * these are used to collect checksums done just before bios submission. | ||
31 | * They are attached via a list into the ordered extent, and | ||
32 | * checksum items are inserted into the tree after all the blocks in | ||
33 | * the ordered extent are on disk | ||
34 | */ | ||
28 | struct btrfs_sector_sum { | 35 | struct btrfs_sector_sum { |
29 | u64 offset; | 36 | u64 offset; |
30 | u32 sum; | 37 | u32 sum; |
@@ -34,27 +41,56 @@ struct btrfs_ordered_sum { | |||
34 | u64 file_offset; | 41 | u64 file_offset; |
35 | u64 len; | 42 | u64 len; |
36 | struct list_head list; | 43 | struct list_head list; |
44 | /* last field is a variable length array of btrfs_sector_sums */ | ||
37 | struct btrfs_sector_sum sums; | 45 | struct btrfs_sector_sum sums; |
38 | }; | 46 | }; |
39 | 47 | ||
40 | /* bits for the flags field */ | 48 | /* |
49 | * bits for the flags field: | ||
50 | * | ||
51 | * BTRFS_ORDERED_IO_DONE is set when all of the blocks are written. | ||
52 | * It is used to make sure metadata is inserted into the tree only once | ||
53 | * per extent. | ||
54 | * | ||
55 | * BTRFS_ORDERED_COMPLETE is set when the extent is removed from the | ||
56 | * rbtree, just before waking any waiters. It is used to indicate the | ||
57 | * IO is done and any metadata is inserted into the tree. | ||
58 | */ | ||
41 | #define BTRFS_ORDERED_IO_DONE 0 /* set when all the pages are written */ | 59 | #define BTRFS_ORDERED_IO_DONE 0 /* set when all the pages are written */ |
60 | |||
42 | #define BTRFS_ORDERED_COMPLETE 1 /* set when removed from the tree */ | 61 | #define BTRFS_ORDERED_COMPLETE 1 /* set when removed from the tree */ |
43 | #define BTRFS_ORDERED_START 2 /* set when tree setup */ | ||
44 | 62 | ||
45 | struct btrfs_ordered_extent { | 63 | struct btrfs_ordered_extent { |
64 | /* logical offset in the file */ | ||
46 | u64 file_offset; | 65 | u64 file_offset; |
66 | |||
67 | /* disk byte number */ | ||
47 | u64 start; | 68 | u64 start; |
69 | |||
70 | /* length of the extent in bytes */ | ||
48 | u64 len; | 71 | u64 len; |
72 | |||
73 | /* flags (described above) */ | ||
49 | unsigned long flags; | 74 | unsigned long flags; |
75 | |||
76 | /* reference count */ | ||
50 | atomic_t refs; | 77 | atomic_t refs; |
78 | |||
79 | /* list of checksums for insertion when the extent io is done */ | ||
51 | struct list_head list; | 80 | struct list_head list; |
52 | struct inode *inode; | 81 | |
82 | /* used to wait for the BTRFS_ORDERED_COMPLETE bit */ | ||
53 | wait_queue_head_t wait; | 83 | wait_queue_head_t wait; |
84 | |||
85 | /* our friendly rbtree entry */ | ||
54 | struct rb_node rb_node; | 86 | struct rb_node rb_node; |
55 | }; | 87 | }; |
56 | 88 | ||
57 | 89 | ||
90 | /* | ||
91 | * calculates the total size you need to allocate for an ordered sum | ||
92 | * structure spanning 'bytes' in the file | ||
93 | */ | ||
58 | static inline int btrfs_ordered_sum_size(struct btrfs_root *root, u64 bytes) | 94 | static inline int btrfs_ordered_sum_size(struct btrfs_root *root, u64 bytes) |
59 | { | 95 | { |
60 | unsigned long num_sectors = (bytes + root->sectorsize - 1) / | 96 | unsigned long num_sectors = (bytes + root->sectorsize - 1) / |
@@ -81,14 +117,11 @@ int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset, | |||
81 | int btrfs_add_ordered_sum(struct inode *inode, struct btrfs_ordered_sum *sum); | 117 | int btrfs_add_ordered_sum(struct inode *inode, struct btrfs_ordered_sum *sum); |
82 | struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode, | 118 | struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode, |
83 | u64 file_offset); | 119 | u64 file_offset); |
84 | void btrfs_wait_ordered_extent(struct inode *inode, | 120 | void btrfs_start_ordered_extent(struct inode *inode, |
85 | struct btrfs_ordered_extent *entry); | 121 | struct btrfs_ordered_extent *entry, int wait); |
86 | void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len); | 122 | void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len); |
87 | struct btrfs_ordered_extent * | 123 | struct btrfs_ordered_extent * |
88 | btrfs_lookup_first_ordered_extent(struct inode * inode, u64 file_offset); | 124 | 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); | ||
92 | int btrfs_ordered_update_i_size(struct inode *inode, | 125 | int btrfs_ordered_update_i_size(struct inode *inode, |
93 | struct btrfs_ordered_extent *ordered); | 126 | struct btrfs_ordered_extent *ordered); |
94 | int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u32 *sum); | 127 | int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u32 *sum); |