Commit | Line | Data |
---|---|---|
3241b1d3 JT |
1 | /* |
2 | * Copyright (C) 2011 Red Hat, Inc. | |
3 | * | |
4 | * This file is released under the GPL. | |
5 | */ | |
6 | ||
7 | #ifndef DM_SPACE_MAP_COMMON_H | |
8 | #define DM_SPACE_MAP_COMMON_H | |
9 | ||
10 | #include "dm-btree.h" | |
11 | ||
12 | /*----------------------------------------------------------------*/ | |
13 | ||
14 | /* | |
15 | * Low level disk format | |
16 | * | |
17 | * Bitmap btree | |
18 | * ------------ | |
19 | * | |
20 | * Each value stored in the btree is an index_entry. This points to a | |
21 | * block that is used as a bitmap. Within the bitmap hold 2 bits per | |
22 | * entry, which represent UNUSED = 0, REF_COUNT = 1, REF_COUNT = 2 and | |
23 | * REF_COUNT = many. | |
24 | * | |
25 | * Refcount btree | |
26 | * -------------- | |
27 | * | |
28 | * Any entry that has a ref count higher than 2 gets entered in the ref | |
29 | * count tree. The leaf values for this tree is the 32-bit ref count. | |
30 | */ | |
31 | ||
32 | struct disk_index_entry { | |
33 | __le64 blocknr; | |
34 | __le32 nr_free; | |
35 | __le32 none_free_before; | |
36 | } __packed; | |
37 | ||
38 | ||
39 | #define MAX_METADATA_BITMAPS 255 | |
40 | struct disk_metadata_index { | |
41 | __le32 csum; | |
42 | __le32 padding; | |
43 | __le64 blocknr; | |
44 | ||
45 | struct disk_index_entry index[MAX_METADATA_BITMAPS]; | |
46 | } __packed; | |
47 | ||
48 | struct ll_disk; | |
49 | ||
50 | typedef int (*load_ie_fn)(struct ll_disk *ll, dm_block_t index, struct disk_index_entry *result); | |
51 | typedef int (*save_ie_fn)(struct ll_disk *ll, dm_block_t index, struct disk_index_entry *ie); | |
52 | typedef int (*init_index_fn)(struct ll_disk *ll); | |
53 | typedef int (*open_index_fn)(struct ll_disk *ll); | |
54 | typedef dm_block_t (*max_index_entries_fn)(struct ll_disk *ll); | |
55 | typedef int (*commit_fn)(struct ll_disk *ll); | |
56 | ||
57 | struct ll_disk { | |
58 | struct dm_transaction_manager *tm; | |
59 | struct dm_btree_info bitmap_info; | |
60 | struct dm_btree_info ref_count_info; | |
61 | ||
62 | uint32_t block_size; | |
63 | uint32_t entries_per_block; | |
64 | dm_block_t nr_blocks; | |
65 | dm_block_t nr_allocated; | |
66 | ||
67 | /* | |
68 | * bitmap_root may be a btree root or a simple index. | |
69 | */ | |
70 | dm_block_t bitmap_root; | |
71 | ||
72 | dm_block_t ref_count_root; | |
73 | ||
74 | struct disk_metadata_index mi_le; | |
75 | load_ie_fn load_ie; | |
76 | save_ie_fn save_ie; | |
77 | init_index_fn init_index; | |
78 | open_index_fn open_index; | |
79 | max_index_entries_fn max_entries; | |
80 | commit_fn commit; | |
f4b90369 | 81 | bool bitmap_index_changed:1; |
3241b1d3 JT |
82 | }; |
83 | ||
84 | struct disk_sm_root { | |
85 | __le64 nr_blocks; | |
86 | __le64 nr_allocated; | |
87 | __le64 bitmap_root; | |
88 | __le64 ref_count_root; | |
89 | } __packed; | |
90 | ||
91 | #define ENTRIES_PER_BYTE 4 | |
92 | ||
93 | struct disk_bitmap_header { | |
94 | __le32 csum; | |
95 | __le32 not_used; | |
96 | __le64 blocknr; | |
97 | } __packed; | |
98 | ||
99 | enum allocation_event { | |
100 | SM_NONE, | |
101 | SM_ALLOC, | |
102 | SM_FREE, | |
103 | }; | |
104 | ||
105 | /*----------------------------------------------------------------*/ | |
106 | ||
107 | int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks); | |
108 | int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result); | |
109 | int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result); | |
110 | int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, | |
111 | dm_block_t end, dm_block_t *result); | |
112 | int sm_ll_insert(struct ll_disk *ll, dm_block_t b, uint32_t ref_count, enum allocation_event *ev); | |
113 | int sm_ll_inc(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); | |
114 | int sm_ll_dec(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); | |
115 | int sm_ll_commit(struct ll_disk *ll); | |
116 | ||
117 | int sm_ll_new_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm); | |
118 | int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm, | |
119 | void *root_le, size_t len); | |
120 | ||
121 | int sm_ll_new_disk(struct ll_disk *ll, struct dm_transaction_manager *tm); | |
122 | int sm_ll_open_disk(struct ll_disk *ll, struct dm_transaction_manager *tm, | |
123 | void *root_le, size_t len); | |
124 | ||
125 | /*----------------------------------------------------------------*/ | |
126 | ||
127 | #endif /* DM_SPACE_MAP_COMMON_H */ |