2 * Copyright (C) 2011 Red Hat, Inc.
4 * This file is released under the GPL.
7 #include "dm-space-map-common.h"
8 #include "dm-transaction-manager.h"
10 #include <linux/bitops.h>
11 #include <linux/device-mapper.h>
13 #define DM_MSG_PREFIX "space map common"
15 /*----------------------------------------------------------------*/
20 #define INDEX_CSUM_XOR 160478
22 static void index_prepare_for_write(struct dm_block_validator
*v
,
26 struct disk_metadata_index
*mi_le
= dm_block_data(b
);
28 mi_le
->blocknr
= cpu_to_le64(dm_block_location(b
));
29 mi_le
->csum
= cpu_to_le32(dm_bm_checksum(&mi_le
->padding
,
30 block_size
- sizeof(__le32
),
34 static int index_check(struct dm_block_validator
*v
,
38 struct disk_metadata_index
*mi_le
= dm_block_data(b
);
41 if (dm_block_location(b
) != le64_to_cpu(mi_le
->blocknr
)) {
42 DMERR("index_check failed blocknr %llu wanted %llu",
43 le64_to_cpu(mi_le
->blocknr
), dm_block_location(b
));
47 csum_disk
= cpu_to_le32(dm_bm_checksum(&mi_le
->padding
,
48 block_size
- sizeof(__le32
),
50 if (csum_disk
!= mi_le
->csum
) {
51 DMERR("index_check failed csum %u wanted %u",
52 le32_to_cpu(csum_disk
), le32_to_cpu(mi_le
->csum
));
59 static struct dm_block_validator index_validator
= {
61 .prepare_for_write
= index_prepare_for_write
,
65 /*----------------------------------------------------------------*/
70 #define BITMAP_CSUM_XOR 240779
72 static void bitmap_prepare_for_write(struct dm_block_validator
*v
,
76 struct disk_bitmap_header
*disk_header
= dm_block_data(b
);
78 disk_header
->blocknr
= cpu_to_le64(dm_block_location(b
));
79 disk_header
->csum
= cpu_to_le32(dm_bm_checksum(&disk_header
->not_used
,
80 block_size
- sizeof(__le32
),
84 static int bitmap_check(struct dm_block_validator
*v
,
88 struct disk_bitmap_header
*disk_header
= dm_block_data(b
);
91 if (dm_block_location(b
) != le64_to_cpu(disk_header
->blocknr
)) {
92 DMERR("bitmap check failed blocknr %llu wanted %llu",
93 le64_to_cpu(disk_header
->blocknr
), dm_block_location(b
));
97 csum_disk
= cpu_to_le32(dm_bm_checksum(&disk_header
->not_used
,
98 block_size
- sizeof(__le32
),
100 if (csum_disk
!= disk_header
->csum
) {
101 DMERR("bitmap check failed csum %u wanted %u",
102 le32_to_cpu(csum_disk
), le32_to_cpu(disk_header
->csum
));
109 static struct dm_block_validator dm_sm_bitmap_validator
= {
111 .prepare_for_write
= bitmap_prepare_for_write
,
112 .check
= bitmap_check
115 /*----------------------------------------------------------------*/
117 #define ENTRIES_PER_WORD 32
118 #define ENTRIES_SHIFT 5
120 static void *dm_bitmap_data(struct dm_block
*b
)
122 return dm_block_data(b
) + sizeof(struct disk_bitmap_header
);
125 #define WORD_MASK_HIGH 0xAAAAAAAAAAAAAAAAULL
127 static unsigned bitmap_word_used(void *addr
, unsigned b
)
129 __le64
*words_le
= addr
;
130 __le64
*w_le
= words_le
+ (b
>> ENTRIES_SHIFT
);
132 uint64_t bits
= le64_to_cpu(*w_le
);
133 uint64_t mask
= (bits
+ WORD_MASK_HIGH
+ 1) & WORD_MASK_HIGH
;
135 return !(~bits
& mask
);
138 static unsigned sm_lookup_bitmap(void *addr
, unsigned b
)
140 __le64
*words_le
= addr
;
141 __le64
*w_le
= words_le
+ (b
>> ENTRIES_SHIFT
);
144 b
= (b
& (ENTRIES_PER_WORD
- 1)) << 1;
145 hi
= !!test_bit_le(b
, (void *) w_le
);
146 lo
= !!test_bit_le(b
+ 1, (void *) w_le
);
147 return (hi
<< 1) | lo
;
150 static void sm_set_bitmap(void *addr
, unsigned b
, unsigned val
)
152 __le64
*words_le
= addr
;
153 __le64
*w_le
= words_le
+ (b
>> ENTRIES_SHIFT
);
155 b
= (b
& (ENTRIES_PER_WORD
- 1)) << 1;
158 __set_bit_le(b
, (void *) w_le
);
160 __clear_bit_le(b
, (void *) w_le
);
163 __set_bit_le(b
+ 1, (void *) w_le
);
165 __clear_bit_le(b
+ 1, (void *) w_le
);
168 static int sm_find_free(void *addr
, unsigned begin
, unsigned end
,
171 while (begin
< end
) {
172 if (!(begin
& (ENTRIES_PER_WORD
- 1)) &&
173 bitmap_word_used(addr
, begin
)) {
174 begin
+= ENTRIES_PER_WORD
;
178 if (!sm_lookup_bitmap(addr
, begin
)) {
189 /*----------------------------------------------------------------*/
191 static int sm_ll_init(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
)
195 ll
->bitmap_info
.tm
= tm
;
196 ll
->bitmap_info
.levels
= 1;
199 * Because the new bitmap blocks are created via a shadow
200 * operation, the old entry has already had its reference count
201 * decremented and we don't need the btree to do any bookkeeping.
203 ll
->bitmap_info
.value_type
.size
= sizeof(struct disk_index_entry
);
204 ll
->bitmap_info
.value_type
.inc
= NULL
;
205 ll
->bitmap_info
.value_type
.dec
= NULL
;
206 ll
->bitmap_info
.value_type
.equal
= NULL
;
208 ll
->ref_count_info
.tm
= tm
;
209 ll
->ref_count_info
.levels
= 1;
210 ll
->ref_count_info
.value_type
.size
= sizeof(uint32_t);
211 ll
->ref_count_info
.value_type
.inc
= NULL
;
212 ll
->ref_count_info
.value_type
.dec
= NULL
;
213 ll
->ref_count_info
.value_type
.equal
= NULL
;
215 ll
->block_size
= dm_bm_block_size(dm_tm_get_bm(tm
));
217 if (ll
->block_size
> (1 << 30)) {
218 DMERR("block size too big to hold bitmaps");
222 ll
->entries_per_block
= (ll
->block_size
- sizeof(struct disk_bitmap_header
)) *
226 ll
->ref_count_root
= 0;
231 int sm_ll_extend(struct ll_disk
*ll
, dm_block_t extra_blocks
)
234 dm_block_t i
, nr_blocks
, nr_indexes
;
235 unsigned old_blocks
, blocks
;
237 nr_blocks
= ll
->nr_blocks
+ extra_blocks
;
238 old_blocks
= dm_sector_div_up(ll
->nr_blocks
, ll
->entries_per_block
);
239 blocks
= dm_sector_div_up(nr_blocks
, ll
->entries_per_block
);
241 nr_indexes
= dm_sector_div_up(nr_blocks
, ll
->entries_per_block
);
242 if (nr_indexes
> ll
->max_entries(ll
)) {
243 DMERR("space map too large");
248 * We need to set this before the dm_tm_new_block() call below.
250 ll
->nr_blocks
= nr_blocks
;
251 for (i
= old_blocks
; i
< blocks
; i
++) {
253 struct disk_index_entry idx
;
255 r
= dm_tm_new_block(ll
->tm
, &dm_sm_bitmap_validator
, &b
);
259 idx
.blocknr
= cpu_to_le64(dm_block_location(b
));
261 r
= dm_tm_unlock(ll
->tm
, b
);
265 idx
.nr_free
= cpu_to_le32(ll
->entries_per_block
);
266 idx
.none_free_before
= 0;
268 r
= ll
->save_ie(ll
, i
, &idx
);
276 int sm_ll_lookup_bitmap(struct ll_disk
*ll
, dm_block_t b
, uint32_t *result
)
279 dm_block_t index
= b
;
280 struct disk_index_entry ie_disk
;
281 struct dm_block
*blk
;
283 b
= do_div(index
, ll
->entries_per_block
);
284 r
= ll
->load_ie(ll
, index
, &ie_disk
);
288 r
= dm_tm_read_lock(ll
->tm
, le64_to_cpu(ie_disk
.blocknr
),
289 &dm_sm_bitmap_validator
, &blk
);
293 *result
= sm_lookup_bitmap(dm_bitmap_data(blk
), b
);
295 return dm_tm_unlock(ll
->tm
, blk
);
298 int sm_ll_lookup(struct ll_disk
*ll
, dm_block_t b
, uint32_t *result
)
301 int r
= sm_ll_lookup_bitmap(ll
, b
, result
);
309 r
= dm_btree_lookup(&ll
->ref_count_info
, ll
->ref_count_root
, &b
, &le_rc
);
313 *result
= le32_to_cpu(le_rc
);
318 int sm_ll_find_free_block(struct ll_disk
*ll
, dm_block_t begin
,
319 dm_block_t end
, dm_block_t
*result
)
322 struct disk_index_entry ie_disk
;
323 dm_block_t i
, index_begin
= begin
;
324 dm_block_t index_end
= dm_sector_div_up(end
, ll
->entries_per_block
);
329 begin
= do_div(index_begin
, ll
->entries_per_block
);
330 end
= do_div(end
, ll
->entries_per_block
);
332 for (i
= index_begin
; i
< index_end
; i
++, begin
= 0) {
333 struct dm_block
*blk
;
337 r
= ll
->load_ie(ll
, i
, &ie_disk
);
341 if (le32_to_cpu(ie_disk
.nr_free
) == 0)
344 r
= dm_tm_read_lock(ll
->tm
, le64_to_cpu(ie_disk
.blocknr
),
345 &dm_sm_bitmap_validator
, &blk
);
349 bit_end
= (i
== index_end
- 1) ? end
: ll
->entries_per_block
;
351 r
= sm_find_free(dm_bitmap_data(blk
),
352 max_t(unsigned, begin
, le32_to_cpu(ie_disk
.none_free_before
)),
356 * This might happen because we started searching
357 * part way through the bitmap.
359 dm_tm_unlock(ll
->tm
, blk
);
363 dm_tm_unlock(ll
->tm
, blk
);
367 r
= dm_tm_unlock(ll
->tm
, blk
);
371 *result
= i
* ll
->entries_per_block
+ (dm_block_t
) position
;
378 int sm_ll_insert(struct ll_disk
*ll
, dm_block_t b
,
379 uint32_t ref_count
, enum allocation_event
*ev
)
384 dm_block_t index
= b
;
385 struct disk_index_entry ie_disk
;
389 bit
= do_div(index
, ll
->entries_per_block
);
390 r
= ll
->load_ie(ll
, index
, &ie_disk
);
394 r
= dm_tm_shadow_block(ll
->tm
, le64_to_cpu(ie_disk
.blocknr
),
395 &dm_sm_bitmap_validator
, &nb
, &inc
);
397 DMERR("dm_tm_shadow_block() failed");
400 ie_disk
.blocknr
= cpu_to_le64(dm_block_location(nb
));
402 bm_le
= dm_bitmap_data(nb
);
403 old
= sm_lookup_bitmap(bm_le
, bit
);
405 if (ref_count
<= 2) {
406 sm_set_bitmap(bm_le
, bit
, ref_count
);
408 r
= dm_tm_unlock(ll
->tm
, nb
);
413 r
= dm_btree_remove(&ll
->ref_count_info
,
415 &b
, &ll
->ref_count_root
);
421 __le32 le_rc
= cpu_to_le32(ref_count
);
423 sm_set_bitmap(bm_le
, bit
, 3);
424 r
= dm_tm_unlock(ll
->tm
, nb
);
428 __dm_bless_for_disk(&le_rc
);
429 r
= dm_btree_insert(&ll
->ref_count_info
, ll
->ref_count_root
,
430 &b
, &le_rc
, &ll
->ref_count_root
);
432 DMERR("ref count insert failed");
437 if (ref_count
&& !old
) {
440 ie_disk
.nr_free
= cpu_to_le32(le32_to_cpu(ie_disk
.nr_free
) - 1);
441 if (le32_to_cpu(ie_disk
.none_free_before
) == bit
)
442 ie_disk
.none_free_before
= cpu_to_le32(bit
+ 1);
444 } else if (old
&& !ref_count
) {
447 ie_disk
.nr_free
= cpu_to_le32(le32_to_cpu(ie_disk
.nr_free
) + 1);
448 ie_disk
.none_free_before
= cpu_to_le32(min(le32_to_cpu(ie_disk
.none_free_before
), bit
));
451 return ll
->save_ie(ll
, index
, &ie_disk
);
454 int sm_ll_inc(struct ll_disk
*ll
, dm_block_t b
, enum allocation_event
*ev
)
459 r
= sm_ll_lookup(ll
, b
, &rc
);
463 return sm_ll_insert(ll
, b
, rc
+ 1, ev
);
466 int sm_ll_dec(struct ll_disk
*ll
, dm_block_t b
, enum allocation_event
*ev
)
471 r
= sm_ll_lookup(ll
, b
, &rc
);
478 return sm_ll_insert(ll
, b
, rc
- 1, ev
);
481 int sm_ll_commit(struct ll_disk
*ll
)
483 return ll
->commit(ll
);
486 /*----------------------------------------------------------------*/
488 static int metadata_ll_load_ie(struct ll_disk
*ll
, dm_block_t index
,
489 struct disk_index_entry
*ie
)
491 memcpy(ie
, ll
->mi_le
.index
+ index
, sizeof(*ie
));
495 static int metadata_ll_save_ie(struct ll_disk
*ll
, dm_block_t index
,
496 struct disk_index_entry
*ie
)
498 memcpy(ll
->mi_le
.index
+ index
, ie
, sizeof(*ie
));
502 static int metadata_ll_init_index(struct ll_disk
*ll
)
507 r
= dm_tm_new_block(ll
->tm
, &index_validator
, &b
);
511 memcpy(dm_block_data(b
), &ll
->mi_le
, sizeof(ll
->mi_le
));
512 ll
->bitmap_root
= dm_block_location(b
);
514 return dm_tm_unlock(ll
->tm
, b
);
517 static int metadata_ll_open(struct ll_disk
*ll
)
520 struct dm_block
*block
;
522 r
= dm_tm_read_lock(ll
->tm
, ll
->bitmap_root
,
523 &index_validator
, &block
);
527 memcpy(&ll
->mi_le
, dm_block_data(block
), sizeof(ll
->mi_le
));
528 return dm_tm_unlock(ll
->tm
, block
);
531 static dm_block_t
metadata_ll_max_entries(struct ll_disk
*ll
)
533 return MAX_METADATA_BITMAPS
;
536 static int metadata_ll_commit(struct ll_disk
*ll
)
541 r
= dm_tm_shadow_block(ll
->tm
, ll
->bitmap_root
, &index_validator
, &b
, &inc
);
545 memcpy(dm_block_data(b
), &ll
->mi_le
, sizeof(ll
->mi_le
));
546 ll
->bitmap_root
= dm_block_location(b
);
548 return dm_tm_unlock(ll
->tm
, b
);
551 int sm_ll_new_metadata(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
)
555 r
= sm_ll_init(ll
, tm
);
559 ll
->load_ie
= metadata_ll_load_ie
;
560 ll
->save_ie
= metadata_ll_save_ie
;
561 ll
->init_index
= metadata_ll_init_index
;
562 ll
->open_index
= metadata_ll_open
;
563 ll
->max_entries
= metadata_ll_max_entries
;
564 ll
->commit
= metadata_ll_commit
;
567 ll
->nr_allocated
= 0;
569 r
= ll
->init_index(ll
);
573 r
= dm_btree_empty(&ll
->ref_count_info
, &ll
->ref_count_root
);
580 int sm_ll_open_metadata(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
,
581 void *root_le
, size_t len
)
584 struct disk_sm_root
*smr
= root_le
;
586 if (len
< sizeof(struct disk_sm_root
)) {
587 DMERR("sm_metadata root too small");
591 r
= sm_ll_init(ll
, tm
);
595 ll
->load_ie
= metadata_ll_load_ie
;
596 ll
->save_ie
= metadata_ll_save_ie
;
597 ll
->init_index
= metadata_ll_init_index
;
598 ll
->open_index
= metadata_ll_open
;
599 ll
->max_entries
= metadata_ll_max_entries
;
600 ll
->commit
= metadata_ll_commit
;
602 ll
->nr_blocks
= le64_to_cpu(smr
->nr_blocks
);
603 ll
->nr_allocated
= le64_to_cpu(smr
->nr_allocated
);
604 ll
->bitmap_root
= le64_to_cpu(smr
->bitmap_root
);
605 ll
->ref_count_root
= le64_to_cpu(smr
->ref_count_root
);
607 return ll
->open_index(ll
);
610 /*----------------------------------------------------------------*/
612 static int disk_ll_load_ie(struct ll_disk
*ll
, dm_block_t index
,
613 struct disk_index_entry
*ie
)
615 return dm_btree_lookup(&ll
->bitmap_info
, ll
->bitmap_root
, &index
, ie
);
618 static int disk_ll_save_ie(struct ll_disk
*ll
, dm_block_t index
,
619 struct disk_index_entry
*ie
)
621 __dm_bless_for_disk(ie
);
622 return dm_btree_insert(&ll
->bitmap_info
, ll
->bitmap_root
,
623 &index
, ie
, &ll
->bitmap_root
);
626 static int disk_ll_init_index(struct ll_disk
*ll
)
628 return dm_btree_empty(&ll
->bitmap_info
, &ll
->bitmap_root
);
631 static int disk_ll_open(struct ll_disk
*ll
)
637 static dm_block_t
disk_ll_max_entries(struct ll_disk
*ll
)
642 static int disk_ll_commit(struct ll_disk
*ll
)
647 int sm_ll_new_disk(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
)
651 r
= sm_ll_init(ll
, tm
);
655 ll
->load_ie
= disk_ll_load_ie
;
656 ll
->save_ie
= disk_ll_save_ie
;
657 ll
->init_index
= disk_ll_init_index
;
658 ll
->open_index
= disk_ll_open
;
659 ll
->max_entries
= disk_ll_max_entries
;
660 ll
->commit
= disk_ll_commit
;
663 ll
->nr_allocated
= 0;
665 r
= ll
->init_index(ll
);
669 r
= dm_btree_empty(&ll
->ref_count_info
, &ll
->ref_count_root
);
676 int sm_ll_open_disk(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
,
677 void *root_le
, size_t len
)
680 struct disk_sm_root
*smr
= root_le
;
682 if (len
< sizeof(struct disk_sm_root
)) {
683 DMERR("sm_metadata root too small");
687 r
= sm_ll_init(ll
, tm
);
691 ll
->load_ie
= disk_ll_load_ie
;
692 ll
->save_ie
= disk_ll_save_ie
;
693 ll
->init_index
= disk_ll_init_index
;
694 ll
->open_index
= disk_ll_open
;
695 ll
->max_entries
= disk_ll_max_entries
;
696 ll
->commit
= disk_ll_commit
;
698 ll
->nr_blocks
= le64_to_cpu(smr
->nr_blocks
);
699 ll
->nr_allocated
= le64_to_cpu(smr
->nr_allocated
);
700 ll
->bitmap_root
= le64_to_cpu(smr
->bitmap_root
);
701 ll
->ref_count_root
= le64_to_cpu(smr
->ref_count_root
);
703 return ll
->open_index(ll
);
706 /*----------------------------------------------------------------*/