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");
247 for (i
= old_blocks
; i
< blocks
; i
++) {
249 struct disk_index_entry idx
;
251 r
= dm_tm_new_block(ll
->tm
, &dm_sm_bitmap_validator
, &b
);
254 idx
.blocknr
= cpu_to_le64(dm_block_location(b
));
256 r
= dm_tm_unlock(ll
->tm
, b
);
260 idx
.nr_free
= cpu_to_le32(ll
->entries_per_block
);
261 idx
.none_free_before
= 0;
263 r
= ll
->save_ie(ll
, i
, &idx
);
268 ll
->nr_blocks
= nr_blocks
;
272 int sm_ll_lookup_bitmap(struct ll_disk
*ll
, dm_block_t b
, uint32_t *result
)
275 dm_block_t index
= b
;
276 struct disk_index_entry ie_disk
;
277 struct dm_block
*blk
;
279 b
= do_div(index
, ll
->entries_per_block
);
280 r
= ll
->load_ie(ll
, index
, &ie_disk
);
284 r
= dm_tm_read_lock(ll
->tm
, le64_to_cpu(ie_disk
.blocknr
),
285 &dm_sm_bitmap_validator
, &blk
);
289 *result
= sm_lookup_bitmap(dm_bitmap_data(blk
), b
);
291 return dm_tm_unlock(ll
->tm
, blk
);
294 int sm_ll_lookup(struct ll_disk
*ll
, dm_block_t b
, uint32_t *result
)
297 int r
= sm_ll_lookup_bitmap(ll
, b
, result
);
305 r
= dm_btree_lookup(&ll
->ref_count_info
, ll
->ref_count_root
, &b
, &le_rc
);
309 *result
= le32_to_cpu(le_rc
);
314 int sm_ll_find_free_block(struct ll_disk
*ll
, dm_block_t begin
,
315 dm_block_t end
, dm_block_t
*result
)
318 struct disk_index_entry ie_disk
;
319 dm_block_t i
, index_begin
= begin
;
320 dm_block_t index_end
= dm_sector_div_up(end
, ll
->entries_per_block
);
325 begin
= do_div(index_begin
, ll
->entries_per_block
);
326 end
= do_div(end
, ll
->entries_per_block
);
328 for (i
= index_begin
; i
< index_end
; i
++, begin
= 0) {
329 struct dm_block
*blk
;
333 r
= ll
->load_ie(ll
, i
, &ie_disk
);
337 if (le32_to_cpu(ie_disk
.nr_free
) == 0)
340 r
= dm_tm_read_lock(ll
->tm
, le64_to_cpu(ie_disk
.blocknr
),
341 &dm_sm_bitmap_validator
, &blk
);
345 bit_end
= (i
== index_end
- 1) ? end
: ll
->entries_per_block
;
347 r
= sm_find_free(dm_bitmap_data(blk
),
348 max_t(unsigned, begin
, le32_to_cpu(ie_disk
.none_free_before
)),
352 * This might happen because we started searching
353 * part way through the bitmap.
355 dm_tm_unlock(ll
->tm
, blk
);
359 dm_tm_unlock(ll
->tm
, blk
);
363 r
= dm_tm_unlock(ll
->tm
, blk
);
367 *result
= i
* ll
->entries_per_block
+ (dm_block_t
) position
;
374 int sm_ll_insert(struct ll_disk
*ll
, dm_block_t b
,
375 uint32_t ref_count
, enum allocation_event
*ev
)
380 dm_block_t index
= b
;
381 struct disk_index_entry ie_disk
;
385 bit
= do_div(index
, ll
->entries_per_block
);
386 r
= ll
->load_ie(ll
, index
, &ie_disk
);
390 r
= dm_tm_shadow_block(ll
->tm
, le64_to_cpu(ie_disk
.blocknr
),
391 &dm_sm_bitmap_validator
, &nb
, &inc
);
393 DMERR("dm_tm_shadow_block() failed");
396 ie_disk
.blocknr
= cpu_to_le64(dm_block_location(nb
));
398 bm_le
= dm_bitmap_data(nb
);
399 old
= sm_lookup_bitmap(bm_le
, bit
);
401 if (ref_count
<= 2) {
402 sm_set_bitmap(bm_le
, bit
, ref_count
);
404 r
= dm_tm_unlock(ll
->tm
, nb
);
409 /* FIXME: dm_btree_remove doesn't handle this yet */
411 r
= dm_btree_remove(&ll
->ref_count_info
,
413 &b
, &ll
->ref_count_root
);
420 __le32 le_rc
= cpu_to_le32(ref_count
);
422 sm_set_bitmap(bm_le
, bit
, 3);
423 r
= dm_tm_unlock(ll
->tm
, nb
);
427 __dm_bless_for_disk(&le_rc
);
428 r
= dm_btree_insert(&ll
->ref_count_info
, ll
->ref_count_root
,
429 &b
, &le_rc
, &ll
->ref_count_root
);
431 DMERR("ref count insert failed");
436 if (ref_count
&& !old
) {
439 ie_disk
.nr_free
= cpu_to_le32(le32_to_cpu(ie_disk
.nr_free
) - 1);
440 if (le32_to_cpu(ie_disk
.none_free_before
) == bit
)
441 ie_disk
.none_free_before
= cpu_to_le32(bit
+ 1);
443 } else if (old
&& !ref_count
) {
446 ie_disk
.nr_free
= cpu_to_le32(le32_to_cpu(ie_disk
.nr_free
) + 1);
447 ie_disk
.none_free_before
= cpu_to_le32(min(le32_to_cpu(ie_disk
.none_free_before
), bit
));
450 return ll
->save_ie(ll
, index
, &ie_disk
);
453 int sm_ll_inc(struct ll_disk
*ll
, dm_block_t b
, enum allocation_event
*ev
)
458 r
= sm_ll_lookup(ll
, b
, &rc
);
462 return sm_ll_insert(ll
, b
, rc
+ 1, ev
);
465 int sm_ll_dec(struct ll_disk
*ll
, dm_block_t b
, enum allocation_event
*ev
)
470 r
= sm_ll_lookup(ll
, b
, &rc
);
477 return sm_ll_insert(ll
, b
, rc
- 1, ev
);
480 int sm_ll_commit(struct ll_disk
*ll
)
482 return ll
->commit(ll
);
485 /*----------------------------------------------------------------*/
487 static int metadata_ll_load_ie(struct ll_disk
*ll
, dm_block_t index
,
488 struct disk_index_entry
*ie
)
490 memcpy(ie
, ll
->mi_le
.index
+ index
, sizeof(*ie
));
494 static int metadata_ll_save_ie(struct ll_disk
*ll
, dm_block_t index
,
495 struct disk_index_entry
*ie
)
497 memcpy(ll
->mi_le
.index
+ index
, ie
, sizeof(*ie
));
501 static int metadata_ll_init_index(struct ll_disk
*ll
)
506 r
= dm_tm_new_block(ll
->tm
, &index_validator
, &b
);
510 memcpy(dm_block_data(b
), &ll
->mi_le
, sizeof(ll
->mi_le
));
511 ll
->bitmap_root
= dm_block_location(b
);
513 return dm_tm_unlock(ll
->tm
, b
);
516 static int metadata_ll_open(struct ll_disk
*ll
)
519 struct dm_block
*block
;
521 r
= dm_tm_read_lock(ll
->tm
, ll
->bitmap_root
,
522 &index_validator
, &block
);
526 memcpy(&ll
->mi_le
, dm_block_data(block
), sizeof(ll
->mi_le
));
527 return dm_tm_unlock(ll
->tm
, block
);
530 static dm_block_t
metadata_ll_max_entries(struct ll_disk
*ll
)
532 return MAX_METADATA_BITMAPS
;
535 static int metadata_ll_commit(struct ll_disk
*ll
)
540 r
= dm_tm_shadow_block(ll
->tm
, ll
->bitmap_root
, &index_validator
, &b
, &inc
);
544 memcpy(dm_block_data(b
), &ll
->mi_le
, sizeof(ll
->mi_le
));
545 ll
->bitmap_root
= dm_block_location(b
);
547 return dm_tm_unlock(ll
->tm
, b
);
550 int sm_ll_new_metadata(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
)
554 r
= sm_ll_init(ll
, tm
);
558 ll
->load_ie
= metadata_ll_load_ie
;
559 ll
->save_ie
= metadata_ll_save_ie
;
560 ll
->init_index
= metadata_ll_init_index
;
561 ll
->open_index
= metadata_ll_open
;
562 ll
->max_entries
= metadata_ll_max_entries
;
563 ll
->commit
= metadata_ll_commit
;
566 ll
->nr_allocated
= 0;
568 r
= ll
->init_index(ll
);
572 r
= dm_btree_empty(&ll
->ref_count_info
, &ll
->ref_count_root
);
579 int sm_ll_open_metadata(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
,
580 void *root_le
, size_t len
)
583 struct disk_sm_root
*smr
= root_le
;
585 if (len
< sizeof(struct disk_sm_root
)) {
586 DMERR("sm_metadata root too small");
590 r
= sm_ll_init(ll
, tm
);
594 ll
->load_ie
= metadata_ll_load_ie
;
595 ll
->save_ie
= metadata_ll_save_ie
;
596 ll
->init_index
= metadata_ll_init_index
;
597 ll
->open_index
= metadata_ll_open
;
598 ll
->max_entries
= metadata_ll_max_entries
;
599 ll
->commit
= metadata_ll_commit
;
601 ll
->nr_blocks
= le64_to_cpu(smr
->nr_blocks
);
602 ll
->nr_allocated
= le64_to_cpu(smr
->nr_allocated
);
603 ll
->bitmap_root
= le64_to_cpu(smr
->bitmap_root
);
604 ll
->ref_count_root
= le64_to_cpu(smr
->ref_count_root
);
606 return ll
->open_index(ll
);
609 /*----------------------------------------------------------------*/
611 static int disk_ll_load_ie(struct ll_disk
*ll
, dm_block_t index
,
612 struct disk_index_entry
*ie
)
614 return dm_btree_lookup(&ll
->bitmap_info
, ll
->bitmap_root
, &index
, ie
);
617 static int disk_ll_save_ie(struct ll_disk
*ll
, dm_block_t index
,
618 struct disk_index_entry
*ie
)
620 __dm_bless_for_disk(ie
);
621 return dm_btree_insert(&ll
->bitmap_info
, ll
->bitmap_root
,
622 &index
, ie
, &ll
->bitmap_root
);
625 static int disk_ll_init_index(struct ll_disk
*ll
)
627 return dm_btree_empty(&ll
->bitmap_info
, &ll
->bitmap_root
);
630 static int disk_ll_open(struct ll_disk
*ll
)
636 static dm_block_t
disk_ll_max_entries(struct ll_disk
*ll
)
641 static int disk_ll_commit(struct ll_disk
*ll
)
646 int sm_ll_new_disk(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
)
650 r
= sm_ll_init(ll
, tm
);
654 ll
->load_ie
= disk_ll_load_ie
;
655 ll
->save_ie
= disk_ll_save_ie
;
656 ll
->init_index
= disk_ll_init_index
;
657 ll
->open_index
= disk_ll_open
;
658 ll
->max_entries
= disk_ll_max_entries
;
659 ll
->commit
= disk_ll_commit
;
662 ll
->nr_allocated
= 0;
664 r
= ll
->init_index(ll
);
668 r
= dm_btree_empty(&ll
->ref_count_info
, &ll
->ref_count_root
);
675 int sm_ll_open_disk(struct ll_disk
*ll
, struct dm_transaction_manager
*tm
,
676 void *root_le
, size_t len
)
679 struct disk_sm_root
*smr
= root_le
;
681 if (len
< sizeof(struct disk_sm_root
)) {
682 DMERR("sm_metadata root too small");
686 r
= sm_ll_init(ll
, tm
);
690 ll
->load_ie
= disk_ll_load_ie
;
691 ll
->save_ie
= disk_ll_save_ie
;
692 ll
->init_index
= disk_ll_init_index
;
693 ll
->open_index
= disk_ll_open
;
694 ll
->max_entries
= disk_ll_max_entries
;
695 ll
->commit
= disk_ll_commit
;
697 ll
->nr_blocks
= le64_to_cpu(smr
->nr_blocks
);
698 ll
->nr_allocated
= le64_to_cpu(smr
->nr_allocated
);
699 ll
->bitmap_root
= le64_to_cpu(smr
->bitmap_root
);
700 ll
->ref_count_root
= le64_to_cpu(smr
->ref_count_root
);
702 return ll
->open_index(ll
);
705 /*----------------------------------------------------------------*/