Linux Audio

Check our new training course

Loading...
v6.2
 
   1/*
   2 * Copyright (C) 2011 Red Hat, Inc.
   3 *
   4 * This file is released under the GPL.
   5 */
   6
   7#include "dm-space-map-common.h"
   8#include "dm-transaction-manager.h"
   9#include "dm-btree-internal.h"
  10#include "dm-persistent-data-internal.h"
  11
  12#include <linux/bitops.h>
  13#include <linux/device-mapper.h>
  14
  15#define DM_MSG_PREFIX "space map common"
  16
  17/*----------------------------------------------------------------*/
  18
  19/*
  20 * Index validator.
  21 */
  22#define INDEX_CSUM_XOR 160478
  23
  24static void index_prepare_for_write(struct dm_block_validator *v,
  25				    struct dm_block *b,
  26				    size_t block_size)
  27{
  28	struct disk_metadata_index *mi_le = dm_block_data(b);
  29
  30	mi_le->blocknr = cpu_to_le64(dm_block_location(b));
  31	mi_le->csum = cpu_to_le32(dm_bm_checksum(&mi_le->padding,
  32						 block_size - sizeof(__le32),
  33						 INDEX_CSUM_XOR));
  34}
  35
  36static int index_check(struct dm_block_validator *v,
  37		       struct dm_block *b,
  38		       size_t block_size)
  39{
  40	struct disk_metadata_index *mi_le = dm_block_data(b);
  41	__le32 csum_disk;
  42
  43	if (dm_block_location(b) != le64_to_cpu(mi_le->blocknr)) {
  44		DMERR_LIMIT("index_check failed: blocknr %llu != wanted %llu",
  45			    le64_to_cpu(mi_le->blocknr), dm_block_location(b));
  46		return -ENOTBLK;
  47	}
  48
  49	csum_disk = cpu_to_le32(dm_bm_checksum(&mi_le->padding,
  50					       block_size - sizeof(__le32),
  51					       INDEX_CSUM_XOR));
  52	if (csum_disk != mi_le->csum) {
  53		DMERR_LIMIT("index_check failed: csum %u != wanted %u",
  54			    le32_to_cpu(csum_disk), le32_to_cpu(mi_le->csum));
  55		return -EILSEQ;
  56	}
  57
  58	return 0;
  59}
  60
  61static struct dm_block_validator index_validator = {
  62	.name = "index",
  63	.prepare_for_write = index_prepare_for_write,
  64	.check = index_check
  65};
  66
  67/*----------------------------------------------------------------*/
  68
  69/*
  70 * Bitmap validator
  71 */
  72#define BITMAP_CSUM_XOR 240779
  73
  74static void dm_bitmap_prepare_for_write(struct dm_block_validator *v,
  75					struct dm_block *b,
  76					size_t block_size)
  77{
  78	struct disk_bitmap_header *disk_header = dm_block_data(b);
  79
  80	disk_header->blocknr = cpu_to_le64(dm_block_location(b));
  81	disk_header->csum = cpu_to_le32(dm_bm_checksum(&disk_header->not_used,
  82						       block_size - sizeof(__le32),
  83						       BITMAP_CSUM_XOR));
  84}
  85
  86static int dm_bitmap_check(struct dm_block_validator *v,
  87			   struct dm_block *b,
  88			   size_t block_size)
  89{
  90	struct disk_bitmap_header *disk_header = dm_block_data(b);
  91	__le32 csum_disk;
  92
  93	if (dm_block_location(b) != le64_to_cpu(disk_header->blocknr)) {
  94		DMERR_LIMIT("bitmap check failed: blocknr %llu != wanted %llu",
  95			    le64_to_cpu(disk_header->blocknr), dm_block_location(b));
  96		return -ENOTBLK;
  97	}
  98
  99	csum_disk = cpu_to_le32(dm_bm_checksum(&disk_header->not_used,
 100					       block_size - sizeof(__le32),
 101					       BITMAP_CSUM_XOR));
 102	if (csum_disk != disk_header->csum) {
 103		DMERR_LIMIT("bitmap check failed: csum %u != wanted %u",
 104			    le32_to_cpu(csum_disk), le32_to_cpu(disk_header->csum));
 105		return -EILSEQ;
 106	}
 107
 108	return 0;
 109}
 110
 111static struct dm_block_validator dm_sm_bitmap_validator = {
 112	.name = "sm_bitmap",
 113	.prepare_for_write = dm_bitmap_prepare_for_write,
 114	.check = dm_bitmap_check,
 115};
 116
 117/*----------------------------------------------------------------*/
 118
 119#define ENTRIES_PER_WORD 32
 120#define ENTRIES_SHIFT	5
 121
 122static void *dm_bitmap_data(struct dm_block *b)
 123{
 124	return dm_block_data(b) + sizeof(struct disk_bitmap_header);
 125}
 126
 127#define WORD_MASK_HIGH 0xAAAAAAAAAAAAAAAAULL
 128
 129static unsigned dm_bitmap_word_used(void *addr, unsigned b)
 130{
 131	__le64 *words_le = addr;
 132	__le64 *w_le = words_le + (b >> ENTRIES_SHIFT);
 133
 134	uint64_t bits = le64_to_cpu(*w_le);
 135	uint64_t mask = (bits + WORD_MASK_HIGH + 1) & WORD_MASK_HIGH;
 136
 137	return !(~bits & mask);
 138}
 139
 140static unsigned sm_lookup_bitmap(void *addr, unsigned b)
 141{
 142	__le64 *words_le = addr;
 143	__le64 *w_le = words_le + (b >> ENTRIES_SHIFT);
 144	unsigned hi, lo;
 145
 146	b = (b & (ENTRIES_PER_WORD - 1)) << 1;
 147	hi = !!test_bit_le(b, (void *) w_le);
 148	lo = !!test_bit_le(b + 1, (void *) w_le);
 149	return (hi << 1) | lo;
 150}
 151
 152static void sm_set_bitmap(void *addr, unsigned b, unsigned val)
 153{
 154	__le64 *words_le = addr;
 155	__le64 *w_le = words_le + (b >> ENTRIES_SHIFT);
 156
 157	b = (b & (ENTRIES_PER_WORD - 1)) << 1;
 158
 159	if (val & 2)
 160		__set_bit_le(b, (void *) w_le);
 161	else
 162		__clear_bit_le(b, (void *) w_le);
 163
 164	if (val & 1)
 165		__set_bit_le(b + 1, (void *) w_le);
 166	else
 167		__clear_bit_le(b + 1, (void *) w_le);
 168}
 169
 170static int sm_find_free(void *addr, unsigned begin, unsigned end,
 171			unsigned *result)
 172{
 173	while (begin < end) {
 174		if (!(begin & (ENTRIES_PER_WORD - 1)) &&
 175		    dm_bitmap_word_used(addr, begin)) {
 176			begin += ENTRIES_PER_WORD;
 177			continue;
 178		}
 179
 180		if (!sm_lookup_bitmap(addr, begin)) {
 181			*result = begin;
 182			return 0;
 183		}
 184
 185		begin++;
 186	}
 187
 188	return -ENOSPC;
 189}
 190
 191/*----------------------------------------------------------------*/
 192
 193static int sm_ll_init(struct ll_disk *ll, struct dm_transaction_manager *tm)
 194{
 195	memset(ll, 0, sizeof(struct ll_disk));
 196
 197	ll->tm = tm;
 198
 199	ll->bitmap_info.tm = tm;
 200	ll->bitmap_info.levels = 1;
 201
 202	/*
 203	 * Because the new bitmap blocks are created via a shadow
 204	 * operation, the old entry has already had its reference count
 205	 * decremented and we don't need the btree to do any bookkeeping.
 206	 */
 207	ll->bitmap_info.value_type.size = sizeof(struct disk_index_entry);
 208	ll->bitmap_info.value_type.inc = NULL;
 209	ll->bitmap_info.value_type.dec = NULL;
 210	ll->bitmap_info.value_type.equal = NULL;
 211
 212	ll->ref_count_info.tm = tm;
 213	ll->ref_count_info.levels = 1;
 214	ll->ref_count_info.value_type.size = sizeof(uint32_t);
 215	ll->ref_count_info.value_type.inc = NULL;
 216	ll->ref_count_info.value_type.dec = NULL;
 217	ll->ref_count_info.value_type.equal = NULL;
 218
 219	ll->block_size = dm_bm_block_size(dm_tm_get_bm(tm));
 220
 221	if (ll->block_size > (1 << 30)) {
 222		DMERR("block size too big to hold bitmaps");
 223		return -EINVAL;
 224	}
 225
 226	ll->entries_per_block = (ll->block_size - sizeof(struct disk_bitmap_header)) *
 227		ENTRIES_PER_BYTE;
 228	ll->nr_blocks = 0;
 229	ll->bitmap_root = 0;
 230	ll->ref_count_root = 0;
 231	ll->bitmap_index_changed = false;
 232
 233	return 0;
 234}
 235
 236int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks)
 237{
 238	int r;
 239	dm_block_t i, nr_blocks, nr_indexes;
 240	unsigned old_blocks, blocks;
 241
 242	nr_blocks = ll->nr_blocks + extra_blocks;
 243	old_blocks = dm_sector_div_up(ll->nr_blocks, ll->entries_per_block);
 244	blocks = dm_sector_div_up(nr_blocks, ll->entries_per_block);
 245
 246	nr_indexes = dm_sector_div_up(nr_blocks, ll->entries_per_block);
 247	if (nr_indexes > ll->max_entries(ll)) {
 248		DMERR("space map too large");
 249		return -EINVAL;
 250	}
 251
 252	/*
 253	 * We need to set this before the dm_tm_new_block() call below.
 254	 */
 255	ll->nr_blocks = nr_blocks;
 256	for (i = old_blocks; i < blocks; i++) {
 257		struct dm_block *b;
 258		struct disk_index_entry idx;
 259
 260		r = dm_tm_new_block(ll->tm, &dm_sm_bitmap_validator, &b);
 261		if (r < 0)
 262			return r;
 263
 264		idx.blocknr = cpu_to_le64(dm_block_location(b));
 265
 266		dm_tm_unlock(ll->tm, b);
 267
 268		idx.nr_free = cpu_to_le32(ll->entries_per_block);
 269		idx.none_free_before = 0;
 270
 271		r = ll->save_ie(ll, i, &idx);
 272		if (r < 0)
 273			return r;
 274	}
 275
 276	return 0;
 277}
 278
 279int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result)
 280{
 281	int r;
 282	dm_block_t index = b;
 283	struct disk_index_entry ie_disk;
 284	struct dm_block *blk;
 285
 286	if (b >= ll->nr_blocks) {
 287		DMERR_LIMIT("metadata block out of bounds");
 288		return -EINVAL;
 289	}
 290
 291	b = do_div(index, ll->entries_per_block);
 292	r = ll->load_ie(ll, index, &ie_disk);
 293	if (r < 0)
 294		return r;
 295
 296	r = dm_tm_read_lock(ll->tm, le64_to_cpu(ie_disk.blocknr),
 297			    &dm_sm_bitmap_validator, &blk);
 298	if (r < 0)
 299		return r;
 300
 301	*result = sm_lookup_bitmap(dm_bitmap_data(blk), b);
 302
 303	dm_tm_unlock(ll->tm, blk);
 304
 305	return 0;
 306}
 307
 308static int sm_ll_lookup_big_ref_count(struct ll_disk *ll, dm_block_t b,
 309				      uint32_t *result)
 310{
 311	__le32 le_rc;
 312	int r;
 313
 314	r = dm_btree_lookup(&ll->ref_count_info, ll->ref_count_root, &b, &le_rc);
 315	if (r < 0)
 316		return r;
 317
 318	*result = le32_to_cpu(le_rc);
 319
 320	return r;
 321}
 322
 323int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result)
 324{
 325	int r = sm_ll_lookup_bitmap(ll, b, result);
 326
 327	if (r)
 328		return r;
 329
 330	if (*result != 3)
 331		return r;
 332
 333	return sm_ll_lookup_big_ref_count(ll, b, result);
 334}
 335
 336int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin,
 337			  dm_block_t end, dm_block_t *result)
 338{
 339	int r;
 340	struct disk_index_entry ie_disk;
 341	dm_block_t i, index_begin = begin;
 342	dm_block_t index_end = dm_sector_div_up(end, ll->entries_per_block);
 343
 344	/*
 345	 * FIXME: Use shifts
 346	 */
 347	begin = do_div(index_begin, ll->entries_per_block);
 348	end = do_div(end, ll->entries_per_block);
 349	if (end == 0)
 350		end = ll->entries_per_block;
 351
 352	for (i = index_begin; i < index_end; i++, begin = 0) {
 353		struct dm_block *blk;
 354		unsigned position;
 355		uint32_t bit_end;
 356
 357		r = ll->load_ie(ll, i, &ie_disk);
 358		if (r < 0)
 359			return r;
 360
 361		if (le32_to_cpu(ie_disk.nr_free) == 0)
 362			continue;
 363
 364		r = dm_tm_read_lock(ll->tm, le64_to_cpu(ie_disk.blocknr),
 365				    &dm_sm_bitmap_validator, &blk);
 366		if (r < 0)
 367			return r;
 368
 369		bit_end = (i == index_end - 1) ?  end : ll->entries_per_block;
 370
 371		r = sm_find_free(dm_bitmap_data(blk),
 372				 max_t(unsigned, begin, le32_to_cpu(ie_disk.none_free_before)),
 373				 bit_end, &position);
 374		if (r == -ENOSPC) {
 375			/*
 376			 * This might happen because we started searching
 377			 * part way through the bitmap.
 378			 */
 379			dm_tm_unlock(ll->tm, blk);
 380			continue;
 381		}
 382
 383		dm_tm_unlock(ll->tm, blk);
 384
 385		*result = i * ll->entries_per_block + (dm_block_t) position;
 386		return 0;
 387	}
 388
 389	return -ENOSPC;
 390}
 391
 392int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll,
 393	                         dm_block_t begin, dm_block_t end, dm_block_t *b)
 394{
 395	int r;
 396	uint32_t count;
 397
 398	do {
 399		r = sm_ll_find_free_block(new_ll, begin, new_ll->nr_blocks, b);
 400		if (r)
 401			break;
 402
 403		/* double check this block wasn't used in the old transaction */
 404		if (*b >= old_ll->nr_blocks)
 405			count = 0;
 406		else {
 407			r = sm_ll_lookup(old_ll, *b, &count);
 408			if (r)
 409				break;
 410
 411			if (count)
 412				begin = *b + 1;
 413		}
 414	} while (count);
 415
 416	return r;
 417}
 418
 419/*----------------------------------------------------------------*/
 420
 421int sm_ll_insert(struct ll_disk *ll, dm_block_t b,
 422		 uint32_t ref_count, int32_t *nr_allocations)
 423{
 424	int r;
 425	uint32_t bit, old;
 426	struct dm_block *nb;
 427	dm_block_t index = b;
 428	struct disk_index_entry ie_disk;
 429	void *bm_le;
 430	int inc;
 431
 432	bit = do_div(index, ll->entries_per_block);
 433	r = ll->load_ie(ll, index, &ie_disk);
 434	if (r < 0)
 435		return r;
 436
 437	r = dm_tm_shadow_block(ll->tm, le64_to_cpu(ie_disk.blocknr),
 438			       &dm_sm_bitmap_validator, &nb, &inc);
 439	if (r < 0) {
 440		DMERR("dm_tm_shadow_block() failed");
 441		return r;
 442	}
 443	ie_disk.blocknr = cpu_to_le64(dm_block_location(nb));
 444	bm_le = dm_bitmap_data(nb);
 445
 446	old = sm_lookup_bitmap(bm_le, bit);
 447	if (old > 2) {
 448		r = sm_ll_lookup_big_ref_count(ll, b, &old);
 449		if (r < 0) {
 450			dm_tm_unlock(ll->tm, nb);
 451			return r;
 452		}
 453	}
 454
 455	if (r) {
 456		dm_tm_unlock(ll->tm, nb);
 457		return r;
 458	}
 459
 460	if (ref_count <= 2) {
 461		sm_set_bitmap(bm_le, bit, ref_count);
 462		dm_tm_unlock(ll->tm, nb);
 463
 464		if (old > 2) {
 465			r = dm_btree_remove(&ll->ref_count_info,
 466					    ll->ref_count_root,
 467					    &b, &ll->ref_count_root);
 468			if (r)
 469				return r;
 470		}
 471
 472	} else {
 473		__le32 le_rc = cpu_to_le32(ref_count);
 474
 475		sm_set_bitmap(bm_le, bit, 3);
 476		dm_tm_unlock(ll->tm, nb);
 477
 478		__dm_bless_for_disk(&le_rc);
 479		r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root,
 480				    &b, &le_rc, &ll->ref_count_root);
 481		if (r < 0) {
 482			DMERR("ref count insert failed");
 483			return r;
 484		}
 485	}
 486
 487	if (ref_count && !old) {
 488		*nr_allocations = 1;
 489		ll->nr_allocated++;
 490		le32_add_cpu(&ie_disk.nr_free, -1);
 491		if (le32_to_cpu(ie_disk.none_free_before) == bit)
 492			ie_disk.none_free_before = cpu_to_le32(bit + 1);
 493
 494	} else if (old && !ref_count) {
 495		*nr_allocations = -1;
 496		ll->nr_allocated--;
 497		le32_add_cpu(&ie_disk.nr_free, 1);
 498		ie_disk.none_free_before = cpu_to_le32(min(le32_to_cpu(ie_disk.none_free_before), bit));
 499	} else
 500		*nr_allocations = 0;
 501
 502	return ll->save_ie(ll, index, &ie_disk);
 503}
 504
 505/*----------------------------------------------------------------*/
 506
 507/*
 508 * Holds useful intermediate results for the range based inc and dec
 509 * operations.
 510 */
 511struct inc_context {
 512	struct disk_index_entry ie_disk;
 513	struct dm_block *bitmap_block;
 514	void *bitmap;
 515
 516	struct dm_block *overflow_leaf;
 517};
 518
 519static inline void init_inc_context(struct inc_context *ic)
 520{
 521	ic->bitmap_block = NULL;
 522	ic->bitmap = NULL;
 523	ic->overflow_leaf = NULL;
 524}
 525
 526static inline void exit_inc_context(struct ll_disk *ll, struct inc_context *ic)
 527{
 528	if (ic->bitmap_block)
 529		dm_tm_unlock(ll->tm, ic->bitmap_block);
 530	if (ic->overflow_leaf)
 531		dm_tm_unlock(ll->tm, ic->overflow_leaf);
 532}
 533
 534static inline void reset_inc_context(struct ll_disk *ll, struct inc_context *ic)
 535{
 536	exit_inc_context(ll, ic);
 537	init_inc_context(ic);
 538}
 539
 540/*
 541 * Confirms a btree node contains a particular key at an index.
 542 */
 543static bool contains_key(struct btree_node *n, uint64_t key, int index)
 544{
 545	return index >= 0 &&
 546		index < le32_to_cpu(n->header.nr_entries) &&
 547		le64_to_cpu(n->keys[index]) == key;
 548}
 549
 550static int __sm_ll_inc_overflow(struct ll_disk *ll, dm_block_t b, struct inc_context *ic)
 551{
 552	int r;
 553	int index;
 554	struct btree_node *n;
 555	__le32 *v_ptr;
 556	uint32_t rc;
 557
 558	/*
 559	 * bitmap_block needs to be unlocked because getting the
 560	 * overflow_leaf may need to allocate, and thus use the space map.
 561	 */
 562	reset_inc_context(ll, ic);
 563
 564	r = btree_get_overwrite_leaf(&ll->ref_count_info, ll->ref_count_root,
 565				     b, &index, &ll->ref_count_root, &ic->overflow_leaf);
 566	if (r < 0)
 567		return r;
 568
 569	n = dm_block_data(ic->overflow_leaf);
 570
 571	if (!contains_key(n, b, index)) {
 572		DMERR("overflow btree is missing an entry");
 573		return -EINVAL;
 574	}
 575
 576	v_ptr = value_ptr(n, index);
 577	rc = le32_to_cpu(*v_ptr) + 1;
 578	*v_ptr = cpu_to_le32(rc);
 579
 580	return 0;
 581}
 582
 583static int sm_ll_inc_overflow(struct ll_disk *ll, dm_block_t b, struct inc_context *ic)
 584{
 585	int index;
 586	struct btree_node *n;
 587	__le32 *v_ptr;
 588	uint32_t rc;
 589
 590	/*
 591	 * Do we already have the correct overflow leaf?
 592	 */
 593	if (ic->overflow_leaf) {
 594		n = dm_block_data(ic->overflow_leaf);
 595		index = lower_bound(n, b);
 596		if (contains_key(n, b, index)) {
 597			v_ptr = value_ptr(n, index);
 598			rc = le32_to_cpu(*v_ptr) + 1;
 599			*v_ptr = cpu_to_le32(rc);
 600
 601			return 0;
 602		}
 603	}
 604
 605	return __sm_ll_inc_overflow(ll, b, ic);
 606}
 607
 608static inline int shadow_bitmap(struct ll_disk *ll, struct inc_context *ic)
 609{
 610	int r, inc;
 
 611	r = dm_tm_shadow_block(ll->tm, le64_to_cpu(ic->ie_disk.blocknr),
 612			       &dm_sm_bitmap_validator, &ic->bitmap_block, &inc);
 613	if (r < 0) {
 614		DMERR("dm_tm_shadow_block() failed");
 615		return r;
 616	}
 617	ic->ie_disk.blocknr = cpu_to_le64(dm_block_location(ic->bitmap_block));
 618	ic->bitmap = dm_bitmap_data(ic->bitmap_block);
 619	return 0;
 620}
 621
 622/*
 623 * Once shadow_bitmap has been called, which always happens at the start of inc/dec,
 624 * we can reopen the bitmap with a simple write lock, rather than re calling
 625 * dm_tm_shadow_block().
 626 */
 627static inline int ensure_bitmap(struct ll_disk *ll, struct inc_context *ic)
 628{
 629	if (!ic->bitmap_block) {
 630		int r = dm_bm_write_lock(dm_tm_get_bm(ll->tm), le64_to_cpu(ic->ie_disk.blocknr),
 631					 &dm_sm_bitmap_validator, &ic->bitmap_block);
 632		if (r) {
 633			DMERR("unable to re-get write lock for bitmap");
 634			return r;
 635		}
 636		ic->bitmap = dm_bitmap_data(ic->bitmap_block);
 637	}
 638
 639	return 0;
 640}
 641
 642/*
 643 * Loops round incrementing entries in a single bitmap.
 644 */
 645static inline int sm_ll_inc_bitmap(struct ll_disk *ll, dm_block_t b,
 646				   uint32_t bit, uint32_t bit_end,
 647				   int32_t *nr_allocations, dm_block_t *new_b,
 648				   struct inc_context *ic)
 649{
 650	int r;
 651	__le32 le_rc;
 652	uint32_t old;
 653
 654	for (; bit != bit_end; bit++, b++) {
 655		/*
 656		 * We only need to drop the bitmap if we need to find a new btree
 657		 * leaf for the overflow.  So if it was dropped last iteration,
 658		 * we now re-get it.
 659		 */
 660		r = ensure_bitmap(ll, ic);
 661		if (r)
 662			return r;
 663
 664		old = sm_lookup_bitmap(ic->bitmap, bit);
 665		switch (old) {
 666		case 0:
 667			/* inc bitmap, adjust nr_allocated */
 668			sm_set_bitmap(ic->bitmap, bit, 1);
 669			(*nr_allocations)++;
 670			ll->nr_allocated++;
 671			le32_add_cpu(&ic->ie_disk.nr_free, -1);
 672			if (le32_to_cpu(ic->ie_disk.none_free_before) == bit)
 673				ic->ie_disk.none_free_before = cpu_to_le32(bit + 1);
 674			break;
 675
 676		case 1:
 677			/* inc bitmap */
 678			sm_set_bitmap(ic->bitmap, bit, 2);
 679			break;
 680
 681		case 2:
 682			/* inc bitmap and insert into overflow */
 683			sm_set_bitmap(ic->bitmap, bit, 3);
 684			reset_inc_context(ll, ic);
 685
 686			le_rc = cpu_to_le32(3);
 687			__dm_bless_for_disk(&le_rc);
 688			r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root,
 689					    &b, &le_rc, &ll->ref_count_root);
 690			if (r < 0) {
 691				DMERR("ref count insert failed");
 692				return r;
 693			}
 694			break;
 695
 696		default:
 697			/*
 698			 * inc within the overflow tree only.
 699			 */
 700			r = sm_ll_inc_overflow(ll, b, ic);
 701			if (r < 0)
 702				return r;
 703		}
 704	}
 705
 706	*new_b = b;
 707	return 0;
 708}
 709
 710/*
 711 * Finds a bitmap that contains entries in the block range, and increments
 712 * them.
 713 */
 714static int __sm_ll_inc(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 715		       int32_t *nr_allocations, dm_block_t *new_b)
 716{
 717	int r;
 718	struct inc_context ic;
 719	uint32_t bit, bit_end;
 720	dm_block_t index = b;
 721
 722	init_inc_context(&ic);
 723
 724	bit = do_div(index, ll->entries_per_block);
 725	r = ll->load_ie(ll, index, &ic.ie_disk);
 726	if (r < 0)
 727		return r;
 728
 729	r = shadow_bitmap(ll, &ic);
 730	if (r)
 731		return r;
 732
 733	bit_end = min(bit + (e - b), (dm_block_t) ll->entries_per_block);
 734	r = sm_ll_inc_bitmap(ll, b, bit, bit_end, nr_allocations, new_b, &ic);
 735
 736	exit_inc_context(ll, &ic);
 737
 738	if (r)
 739		return r;
 740
 741	return ll->save_ie(ll, index, &ic.ie_disk);
 742}
 743
 744int sm_ll_inc(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 745	      int32_t *nr_allocations)
 746{
 747	*nr_allocations = 0;
 748	while (b != e) {
 749		int r = __sm_ll_inc(ll, b, e, nr_allocations, &b);
 
 750		if (r)
 751			return r;
 752	}
 753
 754	return 0;
 755}
 756
 757/*----------------------------------------------------------------*/
 758
 759static int __sm_ll_del_overflow(struct ll_disk *ll, dm_block_t b,
 760				struct inc_context *ic)
 761{
 762	reset_inc_context(ll, ic);
 763	return dm_btree_remove(&ll->ref_count_info, ll->ref_count_root,
 764			       &b, &ll->ref_count_root);
 765}
 766
 767static int __sm_ll_dec_overflow(struct ll_disk *ll, dm_block_t b,
 768				struct inc_context *ic, uint32_t *old_rc)
 769{
 770	int r;
 771	int index = -1;
 772	struct btree_node *n;
 773	__le32 *v_ptr;
 774	uint32_t rc;
 775
 776	reset_inc_context(ll, ic);
 777	r = btree_get_overwrite_leaf(&ll->ref_count_info, ll->ref_count_root,
 778				     b, &index, &ll->ref_count_root, &ic->overflow_leaf);
 779	if (r < 0)
 780		return r;
 781
 782	n = dm_block_data(ic->overflow_leaf);
 783
 784	if (!contains_key(n, b, index)) {
 785		DMERR("overflow btree is missing an entry");
 786		return -EINVAL;
 787	}
 788
 789	v_ptr = value_ptr(n, index);
 790	rc = le32_to_cpu(*v_ptr);
 791	*old_rc = rc;
 792
 793	if (rc == 3) {
 794		return __sm_ll_del_overflow(ll, b, ic);
 795	} else {
 796		rc--;
 797		*v_ptr = cpu_to_le32(rc);
 798		return 0;
 799	}
 800}
 801
 802static int sm_ll_dec_overflow(struct ll_disk *ll, dm_block_t b,
 803			      struct inc_context *ic, uint32_t *old_rc)
 804{
 805	/*
 806	 * Do we already have the correct overflow leaf?
 807	 */
 808	if (ic->overflow_leaf) {
 809		int index;
 810		struct btree_node *n;
 811		__le32 *v_ptr;
 812		uint32_t rc;
 813
 814		n = dm_block_data(ic->overflow_leaf);
 815		index = lower_bound(n, b);
 816		if (contains_key(n, b, index)) {
 817			v_ptr = value_ptr(n, index);
 818			rc = le32_to_cpu(*v_ptr);
 819			*old_rc = rc;
 820
 821			if (rc > 3) {
 822				rc--;
 823				*v_ptr = cpu_to_le32(rc);
 824				return 0;
 825			} else {
 826				return __sm_ll_del_overflow(ll, b, ic);
 827			}
 828
 829		}
 830	}
 831
 832	return __sm_ll_dec_overflow(ll, b, ic, old_rc);
 833}
 834
 835/*
 836 * Loops round incrementing entries in a single bitmap.
 837 */
 838static inline int sm_ll_dec_bitmap(struct ll_disk *ll, dm_block_t b,
 839				   uint32_t bit, uint32_t bit_end,
 840				   struct inc_context *ic,
 841				   int32_t *nr_allocations, dm_block_t *new_b)
 842{
 843	int r;
 844	uint32_t old;
 845
 846	for (; bit != bit_end; bit++, b++) {
 847		/*
 848		 * We only need to drop the bitmap if we need to find a new btree
 849		 * leaf for the overflow.  So if it was dropped last iteration,
 850		 * we now re-get it.
 851		 */
 852		r = ensure_bitmap(ll, ic);
 853		if (r)
 854			return r;
 855
 856		old = sm_lookup_bitmap(ic->bitmap, bit);
 857		switch (old) {
 858		case 0:
 859			DMERR("unable to decrement block");
 860			return -EINVAL;
 861
 862		case 1:
 863			/* dec bitmap */
 864			sm_set_bitmap(ic->bitmap, bit, 0);
 865			(*nr_allocations)--;
 866			ll->nr_allocated--;
 867			le32_add_cpu(&ic->ie_disk.nr_free, 1);
 868			ic->ie_disk.none_free_before =
 869				cpu_to_le32(min(le32_to_cpu(ic->ie_disk.none_free_before), bit));
 870			break;
 871
 872		case 2:
 873			/* dec bitmap and insert into overflow */
 874			sm_set_bitmap(ic->bitmap, bit, 1);
 875			break;
 876
 877		case 3:
 878			r = sm_ll_dec_overflow(ll, b, ic, &old);
 879			if (r < 0)
 880				return r;
 881
 882			if (old == 3) {
 883				r = ensure_bitmap(ll, ic);
 884				if (r)
 885					return r;
 886
 887				sm_set_bitmap(ic->bitmap, bit, 2);
 888			}
 889			break;
 890		}
 891	}
 892
 893	*new_b = b;
 894	return 0;
 895}
 896
 897static int __sm_ll_dec(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 898		       int32_t *nr_allocations, dm_block_t *new_b)
 899{
 900	int r;
 901	uint32_t bit, bit_end;
 902	struct inc_context ic;
 903	dm_block_t index = b;
 904
 905	init_inc_context(&ic);
 906
 907	bit = do_div(index, ll->entries_per_block);
 908	r = ll->load_ie(ll, index, &ic.ie_disk);
 909	if (r < 0)
 910		return r;
 911
 912	r = shadow_bitmap(ll, &ic);
 913	if (r)
 914		return r;
 915
 916	bit_end = min(bit + (e - b), (dm_block_t) ll->entries_per_block);
 917	r = sm_ll_dec_bitmap(ll, b, bit, bit_end, &ic, nr_allocations, new_b);
 918	exit_inc_context(ll, &ic);
 919
 920	if (r)
 921		return r;
 922
 923	return ll->save_ie(ll, index, &ic.ie_disk);
 924}
 925
 926int sm_ll_dec(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 927	      int32_t *nr_allocations)
 928{
 929	*nr_allocations = 0;
 930	while (b != e) {
 931		int r = __sm_ll_dec(ll, b, e, nr_allocations, &b);
 
 932		if (r)
 933			return r;
 934	}
 935
 936	return 0;
 937}
 938
 939/*----------------------------------------------------------------*/
 940
 941int sm_ll_commit(struct ll_disk *ll)
 942{
 943	int r = 0;
 944
 945	if (ll->bitmap_index_changed) {
 946		r = ll->commit(ll);
 947		if (!r)
 948			ll->bitmap_index_changed = false;
 949	}
 950
 951	return r;
 952}
 953
 954/*----------------------------------------------------------------*/
 955
 956static int metadata_ll_load_ie(struct ll_disk *ll, dm_block_t index,
 957			       struct disk_index_entry *ie)
 958{
 959	memcpy(ie, ll->mi_le.index + index, sizeof(*ie));
 960	return 0;
 961}
 962
 963static int metadata_ll_save_ie(struct ll_disk *ll, dm_block_t index,
 964			       struct disk_index_entry *ie)
 965{
 966	ll->bitmap_index_changed = true;
 967	memcpy(ll->mi_le.index + index, ie, sizeof(*ie));
 968	return 0;
 969}
 970
 971static int metadata_ll_init_index(struct ll_disk *ll)
 972{
 973	int r;
 974	struct dm_block *b;
 975
 976	r = dm_tm_new_block(ll->tm, &index_validator, &b);
 977	if (r < 0)
 978		return r;
 979
 980	ll->bitmap_root = dm_block_location(b);
 981
 982	dm_tm_unlock(ll->tm, b);
 983
 984	return 0;
 985}
 986
 987static int metadata_ll_open(struct ll_disk *ll)
 988{
 989	int r;
 990	struct dm_block *block;
 991
 992	r = dm_tm_read_lock(ll->tm, ll->bitmap_root,
 993			    &index_validator, &block);
 994	if (r)
 995		return r;
 996
 997	memcpy(&ll->mi_le, dm_block_data(block), sizeof(ll->mi_le));
 998	dm_tm_unlock(ll->tm, block);
 999
1000	return 0;
1001}
1002
1003static dm_block_t metadata_ll_max_entries(struct ll_disk *ll)
1004{
1005	return MAX_METADATA_BITMAPS;
1006}
1007
1008static int metadata_ll_commit(struct ll_disk *ll)
1009{
1010	int r, inc;
1011	struct dm_block *b;
1012
1013	r = dm_tm_shadow_block(ll->tm, ll->bitmap_root, &index_validator, &b, &inc);
1014	if (r)
1015		return r;
1016
1017	memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le));
1018	ll->bitmap_root = dm_block_location(b);
1019
1020	dm_tm_unlock(ll->tm, b);
1021
1022	return 0;
1023}
1024
1025int sm_ll_new_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm)
1026{
1027	int r;
1028
1029	r = sm_ll_init(ll, tm);
1030	if (r < 0)
1031		return r;
1032
1033	ll->load_ie = metadata_ll_load_ie;
1034	ll->save_ie = metadata_ll_save_ie;
1035	ll->init_index = metadata_ll_init_index;
1036	ll->open_index = metadata_ll_open;
1037	ll->max_entries = metadata_ll_max_entries;
1038	ll->commit = metadata_ll_commit;
1039
1040	ll->nr_blocks = 0;
1041	ll->nr_allocated = 0;
1042
1043	r = ll->init_index(ll);
1044	if (r < 0)
1045		return r;
1046
1047	r = dm_btree_empty(&ll->ref_count_info, &ll->ref_count_root);
1048	if (r < 0)
1049		return r;
1050
1051	return 0;
1052}
1053
1054int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm,
1055			void *root_le, size_t len)
1056{
1057	int r;
1058	struct disk_sm_root smr;
1059
1060	if (len < sizeof(struct disk_sm_root)) {
1061		DMERR("sm_metadata root too small");
1062		return -ENOMEM;
1063	}
1064
1065	/*
1066	 * We don't know the alignment of the root_le buffer, so need to
1067	 * copy into a new structure.
1068	 */
1069	memcpy(&smr, root_le, sizeof(smr));
1070
1071	r = sm_ll_init(ll, tm);
1072	if (r < 0)
1073		return r;
1074
1075	ll->load_ie = metadata_ll_load_ie;
1076	ll->save_ie = metadata_ll_save_ie;
1077	ll->init_index = metadata_ll_init_index;
1078	ll->open_index = metadata_ll_open;
1079	ll->max_entries = metadata_ll_max_entries;
1080	ll->commit = metadata_ll_commit;
1081
1082	ll->nr_blocks = le64_to_cpu(smr.nr_blocks);
1083	ll->nr_allocated = le64_to_cpu(smr.nr_allocated);
1084	ll->bitmap_root = le64_to_cpu(smr.bitmap_root);
1085	ll->ref_count_root = le64_to_cpu(smr.ref_count_root);
1086
1087	return ll->open_index(ll);
1088}
1089
1090/*----------------------------------------------------------------*/
1091
1092static inline int ie_cache_writeback(struct ll_disk *ll, struct ie_cache *iec)
1093{
1094	iec->dirty = false;
1095	__dm_bless_for_disk(iec->ie);
1096	return dm_btree_insert(&ll->bitmap_info, ll->bitmap_root,
1097			       &iec->index, &iec->ie, &ll->bitmap_root);
1098}
1099
1100static inline unsigned hash_index(dm_block_t index)
1101{
1102	return dm_hash_block(index, IE_CACHE_MASK);
1103}
1104
1105static int disk_ll_load_ie(struct ll_disk *ll, dm_block_t index,
1106			   struct disk_index_entry *ie)
1107{
1108	int r;
1109	unsigned h = hash_index(index);
1110	struct ie_cache *iec = ll->ie_cache + h;
1111
1112	if (iec->valid) {
1113		if (iec->index == index) {
1114			memcpy(ie, &iec->ie, sizeof(*ie));
1115			return 0;
1116		}
1117
1118		if (iec->dirty) {
1119			r = ie_cache_writeback(ll, iec);
1120			if (r)
1121				return r;
1122		}
1123	}
1124
1125	r = dm_btree_lookup(&ll->bitmap_info, ll->bitmap_root, &index, ie);
1126	if (!r) {
1127		iec->valid = true;
1128		iec->dirty = false;
1129		iec->index = index;
1130		memcpy(&iec->ie, ie, sizeof(*ie));
1131	}
1132
1133	return r;
1134}
1135
1136static int disk_ll_save_ie(struct ll_disk *ll, dm_block_t index,
1137			   struct disk_index_entry *ie)
1138{
1139	int r;
1140	unsigned h = hash_index(index);
1141	struct ie_cache *iec = ll->ie_cache + h;
1142
1143	ll->bitmap_index_changed = true;
1144	if (iec->valid) {
1145		if (iec->index == index) {
1146			memcpy(&iec->ie, ie, sizeof(*ie));
1147			iec->dirty = true;
1148			return 0;
1149		}
1150
1151		if (iec->dirty) {
1152			r = ie_cache_writeback(ll, iec);
1153			if (r)
1154				return r;
1155		}
1156	}
1157
1158	iec->valid = true;
1159	iec->dirty = true;
1160	iec->index = index;
1161	memcpy(&iec->ie, ie, sizeof(*ie));
1162	return 0;
1163}
1164
1165static int disk_ll_init_index(struct ll_disk *ll)
1166{
1167	unsigned i;
 
1168	for (i = 0; i < IE_CACHE_SIZE; i++) {
1169		struct ie_cache *iec = ll->ie_cache + i;
 
1170		iec->valid = false;
1171		iec->dirty = false;
1172	}
1173	return dm_btree_empty(&ll->bitmap_info, &ll->bitmap_root);
1174}
1175
1176static int disk_ll_open(struct ll_disk *ll)
1177{
1178	return 0;
1179}
1180
1181static dm_block_t disk_ll_max_entries(struct ll_disk *ll)
1182{
1183	return -1ULL;
1184}
1185
1186static int disk_ll_commit(struct ll_disk *ll)
1187{
1188	int r = 0;
1189	unsigned i;
1190
1191	for (i = 0; i < IE_CACHE_SIZE; i++) {
1192		struct ie_cache *iec = ll->ie_cache + i;
 
1193		if (iec->valid && iec->dirty)
1194			r = ie_cache_writeback(ll, iec);
1195	}
1196
1197	return r;
1198}
1199
1200int sm_ll_new_disk(struct ll_disk *ll, struct dm_transaction_manager *tm)
1201{
1202	int r;
1203
1204	r = sm_ll_init(ll, tm);
1205	if (r < 0)
1206		return r;
1207
1208	ll->load_ie = disk_ll_load_ie;
1209	ll->save_ie = disk_ll_save_ie;
1210	ll->init_index = disk_ll_init_index;
1211	ll->open_index = disk_ll_open;
1212	ll->max_entries = disk_ll_max_entries;
1213	ll->commit = disk_ll_commit;
1214
1215	ll->nr_blocks = 0;
1216	ll->nr_allocated = 0;
1217
1218	r = ll->init_index(ll);
1219	if (r < 0)
1220		return r;
1221
1222	r = dm_btree_empty(&ll->ref_count_info, &ll->ref_count_root);
1223	if (r < 0)
1224		return r;
1225
1226	return 0;
1227}
1228
1229int sm_ll_open_disk(struct ll_disk *ll, struct dm_transaction_manager *tm,
1230		    void *root_le, size_t len)
1231{
1232	int r;
1233	struct disk_sm_root *smr = root_le;
1234
1235	if (len < sizeof(struct disk_sm_root)) {
1236		DMERR("sm_metadata root too small");
1237		return -ENOMEM;
1238	}
1239
1240	r = sm_ll_init(ll, tm);
1241	if (r < 0)
1242		return r;
1243
1244	ll->load_ie = disk_ll_load_ie;
1245	ll->save_ie = disk_ll_save_ie;
1246	ll->init_index = disk_ll_init_index;
1247	ll->open_index = disk_ll_open;
1248	ll->max_entries = disk_ll_max_entries;
1249	ll->commit = disk_ll_commit;
1250
1251	ll->nr_blocks = le64_to_cpu(smr->nr_blocks);
1252	ll->nr_allocated = le64_to_cpu(smr->nr_allocated);
1253	ll->bitmap_root = le64_to_cpu(smr->bitmap_root);
1254	ll->ref_count_root = le64_to_cpu(smr->ref_count_root);
1255
1256	return ll->open_index(ll);
1257}
1258
1259/*----------------------------------------------------------------*/
v6.8
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2011 Red Hat, Inc.
   4 *
   5 * This file is released under the GPL.
   6 */
   7
   8#include "dm-space-map-common.h"
   9#include "dm-transaction-manager.h"
  10#include "dm-btree-internal.h"
  11#include "dm-persistent-data-internal.h"
  12
  13#include <linux/bitops.h>
  14#include <linux/device-mapper.h>
  15
  16#define DM_MSG_PREFIX "space map common"
  17
  18/*----------------------------------------------------------------*/
  19
  20/*
  21 * Index validator.
  22 */
  23#define INDEX_CSUM_XOR 160478
  24
  25static void index_prepare_for_write(struct dm_block_validator *v,
  26				    struct dm_block *b,
  27				    size_t block_size)
  28{
  29	struct disk_metadata_index *mi_le = dm_block_data(b);
  30
  31	mi_le->blocknr = cpu_to_le64(dm_block_location(b));
  32	mi_le->csum = cpu_to_le32(dm_bm_checksum(&mi_le->padding,
  33						 block_size - sizeof(__le32),
  34						 INDEX_CSUM_XOR));
  35}
  36
  37static int index_check(struct dm_block_validator *v,
  38		       struct dm_block *b,
  39		       size_t block_size)
  40{
  41	struct disk_metadata_index *mi_le = dm_block_data(b);
  42	__le32 csum_disk;
  43
  44	if (dm_block_location(b) != le64_to_cpu(mi_le->blocknr)) {
  45		DMERR_LIMIT("%s failed: blocknr %llu != wanted %llu", __func__,
  46			    le64_to_cpu(mi_le->blocknr), dm_block_location(b));
  47		return -ENOTBLK;
  48	}
  49
  50	csum_disk = cpu_to_le32(dm_bm_checksum(&mi_le->padding,
  51					       block_size - sizeof(__le32),
  52					       INDEX_CSUM_XOR));
  53	if (csum_disk != mi_le->csum) {
  54		DMERR_LIMIT("i%s failed: csum %u != wanted %u", __func__,
  55			    le32_to_cpu(csum_disk), le32_to_cpu(mi_le->csum));
  56		return -EILSEQ;
  57	}
  58
  59	return 0;
  60}
  61
  62static struct dm_block_validator index_validator = {
  63	.name = "index",
  64	.prepare_for_write = index_prepare_for_write,
  65	.check = index_check
  66};
  67
  68/*----------------------------------------------------------------*/
  69
  70/*
  71 * Bitmap validator
  72 */
  73#define BITMAP_CSUM_XOR 240779
  74
  75static void dm_bitmap_prepare_for_write(struct dm_block_validator *v,
  76					struct dm_block *b,
  77					size_t block_size)
  78{
  79	struct disk_bitmap_header *disk_header = dm_block_data(b);
  80
  81	disk_header->blocknr = cpu_to_le64(dm_block_location(b));
  82	disk_header->csum = cpu_to_le32(dm_bm_checksum(&disk_header->not_used,
  83						       block_size - sizeof(__le32),
  84						       BITMAP_CSUM_XOR));
  85}
  86
  87static int dm_bitmap_check(struct dm_block_validator *v,
  88			   struct dm_block *b,
  89			   size_t block_size)
  90{
  91	struct disk_bitmap_header *disk_header = dm_block_data(b);
  92	__le32 csum_disk;
  93
  94	if (dm_block_location(b) != le64_to_cpu(disk_header->blocknr)) {
  95		DMERR_LIMIT("bitmap check failed: blocknr %llu != wanted %llu",
  96			    le64_to_cpu(disk_header->blocknr), dm_block_location(b));
  97		return -ENOTBLK;
  98	}
  99
 100	csum_disk = cpu_to_le32(dm_bm_checksum(&disk_header->not_used,
 101					       block_size - sizeof(__le32),
 102					       BITMAP_CSUM_XOR));
 103	if (csum_disk != disk_header->csum) {
 104		DMERR_LIMIT("bitmap check failed: csum %u != wanted %u",
 105			    le32_to_cpu(csum_disk), le32_to_cpu(disk_header->csum));
 106		return -EILSEQ;
 107	}
 108
 109	return 0;
 110}
 111
 112static struct dm_block_validator dm_sm_bitmap_validator = {
 113	.name = "sm_bitmap",
 114	.prepare_for_write = dm_bitmap_prepare_for_write,
 115	.check = dm_bitmap_check,
 116};
 117
 118/*----------------------------------------------------------------*/
 119
 120#define ENTRIES_PER_WORD 32
 121#define ENTRIES_SHIFT	5
 122
 123static void *dm_bitmap_data(struct dm_block *b)
 124{
 125	return dm_block_data(b) + sizeof(struct disk_bitmap_header);
 126}
 127
 128#define WORD_MASK_HIGH 0xAAAAAAAAAAAAAAAAULL
 129
 130static unsigned int dm_bitmap_word_used(void *addr, unsigned int b)
 131{
 132	__le64 *words_le = addr;
 133	__le64 *w_le = words_le + (b >> ENTRIES_SHIFT);
 134
 135	uint64_t bits = le64_to_cpu(*w_le);
 136	uint64_t mask = (bits + WORD_MASK_HIGH + 1) & WORD_MASK_HIGH;
 137
 138	return !(~bits & mask);
 139}
 140
 141static unsigned int sm_lookup_bitmap(void *addr, unsigned int b)
 142{
 143	__le64 *words_le = addr;
 144	__le64 *w_le = words_le + (b >> ENTRIES_SHIFT);
 145	unsigned int hi, lo;
 146
 147	b = (b & (ENTRIES_PER_WORD - 1)) << 1;
 148	hi = !!test_bit_le(b, (void *) w_le);
 149	lo = !!test_bit_le(b + 1, (void *) w_le);
 150	return (hi << 1) | lo;
 151}
 152
 153static void sm_set_bitmap(void *addr, unsigned int b, unsigned int val)
 154{
 155	__le64 *words_le = addr;
 156	__le64 *w_le = words_le + (b >> ENTRIES_SHIFT);
 157
 158	b = (b & (ENTRIES_PER_WORD - 1)) << 1;
 159
 160	if (val & 2)
 161		__set_bit_le(b, (void *) w_le);
 162	else
 163		__clear_bit_le(b, (void *) w_le);
 164
 165	if (val & 1)
 166		__set_bit_le(b + 1, (void *) w_le);
 167	else
 168		__clear_bit_le(b + 1, (void *) w_le);
 169}
 170
 171static int sm_find_free(void *addr, unsigned int begin, unsigned int end,
 172			unsigned int *result)
 173{
 174	while (begin < end) {
 175		if (!(begin & (ENTRIES_PER_WORD - 1)) &&
 176		    dm_bitmap_word_used(addr, begin)) {
 177			begin += ENTRIES_PER_WORD;
 178			continue;
 179		}
 180
 181		if (!sm_lookup_bitmap(addr, begin)) {
 182			*result = begin;
 183			return 0;
 184		}
 185
 186		begin++;
 187	}
 188
 189	return -ENOSPC;
 190}
 191
 192/*----------------------------------------------------------------*/
 193
 194static int sm_ll_init(struct ll_disk *ll, struct dm_transaction_manager *tm)
 195{
 196	memset(ll, 0, sizeof(struct ll_disk));
 197
 198	ll->tm = tm;
 199
 200	ll->bitmap_info.tm = tm;
 201	ll->bitmap_info.levels = 1;
 202
 203	/*
 204	 * Because the new bitmap blocks are created via a shadow
 205	 * operation, the old entry has already had its reference count
 206	 * decremented and we don't need the btree to do any bookkeeping.
 207	 */
 208	ll->bitmap_info.value_type.size = sizeof(struct disk_index_entry);
 209	ll->bitmap_info.value_type.inc = NULL;
 210	ll->bitmap_info.value_type.dec = NULL;
 211	ll->bitmap_info.value_type.equal = NULL;
 212
 213	ll->ref_count_info.tm = tm;
 214	ll->ref_count_info.levels = 1;
 215	ll->ref_count_info.value_type.size = sizeof(uint32_t);
 216	ll->ref_count_info.value_type.inc = NULL;
 217	ll->ref_count_info.value_type.dec = NULL;
 218	ll->ref_count_info.value_type.equal = NULL;
 219
 220	ll->block_size = dm_bm_block_size(dm_tm_get_bm(tm));
 221
 222	if (ll->block_size > (1 << 30)) {
 223		DMERR("block size too big to hold bitmaps");
 224		return -EINVAL;
 225	}
 226
 227	ll->entries_per_block = (ll->block_size - sizeof(struct disk_bitmap_header)) *
 228		ENTRIES_PER_BYTE;
 229	ll->nr_blocks = 0;
 230	ll->bitmap_root = 0;
 231	ll->ref_count_root = 0;
 232	ll->bitmap_index_changed = false;
 233
 234	return 0;
 235}
 236
 237int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks)
 238{
 239	int r;
 240	dm_block_t i, nr_blocks, nr_indexes;
 241	unsigned int old_blocks, blocks;
 242
 243	nr_blocks = ll->nr_blocks + extra_blocks;
 244	old_blocks = dm_sector_div_up(ll->nr_blocks, ll->entries_per_block);
 245	blocks = dm_sector_div_up(nr_blocks, ll->entries_per_block);
 246
 247	nr_indexes = dm_sector_div_up(nr_blocks, ll->entries_per_block);
 248	if (nr_indexes > ll->max_entries(ll)) {
 249		DMERR("space map too large");
 250		return -EINVAL;
 251	}
 252
 253	/*
 254	 * We need to set this before the dm_tm_new_block() call below.
 255	 */
 256	ll->nr_blocks = nr_blocks;
 257	for (i = old_blocks; i < blocks; i++) {
 258		struct dm_block *b;
 259		struct disk_index_entry idx;
 260
 261		r = dm_tm_new_block(ll->tm, &dm_sm_bitmap_validator, &b);
 262		if (r < 0)
 263			return r;
 264
 265		idx.blocknr = cpu_to_le64(dm_block_location(b));
 266
 267		dm_tm_unlock(ll->tm, b);
 268
 269		idx.nr_free = cpu_to_le32(ll->entries_per_block);
 270		idx.none_free_before = 0;
 271
 272		r = ll->save_ie(ll, i, &idx);
 273		if (r < 0)
 274			return r;
 275	}
 276
 277	return 0;
 278}
 279
 280int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result)
 281{
 282	int r;
 283	dm_block_t index = b;
 284	struct disk_index_entry ie_disk;
 285	struct dm_block *blk;
 286
 287	if (b >= ll->nr_blocks) {
 288		DMERR_LIMIT("metadata block out of bounds");
 289		return -EINVAL;
 290	}
 291
 292	b = do_div(index, ll->entries_per_block);
 293	r = ll->load_ie(ll, index, &ie_disk);
 294	if (r < 0)
 295		return r;
 296
 297	r = dm_tm_read_lock(ll->tm, le64_to_cpu(ie_disk.blocknr),
 298			    &dm_sm_bitmap_validator, &blk);
 299	if (r < 0)
 300		return r;
 301
 302	*result = sm_lookup_bitmap(dm_bitmap_data(blk), b);
 303
 304	dm_tm_unlock(ll->tm, blk);
 305
 306	return 0;
 307}
 308
 309static int sm_ll_lookup_big_ref_count(struct ll_disk *ll, dm_block_t b,
 310				      uint32_t *result)
 311{
 312	__le32 le_rc;
 313	int r;
 314
 315	r = dm_btree_lookup(&ll->ref_count_info, ll->ref_count_root, &b, &le_rc);
 316	if (r < 0)
 317		return r;
 318
 319	*result = le32_to_cpu(le_rc);
 320
 321	return r;
 322}
 323
 324int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result)
 325{
 326	int r = sm_ll_lookup_bitmap(ll, b, result);
 327
 328	if (r)
 329		return r;
 330
 331	if (*result != 3)
 332		return r;
 333
 334	return sm_ll_lookup_big_ref_count(ll, b, result);
 335}
 336
 337int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin,
 338			  dm_block_t end, dm_block_t *result)
 339{
 340	int r;
 341	struct disk_index_entry ie_disk;
 342	dm_block_t i, index_begin = begin;
 343	dm_block_t index_end = dm_sector_div_up(end, ll->entries_per_block);
 344
 345	/*
 346	 * FIXME: Use shifts
 347	 */
 348	begin = do_div(index_begin, ll->entries_per_block);
 349	end = do_div(end, ll->entries_per_block);
 350	if (end == 0)
 351		end = ll->entries_per_block;
 352
 353	for (i = index_begin; i < index_end; i++, begin = 0) {
 354		struct dm_block *blk;
 355		unsigned int position;
 356		uint32_t bit_end;
 357
 358		r = ll->load_ie(ll, i, &ie_disk);
 359		if (r < 0)
 360			return r;
 361
 362		if (le32_to_cpu(ie_disk.nr_free) == 0)
 363			continue;
 364
 365		r = dm_tm_read_lock(ll->tm, le64_to_cpu(ie_disk.blocknr),
 366				    &dm_sm_bitmap_validator, &blk);
 367		if (r < 0)
 368			return r;
 369
 370		bit_end = (i == index_end - 1) ?  end : ll->entries_per_block;
 371
 372		r = sm_find_free(dm_bitmap_data(blk),
 373				 max_t(unsigned int, begin, le32_to_cpu(ie_disk.none_free_before)),
 374				 bit_end, &position);
 375		if (r == -ENOSPC) {
 376			/*
 377			 * This might happen because we started searching
 378			 * part way through the bitmap.
 379			 */
 380			dm_tm_unlock(ll->tm, blk);
 381			continue;
 382		}
 383
 384		dm_tm_unlock(ll->tm, blk);
 385
 386		*result = i * ll->entries_per_block + (dm_block_t) position;
 387		return 0;
 388	}
 389
 390	return -ENOSPC;
 391}
 392
 393int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll,
 394				 dm_block_t begin, dm_block_t end, dm_block_t *b)
 395{
 396	int r;
 397	uint32_t count;
 398
 399	do {
 400		r = sm_ll_find_free_block(new_ll, begin, new_ll->nr_blocks, b);
 401		if (r)
 402			break;
 403
 404		/* double check this block wasn't used in the old transaction */
 405		if (*b >= old_ll->nr_blocks)
 406			count = 0;
 407		else {
 408			r = sm_ll_lookup(old_ll, *b, &count);
 409			if (r)
 410				break;
 411
 412			if (count)
 413				begin = *b + 1;
 414		}
 415	} while (count);
 416
 417	return r;
 418}
 419
 420/*----------------------------------------------------------------*/
 421
 422int sm_ll_insert(struct ll_disk *ll, dm_block_t b,
 423		 uint32_t ref_count, int32_t *nr_allocations)
 424{
 425	int r;
 426	uint32_t bit, old;
 427	struct dm_block *nb;
 428	dm_block_t index = b;
 429	struct disk_index_entry ie_disk;
 430	void *bm_le;
 431	int inc;
 432
 433	bit = do_div(index, ll->entries_per_block);
 434	r = ll->load_ie(ll, index, &ie_disk);
 435	if (r < 0)
 436		return r;
 437
 438	r = dm_tm_shadow_block(ll->tm, le64_to_cpu(ie_disk.blocknr),
 439			       &dm_sm_bitmap_validator, &nb, &inc);
 440	if (r < 0) {
 441		DMERR("dm_tm_shadow_block() failed");
 442		return r;
 443	}
 444	ie_disk.blocknr = cpu_to_le64(dm_block_location(nb));
 445	bm_le = dm_bitmap_data(nb);
 446
 447	old = sm_lookup_bitmap(bm_le, bit);
 448	if (old > 2) {
 449		r = sm_ll_lookup_big_ref_count(ll, b, &old);
 450		if (r < 0) {
 451			dm_tm_unlock(ll->tm, nb);
 452			return r;
 453		}
 454	}
 455
 456	if (r) {
 457		dm_tm_unlock(ll->tm, nb);
 458		return r;
 459	}
 460
 461	if (ref_count <= 2) {
 462		sm_set_bitmap(bm_le, bit, ref_count);
 463		dm_tm_unlock(ll->tm, nb);
 464
 465		if (old > 2) {
 466			r = dm_btree_remove(&ll->ref_count_info,
 467					    ll->ref_count_root,
 468					    &b, &ll->ref_count_root);
 469			if (r)
 470				return r;
 471		}
 472
 473	} else {
 474		__le32 le_rc = cpu_to_le32(ref_count);
 475
 476		sm_set_bitmap(bm_le, bit, 3);
 477		dm_tm_unlock(ll->tm, nb);
 478
 479		__dm_bless_for_disk(&le_rc);
 480		r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root,
 481				    &b, &le_rc, &ll->ref_count_root);
 482		if (r < 0) {
 483			DMERR("ref count insert failed");
 484			return r;
 485		}
 486	}
 487
 488	if (ref_count && !old) {
 489		*nr_allocations = 1;
 490		ll->nr_allocated++;
 491		le32_add_cpu(&ie_disk.nr_free, -1);
 492		if (le32_to_cpu(ie_disk.none_free_before) == bit)
 493			ie_disk.none_free_before = cpu_to_le32(bit + 1);
 494
 495	} else if (old && !ref_count) {
 496		*nr_allocations = -1;
 497		ll->nr_allocated--;
 498		le32_add_cpu(&ie_disk.nr_free, 1);
 499		ie_disk.none_free_before = cpu_to_le32(min(le32_to_cpu(ie_disk.none_free_before), bit));
 500	} else
 501		*nr_allocations = 0;
 502
 503	return ll->save_ie(ll, index, &ie_disk);
 504}
 505
 506/*----------------------------------------------------------------*/
 507
 508/*
 509 * Holds useful intermediate results for the range based inc and dec
 510 * operations.
 511 */
 512struct inc_context {
 513	struct disk_index_entry ie_disk;
 514	struct dm_block *bitmap_block;
 515	void *bitmap;
 516
 517	struct dm_block *overflow_leaf;
 518};
 519
 520static inline void init_inc_context(struct inc_context *ic)
 521{
 522	ic->bitmap_block = NULL;
 523	ic->bitmap = NULL;
 524	ic->overflow_leaf = NULL;
 525}
 526
 527static inline void exit_inc_context(struct ll_disk *ll, struct inc_context *ic)
 528{
 529	if (ic->bitmap_block)
 530		dm_tm_unlock(ll->tm, ic->bitmap_block);
 531	if (ic->overflow_leaf)
 532		dm_tm_unlock(ll->tm, ic->overflow_leaf);
 533}
 534
 535static inline void reset_inc_context(struct ll_disk *ll, struct inc_context *ic)
 536{
 537	exit_inc_context(ll, ic);
 538	init_inc_context(ic);
 539}
 540
 541/*
 542 * Confirms a btree node contains a particular key at an index.
 543 */
 544static bool contains_key(struct btree_node *n, uint64_t key, int index)
 545{
 546	return index >= 0 &&
 547		index < le32_to_cpu(n->header.nr_entries) &&
 548		le64_to_cpu(n->keys[index]) == key;
 549}
 550
 551static int __sm_ll_inc_overflow(struct ll_disk *ll, dm_block_t b, struct inc_context *ic)
 552{
 553	int r;
 554	int index;
 555	struct btree_node *n;
 556	__le32 *v_ptr;
 557	uint32_t rc;
 558
 559	/*
 560	 * bitmap_block needs to be unlocked because getting the
 561	 * overflow_leaf may need to allocate, and thus use the space map.
 562	 */
 563	reset_inc_context(ll, ic);
 564
 565	r = btree_get_overwrite_leaf(&ll->ref_count_info, ll->ref_count_root,
 566				     b, &index, &ll->ref_count_root, &ic->overflow_leaf);
 567	if (r < 0)
 568		return r;
 569
 570	n = dm_block_data(ic->overflow_leaf);
 571
 572	if (!contains_key(n, b, index)) {
 573		DMERR("overflow btree is missing an entry");
 574		return -EINVAL;
 575	}
 576
 577	v_ptr = value_ptr(n, index);
 578	rc = le32_to_cpu(*v_ptr) + 1;
 579	*v_ptr = cpu_to_le32(rc);
 580
 581	return 0;
 582}
 583
 584static int sm_ll_inc_overflow(struct ll_disk *ll, dm_block_t b, struct inc_context *ic)
 585{
 586	int index;
 587	struct btree_node *n;
 588	__le32 *v_ptr;
 589	uint32_t rc;
 590
 591	/*
 592	 * Do we already have the correct overflow leaf?
 593	 */
 594	if (ic->overflow_leaf) {
 595		n = dm_block_data(ic->overflow_leaf);
 596		index = lower_bound(n, b);
 597		if (contains_key(n, b, index)) {
 598			v_ptr = value_ptr(n, index);
 599			rc = le32_to_cpu(*v_ptr) + 1;
 600			*v_ptr = cpu_to_le32(rc);
 601
 602			return 0;
 603		}
 604	}
 605
 606	return __sm_ll_inc_overflow(ll, b, ic);
 607}
 608
 609static inline int shadow_bitmap(struct ll_disk *ll, struct inc_context *ic)
 610{
 611	int r, inc;
 612
 613	r = dm_tm_shadow_block(ll->tm, le64_to_cpu(ic->ie_disk.blocknr),
 614			       &dm_sm_bitmap_validator, &ic->bitmap_block, &inc);
 615	if (r < 0) {
 616		DMERR("dm_tm_shadow_block() failed");
 617		return r;
 618	}
 619	ic->ie_disk.blocknr = cpu_to_le64(dm_block_location(ic->bitmap_block));
 620	ic->bitmap = dm_bitmap_data(ic->bitmap_block);
 621	return 0;
 622}
 623
 624/*
 625 * Once shadow_bitmap has been called, which always happens at the start of inc/dec,
 626 * we can reopen the bitmap with a simple write lock, rather than re calling
 627 * dm_tm_shadow_block().
 628 */
 629static inline int ensure_bitmap(struct ll_disk *ll, struct inc_context *ic)
 630{
 631	if (!ic->bitmap_block) {
 632		int r = dm_bm_write_lock(dm_tm_get_bm(ll->tm), le64_to_cpu(ic->ie_disk.blocknr),
 633					 &dm_sm_bitmap_validator, &ic->bitmap_block);
 634		if (r) {
 635			DMERR("unable to re-get write lock for bitmap");
 636			return r;
 637		}
 638		ic->bitmap = dm_bitmap_data(ic->bitmap_block);
 639	}
 640
 641	return 0;
 642}
 643
 644/*
 645 * Loops round incrementing entries in a single bitmap.
 646 */
 647static inline int sm_ll_inc_bitmap(struct ll_disk *ll, dm_block_t b,
 648				   uint32_t bit, uint32_t bit_end,
 649				   int32_t *nr_allocations, dm_block_t *new_b,
 650				   struct inc_context *ic)
 651{
 652	int r;
 653	__le32 le_rc;
 654	uint32_t old;
 655
 656	for (; bit != bit_end; bit++, b++) {
 657		/*
 658		 * We only need to drop the bitmap if we need to find a new btree
 659		 * leaf for the overflow.  So if it was dropped last iteration,
 660		 * we now re-get it.
 661		 */
 662		r = ensure_bitmap(ll, ic);
 663		if (r)
 664			return r;
 665
 666		old = sm_lookup_bitmap(ic->bitmap, bit);
 667		switch (old) {
 668		case 0:
 669			/* inc bitmap, adjust nr_allocated */
 670			sm_set_bitmap(ic->bitmap, bit, 1);
 671			(*nr_allocations)++;
 672			ll->nr_allocated++;
 673			le32_add_cpu(&ic->ie_disk.nr_free, -1);
 674			if (le32_to_cpu(ic->ie_disk.none_free_before) == bit)
 675				ic->ie_disk.none_free_before = cpu_to_le32(bit + 1);
 676			break;
 677
 678		case 1:
 679			/* inc bitmap */
 680			sm_set_bitmap(ic->bitmap, bit, 2);
 681			break;
 682
 683		case 2:
 684			/* inc bitmap and insert into overflow */
 685			sm_set_bitmap(ic->bitmap, bit, 3);
 686			reset_inc_context(ll, ic);
 687
 688			le_rc = cpu_to_le32(3);
 689			__dm_bless_for_disk(&le_rc);
 690			r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root,
 691					    &b, &le_rc, &ll->ref_count_root);
 692			if (r < 0) {
 693				DMERR("ref count insert failed");
 694				return r;
 695			}
 696			break;
 697
 698		default:
 699			/*
 700			 * inc within the overflow tree only.
 701			 */
 702			r = sm_ll_inc_overflow(ll, b, ic);
 703			if (r < 0)
 704				return r;
 705		}
 706	}
 707
 708	*new_b = b;
 709	return 0;
 710}
 711
 712/*
 713 * Finds a bitmap that contains entries in the block range, and increments
 714 * them.
 715 */
 716static int __sm_ll_inc(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 717		       int32_t *nr_allocations, dm_block_t *new_b)
 718{
 719	int r;
 720	struct inc_context ic;
 721	uint32_t bit, bit_end;
 722	dm_block_t index = b;
 723
 724	init_inc_context(&ic);
 725
 726	bit = do_div(index, ll->entries_per_block);
 727	r = ll->load_ie(ll, index, &ic.ie_disk);
 728	if (r < 0)
 729		return r;
 730
 731	r = shadow_bitmap(ll, &ic);
 732	if (r)
 733		return r;
 734
 735	bit_end = min(bit + (e - b), (dm_block_t) ll->entries_per_block);
 736	r = sm_ll_inc_bitmap(ll, b, bit, bit_end, nr_allocations, new_b, &ic);
 737
 738	exit_inc_context(ll, &ic);
 739
 740	if (r)
 741		return r;
 742
 743	return ll->save_ie(ll, index, &ic.ie_disk);
 744}
 745
 746int sm_ll_inc(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 747	      int32_t *nr_allocations)
 748{
 749	*nr_allocations = 0;
 750	while (b != e) {
 751		int r = __sm_ll_inc(ll, b, e, nr_allocations, &b);
 752
 753		if (r)
 754			return r;
 755	}
 756
 757	return 0;
 758}
 759
 760/*----------------------------------------------------------------*/
 761
 762static int __sm_ll_del_overflow(struct ll_disk *ll, dm_block_t b,
 763				struct inc_context *ic)
 764{
 765	reset_inc_context(ll, ic);
 766	return dm_btree_remove(&ll->ref_count_info, ll->ref_count_root,
 767			       &b, &ll->ref_count_root);
 768}
 769
 770static int __sm_ll_dec_overflow(struct ll_disk *ll, dm_block_t b,
 771				struct inc_context *ic, uint32_t *old_rc)
 772{
 773	int r;
 774	int index = -1;
 775	struct btree_node *n;
 776	__le32 *v_ptr;
 777	uint32_t rc;
 778
 779	reset_inc_context(ll, ic);
 780	r = btree_get_overwrite_leaf(&ll->ref_count_info, ll->ref_count_root,
 781				     b, &index, &ll->ref_count_root, &ic->overflow_leaf);
 782	if (r < 0)
 783		return r;
 784
 785	n = dm_block_data(ic->overflow_leaf);
 786
 787	if (!contains_key(n, b, index)) {
 788		DMERR("overflow btree is missing an entry");
 789		return -EINVAL;
 790	}
 791
 792	v_ptr = value_ptr(n, index);
 793	rc = le32_to_cpu(*v_ptr);
 794	*old_rc = rc;
 795
 796	if (rc == 3)
 797		return __sm_ll_del_overflow(ll, b, ic);
 798
 799	rc--;
 800	*v_ptr = cpu_to_le32(rc);
 801	return 0;
 
 802}
 803
 804static int sm_ll_dec_overflow(struct ll_disk *ll, dm_block_t b,
 805			      struct inc_context *ic, uint32_t *old_rc)
 806{
 807	/*
 808	 * Do we already have the correct overflow leaf?
 809	 */
 810	if (ic->overflow_leaf) {
 811		int index;
 812		struct btree_node *n;
 813		__le32 *v_ptr;
 814		uint32_t rc;
 815
 816		n = dm_block_data(ic->overflow_leaf);
 817		index = lower_bound(n, b);
 818		if (contains_key(n, b, index)) {
 819			v_ptr = value_ptr(n, index);
 820			rc = le32_to_cpu(*v_ptr);
 821			*old_rc = rc;
 822
 823			if (rc > 3) {
 824				rc--;
 825				*v_ptr = cpu_to_le32(rc);
 826				return 0;
 827			} else {
 828				return __sm_ll_del_overflow(ll, b, ic);
 829			}
 830
 831		}
 832	}
 833
 834	return __sm_ll_dec_overflow(ll, b, ic, old_rc);
 835}
 836
 837/*
 838 * Loops round incrementing entries in a single bitmap.
 839 */
 840static inline int sm_ll_dec_bitmap(struct ll_disk *ll, dm_block_t b,
 841				   uint32_t bit, uint32_t bit_end,
 842				   struct inc_context *ic,
 843				   int32_t *nr_allocations, dm_block_t *new_b)
 844{
 845	int r;
 846	uint32_t old;
 847
 848	for (; bit != bit_end; bit++, b++) {
 849		/*
 850		 * We only need to drop the bitmap if we need to find a new btree
 851		 * leaf for the overflow.  So if it was dropped last iteration,
 852		 * we now re-get it.
 853		 */
 854		r = ensure_bitmap(ll, ic);
 855		if (r)
 856			return r;
 857
 858		old = sm_lookup_bitmap(ic->bitmap, bit);
 859		switch (old) {
 860		case 0:
 861			DMERR("unable to decrement block");
 862			return -EINVAL;
 863
 864		case 1:
 865			/* dec bitmap */
 866			sm_set_bitmap(ic->bitmap, bit, 0);
 867			(*nr_allocations)--;
 868			ll->nr_allocated--;
 869			le32_add_cpu(&ic->ie_disk.nr_free, 1);
 870			ic->ie_disk.none_free_before =
 871				cpu_to_le32(min(le32_to_cpu(ic->ie_disk.none_free_before), bit));
 872			break;
 873
 874		case 2:
 875			/* dec bitmap and insert into overflow */
 876			sm_set_bitmap(ic->bitmap, bit, 1);
 877			break;
 878
 879		case 3:
 880			r = sm_ll_dec_overflow(ll, b, ic, &old);
 881			if (r < 0)
 882				return r;
 883
 884			if (old == 3) {
 885				r = ensure_bitmap(ll, ic);
 886				if (r)
 887					return r;
 888
 889				sm_set_bitmap(ic->bitmap, bit, 2);
 890			}
 891			break;
 892		}
 893	}
 894
 895	*new_b = b;
 896	return 0;
 897}
 898
 899static int __sm_ll_dec(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 900		       int32_t *nr_allocations, dm_block_t *new_b)
 901{
 902	int r;
 903	uint32_t bit, bit_end;
 904	struct inc_context ic;
 905	dm_block_t index = b;
 906
 907	init_inc_context(&ic);
 908
 909	bit = do_div(index, ll->entries_per_block);
 910	r = ll->load_ie(ll, index, &ic.ie_disk);
 911	if (r < 0)
 912		return r;
 913
 914	r = shadow_bitmap(ll, &ic);
 915	if (r)
 916		return r;
 917
 918	bit_end = min(bit + (e - b), (dm_block_t) ll->entries_per_block);
 919	r = sm_ll_dec_bitmap(ll, b, bit, bit_end, &ic, nr_allocations, new_b);
 920	exit_inc_context(ll, &ic);
 921
 922	if (r)
 923		return r;
 924
 925	return ll->save_ie(ll, index, &ic.ie_disk);
 926}
 927
 928int sm_ll_dec(struct ll_disk *ll, dm_block_t b, dm_block_t e,
 929	      int32_t *nr_allocations)
 930{
 931	*nr_allocations = 0;
 932	while (b != e) {
 933		int r = __sm_ll_dec(ll, b, e, nr_allocations, &b);
 934
 935		if (r)
 936			return r;
 937	}
 938
 939	return 0;
 940}
 941
 942/*----------------------------------------------------------------*/
 943
 944int sm_ll_commit(struct ll_disk *ll)
 945{
 946	int r = 0;
 947
 948	if (ll->bitmap_index_changed) {
 949		r = ll->commit(ll);
 950		if (!r)
 951			ll->bitmap_index_changed = false;
 952	}
 953
 954	return r;
 955}
 956
 957/*----------------------------------------------------------------*/
 958
 959static int metadata_ll_load_ie(struct ll_disk *ll, dm_block_t index,
 960			       struct disk_index_entry *ie)
 961{
 962	memcpy(ie, ll->mi_le.index + index, sizeof(*ie));
 963	return 0;
 964}
 965
 966static int metadata_ll_save_ie(struct ll_disk *ll, dm_block_t index,
 967			       struct disk_index_entry *ie)
 968{
 969	ll->bitmap_index_changed = true;
 970	memcpy(ll->mi_le.index + index, ie, sizeof(*ie));
 971	return 0;
 972}
 973
 974static int metadata_ll_init_index(struct ll_disk *ll)
 975{
 976	int r;
 977	struct dm_block *b;
 978
 979	r = dm_tm_new_block(ll->tm, &index_validator, &b);
 980	if (r < 0)
 981		return r;
 982
 983	ll->bitmap_root = dm_block_location(b);
 984
 985	dm_tm_unlock(ll->tm, b);
 986
 987	return 0;
 988}
 989
 990static int metadata_ll_open(struct ll_disk *ll)
 991{
 992	int r;
 993	struct dm_block *block;
 994
 995	r = dm_tm_read_lock(ll->tm, ll->bitmap_root,
 996			    &index_validator, &block);
 997	if (r)
 998		return r;
 999
1000	memcpy(&ll->mi_le, dm_block_data(block), sizeof(ll->mi_le));
1001	dm_tm_unlock(ll->tm, block);
1002
1003	return 0;
1004}
1005
1006static dm_block_t metadata_ll_max_entries(struct ll_disk *ll)
1007{
1008	return MAX_METADATA_BITMAPS;
1009}
1010
1011static int metadata_ll_commit(struct ll_disk *ll)
1012{
1013	int r, inc;
1014	struct dm_block *b;
1015
1016	r = dm_tm_shadow_block(ll->tm, ll->bitmap_root, &index_validator, &b, &inc);
1017	if (r)
1018		return r;
1019
1020	memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le));
1021	ll->bitmap_root = dm_block_location(b);
1022
1023	dm_tm_unlock(ll->tm, b);
1024
1025	return 0;
1026}
1027
1028int sm_ll_new_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm)
1029{
1030	int r;
1031
1032	r = sm_ll_init(ll, tm);
1033	if (r < 0)
1034		return r;
1035
1036	ll->load_ie = metadata_ll_load_ie;
1037	ll->save_ie = metadata_ll_save_ie;
1038	ll->init_index = metadata_ll_init_index;
1039	ll->open_index = metadata_ll_open;
1040	ll->max_entries = metadata_ll_max_entries;
1041	ll->commit = metadata_ll_commit;
1042
1043	ll->nr_blocks = 0;
1044	ll->nr_allocated = 0;
1045
1046	r = ll->init_index(ll);
1047	if (r < 0)
1048		return r;
1049
1050	r = dm_btree_empty(&ll->ref_count_info, &ll->ref_count_root);
1051	if (r < 0)
1052		return r;
1053
1054	return 0;
1055}
1056
1057int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm,
1058			void *root_le, size_t len)
1059{
1060	int r;
1061	struct disk_sm_root smr;
1062
1063	if (len < sizeof(struct disk_sm_root)) {
1064		DMERR("sm_metadata root too small");
1065		return -ENOMEM;
1066	}
1067
1068	/*
1069	 * We don't know the alignment of the root_le buffer, so need to
1070	 * copy into a new structure.
1071	 */
1072	memcpy(&smr, root_le, sizeof(smr));
1073
1074	r = sm_ll_init(ll, tm);
1075	if (r < 0)
1076		return r;
1077
1078	ll->load_ie = metadata_ll_load_ie;
1079	ll->save_ie = metadata_ll_save_ie;
1080	ll->init_index = metadata_ll_init_index;
1081	ll->open_index = metadata_ll_open;
1082	ll->max_entries = metadata_ll_max_entries;
1083	ll->commit = metadata_ll_commit;
1084
1085	ll->nr_blocks = le64_to_cpu(smr.nr_blocks);
1086	ll->nr_allocated = le64_to_cpu(smr.nr_allocated);
1087	ll->bitmap_root = le64_to_cpu(smr.bitmap_root);
1088	ll->ref_count_root = le64_to_cpu(smr.ref_count_root);
1089
1090	return ll->open_index(ll);
1091}
1092
1093/*----------------------------------------------------------------*/
1094
1095static inline int ie_cache_writeback(struct ll_disk *ll, struct ie_cache *iec)
1096{
1097	iec->dirty = false;
1098	__dm_bless_for_disk(iec->ie);
1099	return dm_btree_insert(&ll->bitmap_info, ll->bitmap_root,
1100			       &iec->index, &iec->ie, &ll->bitmap_root);
1101}
1102
1103static inline unsigned int hash_index(dm_block_t index)
1104{
1105	return dm_hash_block(index, IE_CACHE_MASK);
1106}
1107
1108static int disk_ll_load_ie(struct ll_disk *ll, dm_block_t index,
1109			   struct disk_index_entry *ie)
1110{
1111	int r;
1112	unsigned int h = hash_index(index);
1113	struct ie_cache *iec = ll->ie_cache + h;
1114
1115	if (iec->valid) {
1116		if (iec->index == index) {
1117			memcpy(ie, &iec->ie, sizeof(*ie));
1118			return 0;
1119		}
1120
1121		if (iec->dirty) {
1122			r = ie_cache_writeback(ll, iec);
1123			if (r)
1124				return r;
1125		}
1126	}
1127
1128	r = dm_btree_lookup(&ll->bitmap_info, ll->bitmap_root, &index, ie);
1129	if (!r) {
1130		iec->valid = true;
1131		iec->dirty = false;
1132		iec->index = index;
1133		memcpy(&iec->ie, ie, sizeof(*ie));
1134	}
1135
1136	return r;
1137}
1138
1139static int disk_ll_save_ie(struct ll_disk *ll, dm_block_t index,
1140			   struct disk_index_entry *ie)
1141{
1142	int r;
1143	unsigned int h = hash_index(index);
1144	struct ie_cache *iec = ll->ie_cache + h;
1145
1146	ll->bitmap_index_changed = true;
1147	if (iec->valid) {
1148		if (iec->index == index) {
1149			memcpy(&iec->ie, ie, sizeof(*ie));
1150			iec->dirty = true;
1151			return 0;
1152		}
1153
1154		if (iec->dirty) {
1155			r = ie_cache_writeback(ll, iec);
1156			if (r)
1157				return r;
1158		}
1159	}
1160
1161	iec->valid = true;
1162	iec->dirty = true;
1163	iec->index = index;
1164	memcpy(&iec->ie, ie, sizeof(*ie));
1165	return 0;
1166}
1167
1168static int disk_ll_init_index(struct ll_disk *ll)
1169{
1170	unsigned int i;
1171
1172	for (i = 0; i < IE_CACHE_SIZE; i++) {
1173		struct ie_cache *iec = ll->ie_cache + i;
1174
1175		iec->valid = false;
1176		iec->dirty = false;
1177	}
1178	return dm_btree_empty(&ll->bitmap_info, &ll->bitmap_root);
1179}
1180
1181static int disk_ll_open(struct ll_disk *ll)
1182{
1183	return 0;
1184}
1185
1186static dm_block_t disk_ll_max_entries(struct ll_disk *ll)
1187{
1188	return -1ULL;
1189}
1190
1191static int disk_ll_commit(struct ll_disk *ll)
1192{
1193	int r = 0;
1194	unsigned int i;
1195
1196	for (i = 0; i < IE_CACHE_SIZE; i++) {
1197		struct ie_cache *iec = ll->ie_cache + i;
1198
1199		if (iec->valid && iec->dirty)
1200			r = ie_cache_writeback(ll, iec);
1201	}
1202
1203	return r;
1204}
1205
1206int sm_ll_new_disk(struct ll_disk *ll, struct dm_transaction_manager *tm)
1207{
1208	int r;
1209
1210	r = sm_ll_init(ll, tm);
1211	if (r < 0)
1212		return r;
1213
1214	ll->load_ie = disk_ll_load_ie;
1215	ll->save_ie = disk_ll_save_ie;
1216	ll->init_index = disk_ll_init_index;
1217	ll->open_index = disk_ll_open;
1218	ll->max_entries = disk_ll_max_entries;
1219	ll->commit = disk_ll_commit;
1220
1221	ll->nr_blocks = 0;
1222	ll->nr_allocated = 0;
1223
1224	r = ll->init_index(ll);
1225	if (r < 0)
1226		return r;
1227
1228	r = dm_btree_empty(&ll->ref_count_info, &ll->ref_count_root);
1229	if (r < 0)
1230		return r;
1231
1232	return 0;
1233}
1234
1235int sm_ll_open_disk(struct ll_disk *ll, struct dm_transaction_manager *tm,
1236		    void *root_le, size_t len)
1237{
1238	int r;
1239	struct disk_sm_root *smr = root_le;
1240
1241	if (len < sizeof(struct disk_sm_root)) {
1242		DMERR("sm_metadata root too small");
1243		return -ENOMEM;
1244	}
1245
1246	r = sm_ll_init(ll, tm);
1247	if (r < 0)
1248		return r;
1249
1250	ll->load_ie = disk_ll_load_ie;
1251	ll->save_ie = disk_ll_save_ie;
1252	ll->init_index = disk_ll_init_index;
1253	ll->open_index = disk_ll_open;
1254	ll->max_entries = disk_ll_max_entries;
1255	ll->commit = disk_ll_commit;
1256
1257	ll->nr_blocks = le64_to_cpu(smr->nr_blocks);
1258	ll->nr_allocated = le64_to_cpu(smr->nr_allocated);
1259	ll->bitmap_root = le64_to_cpu(smr->bitmap_root);
1260	ll->ref_count_root = le64_to_cpu(smr->ref_count_root);
1261
1262	return ll->open_index(ll);
1263}
1264
1265/*----------------------------------------------------------------*/