1
2
3
4
5
6
7#ifndef DM_THIN_METADATA_H
8#define DM_THIN_METADATA_H
9
10#include "persistent-data/dm-block-manager.h"
11
12#define THIN_METADATA_BLOCK_SIZE 4096
13
14
15
16
17
18
19
20#define THIN_METADATA_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT)))
21
22
23
24
25#define THIN_METADATA_MAX_SECTORS_WARNING (16 * (1024 * 1024 * 1024 >> SECTOR_SHIFT))
26
27
28
29struct dm_pool_metadata;
30struct dm_thin_device;
31
32
33
34
35typedef uint64_t dm_thin_id;
36
37
38
39
40struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev,
41 sector_t data_block_size,
42 bool format_device);
43
44int dm_pool_metadata_close(struct dm_pool_metadata *pmd);
45
46
47
48
49
50#define THIN_FEATURE_COMPAT_SUPP 0UL
51#define THIN_FEATURE_COMPAT_RO_SUPP 0UL
52#define THIN_FEATURE_INCOMPAT_SUPP 0UL
53
54
55
56
57int dm_pool_create_thin(struct dm_pool_metadata *pmd, dm_thin_id dev);
58
59
60
61
62
63
64
65int dm_pool_create_snap(struct dm_pool_metadata *pmd, dm_thin_id dev,
66 dm_thin_id origin);
67
68
69
70
71
72
73int dm_pool_delete_thin_device(struct dm_pool_metadata *pmd,
74 dm_thin_id dev);
75
76
77
78
79
80int dm_pool_commit_metadata(struct dm_pool_metadata *pmd);
81
82
83
84
85
86
87
88
89
90int dm_pool_abort_metadata(struct dm_pool_metadata *pmd);
91
92
93
94
95int dm_pool_set_metadata_transaction_id(struct dm_pool_metadata *pmd,
96 uint64_t current_id,
97 uint64_t new_id);
98
99int dm_pool_get_metadata_transaction_id(struct dm_pool_metadata *pmd,
100 uint64_t *result);
101
102
103
104
105
106
107
108
109
110
111int dm_pool_reserve_metadata_snap(struct dm_pool_metadata *pmd);
112int dm_pool_release_metadata_snap(struct dm_pool_metadata *pmd);
113
114int dm_pool_get_metadata_snap(struct dm_pool_metadata *pmd,
115 dm_block_t *result);
116
117
118
119
120
121
122
123
124int dm_pool_open_thin_device(struct dm_pool_metadata *pmd, dm_thin_id dev,
125 struct dm_thin_device **td);
126
127int dm_pool_close_thin_device(struct dm_thin_device *td);
128
129dm_thin_id dm_thin_dev_id(struct dm_thin_device *td);
130
131struct dm_thin_lookup_result {
132 dm_block_t block;
133 unsigned shared:1;
134};
135
136
137
138
139
140
141
142int dm_thin_find_block(struct dm_thin_device *td, dm_block_t block,
143 int can_block, struct dm_thin_lookup_result *result);
144
145
146
147
148int dm_pool_alloc_data_block(struct dm_pool_metadata *pmd, dm_block_t *result);
149
150
151
152
153int dm_thin_insert_block(struct dm_thin_device *td, dm_block_t block,
154 dm_block_t data_block);
155
156int dm_thin_remove_block(struct dm_thin_device *td, dm_block_t block);
157
158
159
160
161bool dm_thin_changed_this_transaction(struct dm_thin_device *td);
162
163bool dm_thin_aborted_changes(struct dm_thin_device *td);
164
165int dm_thin_get_highest_mapped_block(struct dm_thin_device *td,
166 dm_block_t *highest_mapped);
167
168int dm_thin_get_mapped_count(struct dm_thin_device *td, dm_block_t *result);
169
170int dm_pool_get_free_block_count(struct dm_pool_metadata *pmd,
171 dm_block_t *result);
172
173int dm_pool_get_free_metadata_block_count(struct dm_pool_metadata *pmd,
174 dm_block_t *result);
175
176int dm_pool_get_metadata_dev_size(struct dm_pool_metadata *pmd,
177 dm_block_t *result);
178
179int dm_pool_get_data_block_size(struct dm_pool_metadata *pmd, sector_t *result);
180
181int dm_pool_get_data_dev_size(struct dm_pool_metadata *pmd, dm_block_t *result);
182
183
184
185
186
187int dm_pool_resize_data_dev(struct dm_pool_metadata *pmd, dm_block_t new_size);
188
189
190
191
192
193void dm_pool_metadata_read_only(struct dm_pool_metadata *pmd);
194
195
196
197#endif
198