1 /* 2 drbd_bitmap.c 3 4 This file is part of DRBD by Philipp Reisner and Lars Ellenberg. 5 6 Copyright (C) 2004-2008, LINBIT Information Technologies GmbH. 7 Copyright (C) 2004-2008, Philipp Reisner <philipp.reisner@linbit.com>. 8 Copyright (C) 2004-2008, Lars Ellenberg <lars.ellenberg@linbit.com>. 9 10 drbd is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2, or (at your option) 13 any later version. 14 15 drbd is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with drbd; see the file COPYING. If not, write to 22 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 23 */ 24 25 #include <linux/bitops.h> 26 #include <linux/vmalloc.h> 27 #include <linux/string.h> 28 #include <linux/drbd.h> 29 #include <asm/kmap_types.h> 30 #include "drbd_int.h" 31 32 /* OPAQUE outside this file! 33 * interface defined in drbd_int.h 34 35 * convention: 36 * function name drbd_bm_... => used elsewhere, "public". 37 * function name bm_... => internal to implementation, "private". 38 39 * Note that since find_first_bit returns int, at the current granularity of 40 * the bitmap (4KB per byte), this implementation "only" supports up to 41 * 1<<(32+12) == 16 TB... 42 */ 43 44 /* 45 * NOTE 46 * Access to the *bm_pages is protected by bm_lock. 47 * It is safe to read the other members within the lock. 48 * 49 * drbd_bm_set_bits is called from bio_endio callbacks, 50 * We may be called with irq already disabled, 51 * so we need spin_lock_irqsave(). 52 * And we need the kmap_atomic. 53 */ 54 struct drbd_bitmap { 55 struct page **bm_pages; 56 spinlock_t bm_lock; 57 /* WARNING unsigned long bm_*: 58 * 32bit number of bit offset is just enough for 512 MB bitmap. 59 * it will blow up if we make the bitmap bigger... 60 * not that it makes much sense to have a bitmap that large, 61 * rather change the granularity to 16k or 64k or something. 62 * (that implies other problems, however...) 63 */ 64 unsigned long bm_set; /* nr of set bits; THINK maybe atomic_t? */ 65 unsigned long bm_bits; 66 size_t bm_words; 67 size_t bm_number_of_pages; 68 sector_t bm_dev_capacity; 69 struct semaphore bm_change; /* serializes resize operations */ 70 71 atomic_t bm_async_io; 72 wait_queue_head_t bm_io_wait; 73 74 unsigned long bm_flags; 75 76 /* debugging aid, in case we are still racy somewhere */ 77 char *bm_why; 78 struct task_struct *bm_task; 79 }; 80 81 /* definition of bits in bm_flags */ 82 #define BM_LOCKED 0 83 #define BM_MD_IO_ERROR 1 84 #define BM_P_VMALLOCED 2 85 86 static int bm_is_locked(struct drbd_bitmap *b) 87 { 88 return test_bit(BM_LOCKED, &b->bm_flags); 89 } 90 91 #define bm_print_lock_info(m) __bm_print_lock_info(m, __func__) 92 static void __bm_print_lock_info(struct drbd_conf *mdev, const char *func) 93 { 94 struct drbd_bitmap *b = mdev->bitmap; 95 if (!__ratelimit(&drbd_ratelimit_state)) 96 return; 97 dev_err(DEV, "FIXME %s in %s, bitmap locked for '%s' by %s\n", 98 current == mdev->receiver.task ? "receiver" : 99 current == mdev->asender.task ? "asender" : 100 current == mdev->worker.task ? "worker" : current->comm, 101 func, b->bm_why ?: "?", 102 b->bm_task == mdev->receiver.task ? "receiver" : 103 b->bm_task == mdev->asender.task ? "asender" : 104 b->bm_task == mdev->worker.task ? "worker" : "?"); 105 } 106 107 void drbd_bm_lock(struct drbd_conf *mdev, char *why) 108 { 109 struct drbd_bitmap *b = mdev->bitmap; 110 int trylock_failed; 111 112 if (!b) { 113 dev_err(DEV, "FIXME no bitmap in drbd_bm_lock!?\n"); 114 return; 115 } 116 117 trylock_failed = down_trylock(&b->bm_change); 118 119 if (trylock_failed) { 120 dev_warn(DEV, "%s going to '%s' but bitmap already locked for '%s' by %s\n", 121 current == mdev->receiver.task ? "receiver" : 122 current == mdev->asender.task ? "asender" : 123 current == mdev->worker.task ? "worker" : current->comm, 124 why, b->bm_why ?: "?", 125 b->bm_task == mdev->receiver.task ? "receiver" : 126 b->bm_task == mdev->asender.task ? "asender" : 127 b->bm_task == mdev->worker.task ? "worker" : "?"); 128 down(&b->bm_change); 129 } 130 if (__test_and_set_bit(BM_LOCKED, &b->bm_flags)) 131 dev_err(DEV, "FIXME bitmap already locked in bm_lock\n"); 132 133 b->bm_why = why; 134 b->bm_task = current; 135 } 136 137 void drbd_bm_unlock(struct drbd_conf *mdev) 138 { 139 struct drbd_bitmap *b = mdev->bitmap; 140 if (!b) { 141 dev_err(DEV, "FIXME no bitmap in drbd_bm_unlock!?\n"); 142 return; 143 } 144 145 if (!__test_and_clear_bit(BM_LOCKED, &mdev->bitmap->bm_flags)) 146 dev_err(DEV, "FIXME bitmap not locked in bm_unlock\n"); 147 148 b->bm_why = NULL; 149 b->bm_task = NULL; 150 up(&b->bm_change); 151 } 152 153 /* word offset to long pointer */ 154 static unsigned long *__bm_map_paddr(struct drbd_bitmap *b, unsigned long offset, const enum km_type km) 155 { 156 struct page *page; 157 unsigned long page_nr; 158 159 /* page_nr = (word*sizeof(long)) >> PAGE_SHIFT; */ 160 page_nr = offset >> (PAGE_SHIFT - LN2_BPL + 3); 161 BUG_ON(page_nr >= b->bm_number_of_pages); 162 page = b->bm_pages[page_nr]; 163 164 return (unsigned long *) kmap_atomic(page, km); 165 } 166 167 static unsigned long * bm_map_paddr(struct drbd_bitmap *b, unsigned long offset) 168 { 169 return __bm_map_paddr(b, offset, KM_IRQ1); 170 } 171 172 static void __bm_unmap(unsigned long *p_addr, const enum km_type km) 173 { 174 kunmap_atomic(p_addr, km); 175 }; 176 177 static void bm_unmap(unsigned long *p_addr) 178 { 179 return __bm_unmap(p_addr, KM_IRQ1); 180 } 181 182 /* long word offset of _bitmap_ sector */ 183 #define S2W(s) ((s)<<(BM_EXT_SHIFT-BM_BLOCK_SHIFT-LN2_BPL)) 184 /* word offset from start of bitmap to word number _in_page_ 185 * modulo longs per page 186 #define MLPP(X) ((X) % (PAGE_SIZE/sizeof(long)) 187 hm, well, Philipp thinks gcc might not optimze the % into & (... - 1) 188 so do it explicitly: 189 */ 190 #define MLPP(X) ((X) & ((PAGE_SIZE/sizeof(long))-1)) 191 192 /* Long words per page */ 193 #define LWPP (PAGE_SIZE/sizeof(long)) 194 195 /* 196 * actually most functions herein should take a struct drbd_bitmap*, not a 197 * struct drbd_conf*, but for the debug macros I like to have the mdev around 198 * to be able to report device specific. 199 */ 200 201 static void bm_free_pages(struct page **pages, unsigned long number) 202 { 203 unsigned long i; 204 if (!pages) 205 return; 206 207 for (i = 0; i < number; i++) { 208 if (!pages[i]) { 209 printk(KERN_ALERT "drbd: bm_free_pages tried to free " 210 "a NULL pointer; i=%lu n=%lu\n", 211 i, number); 212 continue; 213 } 214 __free_page(pages[i]); 215 pages[i] = NULL; 216 } 217 } 218 219 static void bm_vk_free(void *ptr, int v) 220 { 221 if (v) 222 vfree(ptr); 223 else 224 kfree(ptr); 225 } 226 227 /* 228 * "have" and "want" are NUMBER OF PAGES. 229 */ 230 static struct page **bm_realloc_pages(struct drbd_bitmap *b, unsigned long want) 231 { 232 struct page **old_pages = b->bm_pages; 233 struct page **new_pages, *page; 234 unsigned int i, bytes, vmalloced = 0; 235 unsigned long have = b->bm_number_of_pages; 236 237 BUG_ON(have == 0 && old_pages != NULL); 238 BUG_ON(have != 0 && old_pages == NULL); 239 240 if (have == want) 241 return old_pages; 242 243 /* Trying kmalloc first, falling back to vmalloc. 244 * GFP_KERNEL is ok, as this is done when a lower level disk is 245 * "attached" to the drbd. Context is receiver thread or cqueue 246 * thread. As we have no disk yet, we are not in the IO path, 247 * not even the IO path of the peer. */ 248 bytes = sizeof(struct page *)*want; 249 new_pages = kmalloc(bytes, GFP_KERNEL); 250 if (!new_pages) { 251 new_pages = vmalloc(bytes); 252 if (!new_pages) 253 return NULL; 254 vmalloced = 1; 255 } 256 257 memset(new_pages, 0, bytes); 258 if (want >= have) { 259 for (i = 0; i < have; i++) 260 new_pages[i] = old_pages[i]; 261 for (; i < want; i++) { 262 page = alloc_page(GFP_HIGHUSER); 263 if (!page) { 264 bm_free_pages(new_pages + have, i - have); 265 bm_vk_free(new_pages, vmalloced); 266 return NULL; 267 } 268 new_pages[i] = page; 269 } 270 } else { 271 for (i = 0; i < want; i++) 272 new_pages[i] = old_pages[i]; 273 /* NOT HERE, we are outside the spinlock! 274 bm_free_pages(old_pages + want, have - want); 275 */ 276 } 277 278 if (vmalloced) 279 set_bit(BM_P_VMALLOCED, &b->bm_flags); 280 else 281 clear_bit(BM_P_VMALLOCED, &b->bm_flags); 282 283 return new_pages; 284 } 285 286 /* 287 * called on driver init only. TODO call when a device is created. 288 * allocates the drbd_bitmap, and stores it in mdev->bitmap. 289 */ 290 int drbd_bm_init(struct drbd_conf *mdev) 291 { 292 struct drbd_bitmap *b = mdev->bitmap; 293 WARN_ON(b != NULL); 294 b = kzalloc(sizeof(struct drbd_bitmap), GFP_KERNEL); 295 if (!b) 296 return -ENOMEM; 297 spin_lock_init(&b->bm_lock); 298 init_MUTEX(&b->bm_change); 299 init_waitqueue_head(&b->bm_io_wait); 300 301 mdev->bitmap = b; 302 303 return 0; 304 } 305 306 sector_t drbd_bm_capacity(struct drbd_conf *mdev) 307 { 308 ERR_IF(!mdev->bitmap) return 0; 309 return mdev->bitmap->bm_dev_capacity; 310 } 311 312 /* called on driver unload. TODO: call when a device is destroyed. 313 */ 314 void drbd_bm_cleanup(struct drbd_conf *mdev) 315 { 316 ERR_IF (!mdev->bitmap) return; 317 bm_free_pages(mdev->bitmap->bm_pages, mdev->bitmap->bm_number_of_pages); 318 bm_vk_free(mdev->bitmap->bm_pages, test_bit(BM_P_VMALLOCED, &mdev->bitmap->bm_flags)); 319 kfree(mdev->bitmap); 320 mdev->bitmap = NULL; 321 } 322 323 /* 324 * since (b->bm_bits % BITS_PER_LONG) != 0, 325 * this masks out the remaining bits. 326 * Returns the number of bits cleared. 327 */ 328 static int bm_clear_surplus(struct drbd_bitmap *b) 329 { 330 const unsigned long mask = (1UL << (b->bm_bits & (BITS_PER_LONG-1))) - 1; 331 size_t w = b->bm_bits >> LN2_BPL; 332 int cleared = 0; 333 unsigned long *p_addr, *bm; 334 335 p_addr = bm_map_paddr(b, w); 336 bm = p_addr + MLPP(w); 337 if (w < b->bm_words) { 338 cleared = hweight_long(*bm & ~mask); 339 *bm &= mask; 340 w++; bm++; 341 } 342 343 if (w < b->bm_words) { 344 cleared += hweight_long(*bm); 345 *bm = 0; 346 } 347 bm_unmap(p_addr); 348 return cleared; 349 } 350 351 static void bm_set_surplus(struct drbd_bitmap *b) 352 { 353 const unsigned long mask = (1UL << (b->bm_bits & (BITS_PER_LONG-1))) - 1; 354 size_t w = b->bm_bits >> LN2_BPL; 355 unsigned long *p_addr, *bm; 356 357 p_addr = bm_map_paddr(b, w); 358 bm = p_addr + MLPP(w); 359 if (w < b->bm_words) { 360 *bm |= ~mask; 361 bm++; w++; 362 } 363 364 if (w < b->bm_words) { 365 *bm = ~(0UL); 366 } 367 bm_unmap(p_addr); 368 } 369 370 static unsigned long __bm_count_bits(struct drbd_bitmap *b, const int swap_endian) 371 { 372 unsigned long *p_addr, *bm, offset = 0; 373 unsigned long bits = 0; 374 unsigned long i, do_now; 375 376 while (offset < b->bm_words) { 377 i = do_now = min_t(size_t, b->bm_words-offset, LWPP); 378 p_addr = __bm_map_paddr(b, offset, KM_USER0); 379 bm = p_addr + MLPP(offset); 380 while (i--) { 381 #ifndef __LITTLE_ENDIAN 382 if (swap_endian) 383 *bm = lel_to_cpu(*bm); 384 #endif 385 bits += hweight_long(*bm++); 386 } 387 __bm_unmap(p_addr, KM_USER0); 388 offset += do_now; 389 cond_resched(); 390 } 391 392 return bits; 393 } 394 395 static unsigned long bm_count_bits(struct drbd_bitmap *b) 396 { 397 return __bm_count_bits(b, 0); 398 } 399 400 static unsigned long bm_count_bits_swap_endian(struct drbd_bitmap *b) 401 { 402 return __bm_count_bits(b, 1); 403 } 404 405 /* offset and len in long words.*/ 406 static void bm_memset(struct drbd_bitmap *b, size_t offset, int c, size_t len) 407 { 408 unsigned long *p_addr, *bm; 409 size_t do_now, end; 410 411 #define BM_SECTORS_PER_BIT (BM_BLOCK_SIZE/512) 412 413 end = offset + len; 414 415 if (end > b->bm_words) { 416 printk(KERN_ALERT "drbd: bm_memset end > bm_words\n"); 417 return; 418 } 419 420 while (offset < end) { 421 do_now = min_t(size_t, ALIGN(offset + 1, LWPP), end) - offset; 422 p_addr = bm_map_paddr(b, offset); 423 bm = p_addr + MLPP(offset); 424 if (bm+do_now > p_addr + LWPP) { 425 printk(KERN_ALERT "drbd: BUG BUG BUG! p_addr:%p bm:%p do_now:%d\n", 426 p_addr, bm, (int)do_now); 427 break; /* breaks to after catch_oob_access_end() only! */ 428 } 429 memset(bm, c, do_now * sizeof(long)); 430 bm_unmap(p_addr); 431 offset += do_now; 432 } 433 } 434 435 /* 436 * make sure the bitmap has enough room for the attached storage, 437 * if necessary, resize. 438 * called whenever we may have changed the device size. 439 * returns -ENOMEM if we could not allocate enough memory, 0 on success. 440 * In case this is actually a resize, we copy the old bitmap into the new one. 441 * Otherwise, the bitmap is initialized to all bits set. 442 */ 443 int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity) 444 { 445 struct drbd_bitmap *b = mdev->bitmap; 446 unsigned long bits, words, owords, obits, *p_addr, *bm; 447 unsigned long want, have, onpages; /* number of pages */ 448 struct page **npages, **opages = NULL; 449 int err = 0, growing; 450 int opages_vmalloced; 451 452 ERR_IF(!b) return -ENOMEM; 453 454 drbd_bm_lock(mdev, "resize"); 455 456 dev_info(DEV, "drbd_bm_resize called with capacity == %llu\n", 457 (unsigned long long)capacity); 458 459 if (capacity == b->bm_dev_capacity) 460 goto out; 461 462 opages_vmalloced = test_bit(BM_P_VMALLOCED, &b->bm_flags); 463 464 if (capacity == 0) { 465 spin_lock_irq(&b->bm_lock); 466 opages = b->bm_pages; 467 onpages = b->bm_number_of_pages; 468 owords = b->bm_words; 469 b->bm_pages = NULL; 470 b->bm_number_of_pages = 471 b->bm_set = 472 b->bm_bits = 473 b->bm_words = 474 b->bm_dev_capacity = 0; 475 spin_unlock_irq(&b->bm_lock); 476 bm_free_pages(opages, onpages); 477 bm_vk_free(opages, opages_vmalloced); 478 goto out; 479 } 480 bits = BM_SECT_TO_BIT(ALIGN(capacity, BM_SECT_PER_BIT)); 481 482 /* if we would use 483 words = ALIGN(bits,BITS_PER_LONG) >> LN2_BPL; 484 a 32bit host could present the wrong number of words 485 to a 64bit host. 486 */ 487 words = ALIGN(bits, 64) >> LN2_BPL; 488 489 if (get_ldev(mdev)) { 490 D_ASSERT((u64)bits <= (((u64)mdev->ldev->md.md_size_sect-MD_BM_OFFSET) << 12)); 491 put_ldev(mdev); 492 } 493 494 /* one extra long to catch off by one errors */ 495 want = ALIGN((words+1)*sizeof(long), PAGE_SIZE) >> PAGE_SHIFT; 496 have = b->bm_number_of_pages; 497 if (want == have) { 498 D_ASSERT(b->bm_pages != NULL); 499 npages = b->bm_pages; 500 } else { 501 if (FAULT_ACTIVE(mdev, DRBD_FAULT_BM_ALLOC)) 502 npages = NULL; 503 else 504 npages = bm_realloc_pages(b, want); 505 } 506 507 if (!npages) { 508 err = -ENOMEM; 509 goto out; 510 } 511 512 spin_lock_irq(&b->bm_lock); 513 opages = b->bm_pages; 514 owords = b->bm_words; 515 obits = b->bm_bits; 516 517 growing = bits > obits; 518 if (opages) 519 bm_set_surplus(b); 520 521 b->bm_pages = npages; 522 b->bm_number_of_pages = want; 523 b->bm_bits = bits; 524 b->bm_words = words; 525 b->bm_dev_capacity = capacity; 526 527 if (growing) { 528 bm_memset(b, owords, 0xff, words-owords); 529 b->bm_set += bits - obits; 530 } 531 532 if (want < have) { 533 /* implicit: (opages != NULL) && (opages != npages) */ 534 bm_free_pages(opages + want, have - want); 535 } 536 537 p_addr = bm_map_paddr(b, words); 538 bm = p_addr + MLPP(words); 539 *bm = DRBD_MAGIC; 540 bm_unmap(p_addr); 541 542 (void)bm_clear_surplus(b); 543 544 spin_unlock_irq(&b->bm_lock); 545 if (opages != npages) 546 bm_vk_free(opages, opages_vmalloced); 547 if (!growing) 548 b->bm_set = bm_count_bits(b); 549 dev_info(DEV, "resync bitmap: bits=%lu words=%lu\n", bits, words); 550 551 out: 552 drbd_bm_unlock(mdev); 553 return err; 554 } 555 556 /* inherently racy: 557 * if not protected by other means, return value may be out of date when 558 * leaving this function... 559 * we still need to lock it, since it is important that this returns 560 * bm_set == 0 precisely. 561 * 562 * maybe bm_set should be atomic_t ? 563 */ 564 static unsigned long _drbd_bm_total_weight(struct drbd_conf *mdev) 565 { 566 struct drbd_bitmap *b = mdev->bitmap; 567 unsigned long s; 568 unsigned long flags; 569 570 ERR_IF(!b) return 0; 571 ERR_IF(!b->bm_pages) return 0; 572 573 spin_lock_irqsave(&b->bm_lock, flags); 574 s = b->bm_set; 575 spin_unlock_irqrestore(&b->bm_lock, flags); 576 577 return s; 578 } 579 580 unsigned long drbd_bm_total_weight(struct drbd_conf *mdev) 581 { 582 unsigned long s; 583 /* if I don't have a disk, I don't know about out-of-sync status */ 584 if (!get_ldev_if_state(mdev, D_NEGOTIATING)) 585 return 0; 586 s = _drbd_bm_total_weight(mdev); 587 put_ldev(mdev); 588 return s; 589 } 590 591 size_t drbd_bm_words(struct drbd_conf *mdev) 592 { 593 struct drbd_bitmap *b = mdev->bitmap; 594 ERR_IF(!b) return 0; 595 ERR_IF(!b->bm_pages) return 0; 596 597 return b->bm_words; 598 } 599 600 unsigned long drbd_bm_bits(struct drbd_conf *mdev) 601 { 602 struct drbd_bitmap *b = mdev->bitmap; 603 ERR_IF(!b) return 0; 604 605 return b->bm_bits; 606 } 607 608 /* merge number words from buffer into the bitmap starting at offset. 609 * buffer[i] is expected to be little endian unsigned long. 610 * bitmap must be locked by drbd_bm_lock. 611 * currently only used from receive_bitmap. 612 */ 613 void drbd_bm_merge_lel(struct drbd_conf *mdev, size_t offset, size_t number, 614 unsigned long *buffer) 615 { 616 struct drbd_bitmap *b = mdev->bitmap; 617 unsigned long *p_addr, *bm; 618 unsigned long word, bits; 619 size_t end, do_now; 620 621 end = offset + number; 622 623 ERR_IF(!b) return; 624 ERR_IF(!b->bm_pages) return; 625 if (number == 0) 626 return; 627 WARN_ON(offset >= b->bm_words); 628 WARN_ON(end > b->bm_words); 629 630 spin_lock_irq(&b->bm_lock); 631 while (offset < end) { 632 do_now = min_t(size_t, ALIGN(offset+1, LWPP), end) - offset; 633 p_addr = bm_map_paddr(b, offset); 634 bm = p_addr + MLPP(offset); 635 offset += do_now; 636 while (do_now--) { 637 bits = hweight_long(*bm); 638 word = *bm | lel_to_cpu(*buffer++); 639 *bm++ = word; 640 b->bm_set += hweight_long(word) - bits; 641 } 642 bm_unmap(p_addr); 643 } 644 /* with 32bit <-> 64bit cross-platform connect 645 * this is only correct for current usage, 646 * where we _know_ that we are 64 bit aligned, 647 * and know that this function is used in this way, too... 648 */ 649 if (end == b->bm_words) 650 b->bm_set -= bm_clear_surplus(b); 651 652 spin_unlock_irq(&b->bm_lock); 653 } 654 655 /* copy number words from the bitmap starting at offset into the buffer. 656 * buffer[i] will be little endian unsigned long. 657 */ 658 void drbd_bm_get_lel(struct drbd_conf *mdev, size_t offset, size_t number, 659 unsigned long *buffer) 660 { 661 struct drbd_bitmap *b = mdev->bitmap; 662 unsigned long *p_addr, *bm; 663 size_t end, do_now; 664 665 end = offset + number; 666 667 ERR_IF(!b) return; 668 ERR_IF(!b->bm_pages) return; 669 670 spin_lock_irq(&b->bm_lock); 671 if ((offset >= b->bm_words) || 672 (end > b->bm_words) || 673 (number <= 0)) 674 dev_err(DEV, "offset=%lu number=%lu bm_words=%lu\n", 675 (unsigned long) offset, 676 (unsigned long) number, 677 (unsigned long) b->bm_words); 678 else { 679 while (offset < end) { 680 do_now = min_t(size_t, ALIGN(offset+1, LWPP), end) - offset; 681 p_addr = bm_map_paddr(b, offset); 682 bm = p_addr + MLPP(offset); 683 offset += do_now; 684 while (do_now--) 685 *buffer++ = cpu_to_lel(*bm++); 686 bm_unmap(p_addr); 687 } 688 } 689 spin_unlock_irq(&b->bm_lock); 690 } 691 692 /* set all bits in the bitmap */ 693 void drbd_bm_set_all(struct drbd_conf *mdev) 694 { 695 struct drbd_bitmap *b = mdev->bitmap; 696 ERR_IF(!b) return; 697 ERR_IF(!b->bm_pages) return; 698 699 spin_lock_irq(&b->bm_lock); 700 bm_memset(b, 0, 0xff, b->bm_words); 701 (void)bm_clear_surplus(b); 702 b->bm_set = b->bm_bits; 703 spin_unlock_irq(&b->bm_lock); 704 } 705 706 /* clear all bits in the bitmap */ 707 void drbd_bm_clear_all(struct drbd_conf *mdev) 708 { 709 struct drbd_bitmap *b = mdev->bitmap; 710 ERR_IF(!b) return; 711 ERR_IF(!b->bm_pages) return; 712 713 spin_lock_irq(&b->bm_lock); 714 bm_memset(b, 0, 0, b->bm_words); 715 b->bm_set = 0; 716 spin_unlock_irq(&b->bm_lock); 717 } 718 719 static void bm_async_io_complete(struct bio *bio, int error) 720 { 721 struct drbd_bitmap *b = bio->bi_private; 722 int uptodate = bio_flagged(bio, BIO_UPTODATE); 723 724 725 /* strange behavior of some lower level drivers... 726 * fail the request by clearing the uptodate flag, 727 * but do not return any error?! 728 * do we want to WARN() on this? */ 729 if (!error && !uptodate) 730 error = -EIO; 731 732 if (error) { 733 /* doh. what now? 734 * for now, set all bits, and flag MD_IO_ERROR */ 735 __set_bit(BM_MD_IO_ERROR, &b->bm_flags); 736 } 737 if (atomic_dec_and_test(&b->bm_async_io)) 738 wake_up(&b->bm_io_wait); 739 740 bio_put(bio); 741 } 742 743 static void bm_page_io_async(struct drbd_conf *mdev, struct drbd_bitmap *b, int page_nr, int rw) __must_hold(local) 744 { 745 /* we are process context. we always get a bio */ 746 struct bio *bio = bio_alloc(GFP_KERNEL, 1); 747 unsigned int len; 748 sector_t on_disk_sector = 749 mdev->ldev->md.md_offset + mdev->ldev->md.bm_offset; 750 on_disk_sector += ((sector_t)page_nr) << (PAGE_SHIFT-9); 751 752 /* this might happen with very small 753 * flexible external meta data device */ 754 len = min_t(unsigned int, PAGE_SIZE, 755 (drbd_md_last_sector(mdev->ldev) - on_disk_sector + 1)<<9); 756 757 bio->bi_bdev = mdev->ldev->md_bdev; 758 bio->bi_sector = on_disk_sector; 759 bio_add_page(bio, b->bm_pages[page_nr], len, 0); 760 bio->bi_private = b; 761 bio->bi_end_io = bm_async_io_complete; 762 763 if (FAULT_ACTIVE(mdev, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) { 764 bio->bi_rw |= rw; 765 bio_endio(bio, -EIO); 766 } else { 767 submit_bio(rw, bio); 768 } 769 } 770 771 # if defined(__LITTLE_ENDIAN) 772 /* nothing to do, on disk == in memory */ 773 # define bm_cpu_to_lel(x) ((void)0) 774 # else 775 void bm_cpu_to_lel(struct drbd_bitmap *b) 776 { 777 /* need to cpu_to_lel all the pages ... 778 * this may be optimized by using 779 * cpu_to_lel(-1) == -1 and cpu_to_lel(0) == 0; 780 * the following is still not optimal, but better than nothing */ 781 unsigned int i; 782 unsigned long *p_addr, *bm; 783 if (b->bm_set == 0) { 784 /* no page at all; avoid swap if all is 0 */ 785 i = b->bm_number_of_pages; 786 } else if (b->bm_set == b->bm_bits) { 787 /* only the last page */ 788 i = b->bm_number_of_pages - 1; 789 } else { 790 /* all pages */ 791 i = 0; 792 } 793 for (; i < b->bm_number_of_pages; i++) { 794 p_addr = kmap_atomic(b->bm_pages[i], KM_USER0); 795 for (bm = p_addr; bm < p_addr + PAGE_SIZE/sizeof(long); bm++) 796 *bm = cpu_to_lel(*bm); 797 kunmap_atomic(p_addr, KM_USER0); 798 } 799 } 800 # endif 801 /* lel_to_cpu == cpu_to_lel */ 802 # define bm_lel_to_cpu(x) bm_cpu_to_lel(x) 803 804 /* 805 * bm_rw: read/write the whole bitmap from/to its on disk location. 806 */ 807 static int bm_rw(struct drbd_conf *mdev, int rw) __must_hold(local) 808 { 809 struct drbd_bitmap *b = mdev->bitmap; 810 /* sector_t sector; */ 811 int bm_words, num_pages, i; 812 unsigned long now; 813 char ppb[10]; 814 int err = 0; 815 816 WARN_ON(!bm_is_locked(b)); 817 818 /* no spinlock here, the drbd_bm_lock should be enough! */ 819 820 bm_words = drbd_bm_words(mdev); 821 num_pages = (bm_words*sizeof(long) + PAGE_SIZE-1) >> PAGE_SHIFT; 822 823 /* on disk bitmap is little endian */ 824 if (rw == WRITE) 825 bm_cpu_to_lel(b); 826 827 now = jiffies; 828 atomic_set(&b->bm_async_io, num_pages); 829 __clear_bit(BM_MD_IO_ERROR, &b->bm_flags); 830 831 /* let the layers below us try to merge these bios... */ 832 for (i = 0; i < num_pages; i++) 833 bm_page_io_async(mdev, b, i, rw); 834 835 drbd_blk_run_queue(bdev_get_queue(mdev->ldev->md_bdev)); 836 wait_event(b->bm_io_wait, atomic_read(&b->bm_async_io) == 0); 837 838 if (test_bit(BM_MD_IO_ERROR, &b->bm_flags)) { 839 dev_alert(DEV, "we had at least one MD IO ERROR during bitmap IO\n"); 840 drbd_chk_io_error(mdev, 1, TRUE); 841 err = -EIO; 842 } 843 844 now = jiffies; 845 if (rw == WRITE) { 846 /* swap back endianness */ 847 bm_lel_to_cpu(b); 848 /* flush bitmap to stable storage */ 849 drbd_md_flush(mdev); 850 } else /* rw == READ */ { 851 /* just read, if necessary adjust endianness */ 852 b->bm_set = bm_count_bits_swap_endian(b); 853 dev_info(DEV, "recounting of set bits took additional %lu jiffies\n", 854 jiffies - now); 855 } 856 now = b->bm_set; 857 858 dev_info(DEV, "%s (%lu bits) marked out-of-sync by on disk bit-map.\n", 859 ppsize(ppb, now << (BM_BLOCK_SHIFT-10)), now); 860 861 return err; 862 } 863 864 /** 865 * drbd_bm_read() - Read the whole bitmap from its on disk location. 866 * @mdev: DRBD device. 867 */ 868 int drbd_bm_read(struct drbd_conf *mdev) __must_hold(local) 869 { 870 return bm_rw(mdev, READ); 871 } 872 873 /** 874 * drbd_bm_write() - Write the whole bitmap to its on disk location. 875 * @mdev: DRBD device. 876 */ 877 int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local) 878 { 879 return bm_rw(mdev, WRITE); 880 } 881 882 /** 883 * drbd_bm_write_sect: Writes a 512 (MD_SECTOR_SIZE) byte piece of the bitmap 884 * @mdev: DRBD device. 885 * @enr: Extent number in the resync lru (happens to be sector offset) 886 * 887 * The BM_EXT_SIZE is on purpose exactly the amount of the bitmap covered 888 * by a single sector write. Therefore enr == sector offset from the 889 * start of the bitmap. 890 */ 891 int drbd_bm_write_sect(struct drbd_conf *mdev, unsigned long enr) __must_hold(local) 892 { 893 sector_t on_disk_sector = enr + mdev->ldev->md.md_offset 894 + mdev->ldev->md.bm_offset; 895 int bm_words, num_words, offset; 896 int err = 0; 897 898 mutex_lock(&mdev->md_io_mutex); 899 bm_words = drbd_bm_words(mdev); 900 offset = S2W(enr); /* word offset into bitmap */ 901 num_words = min(S2W(1), bm_words - offset); 902 if (num_words < S2W(1)) 903 memset(page_address(mdev->md_io_page), 0, MD_SECTOR_SIZE); 904 drbd_bm_get_lel(mdev, offset, num_words, 905 page_address(mdev->md_io_page)); 906 if (!drbd_md_sync_page_io(mdev, mdev->ldev, on_disk_sector, WRITE)) { 907 int i; 908 err = -EIO; 909 dev_err(DEV, "IO ERROR writing bitmap sector %lu " 910 "(meta-disk sector %llus)\n", 911 enr, (unsigned long long)on_disk_sector); 912 drbd_chk_io_error(mdev, 1, TRUE); 913 for (i = 0; i < AL_EXT_PER_BM_SECT; i++) 914 drbd_bm_ALe_set_all(mdev, enr*AL_EXT_PER_BM_SECT+i); 915 } 916 mdev->bm_writ_cnt++; 917 mutex_unlock(&mdev->md_io_mutex); 918 return err; 919 } 920 921 /* NOTE 922 * find_first_bit returns int, we return unsigned long. 923 * should not make much difference anyways, but ... 924 * 925 * this returns a bit number, NOT a sector! 926 */ 927 #define BPP_MASK ((1UL << (PAGE_SHIFT+3)) - 1) 928 static unsigned long __bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo, 929 const int find_zero_bit, const enum km_type km) 930 { 931 struct drbd_bitmap *b = mdev->bitmap; 932 unsigned long i = -1UL; 933 unsigned long *p_addr; 934 unsigned long bit_offset; /* bit offset of the mapped page. */ 935 936 if (bm_fo > b->bm_bits) { 937 dev_err(DEV, "bm_fo=%lu bm_bits=%lu\n", bm_fo, b->bm_bits); 938 } else { 939 while (bm_fo < b->bm_bits) { 940 unsigned long offset; 941 bit_offset = bm_fo & ~BPP_MASK; /* bit offset of the page */ 942 offset = bit_offset >> LN2_BPL; /* word offset of the page */ 943 p_addr = __bm_map_paddr(b, offset, km); 944 945 if (find_zero_bit) 946 i = find_next_zero_bit(p_addr, PAGE_SIZE*8, bm_fo & BPP_MASK); 947 else 948 i = find_next_bit(p_addr, PAGE_SIZE*8, bm_fo & BPP_MASK); 949 950 __bm_unmap(p_addr, km); 951 if (i < PAGE_SIZE*8) { 952 i = bit_offset + i; 953 if (i >= b->bm_bits) 954 break; 955 goto found; 956 } 957 bm_fo = bit_offset + PAGE_SIZE*8; 958 } 959 i = -1UL; 960 } 961 found: 962 return i; 963 } 964 965 static unsigned long bm_find_next(struct drbd_conf *mdev, 966 unsigned long bm_fo, const int find_zero_bit) 967 { 968 struct drbd_bitmap *b = mdev->bitmap; 969 unsigned long i = -1UL; 970 971 ERR_IF(!b) return i; 972 ERR_IF(!b->bm_pages) return i; 973 974 spin_lock_irq(&b->bm_lock); 975 if (bm_is_locked(b)) 976 bm_print_lock_info(mdev); 977 978 i = __bm_find_next(mdev, bm_fo, find_zero_bit, KM_IRQ1); 979 980 spin_unlock_irq(&b->bm_lock); 981 return i; 982 } 983 984 unsigned long drbd_bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo) 985 { 986 return bm_find_next(mdev, bm_fo, 0); 987 } 988 989 #if 0 990 /* not yet needed for anything. */ 991 unsigned long drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_fo) 992 { 993 return bm_find_next(mdev, bm_fo, 1); 994 } 995 #endif 996 997 /* does not spin_lock_irqsave. 998 * you must take drbd_bm_lock() first */ 999 unsigned long _drbd_bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo) 1000 { 1001 /* WARN_ON(!bm_is_locked(mdev)); */ 1002 return __bm_find_next(mdev, bm_fo, 0, KM_USER1); 1003 } 1004 1005 unsigned long _drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_fo) 1006 { 1007 /* WARN_ON(!bm_is_locked(mdev)); */ 1008 return __bm_find_next(mdev, bm_fo, 1, KM_USER1); 1009 } 1010 1011 /* returns number of bits actually changed. 1012 * for val != 0, we change 0 -> 1, return code positive 1013 * for val == 0, we change 1 -> 0, return code negative 1014 * wants bitnr, not sector. 1015 * expected to be called for only a few bits (e - s about BITS_PER_LONG). 1016 * Must hold bitmap lock already. */ 1017 int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s, 1018 unsigned long e, int val, const enum km_type km) 1019 { 1020 struct drbd_bitmap *b = mdev->bitmap; 1021 unsigned long *p_addr = NULL; 1022 unsigned long bitnr; 1023 unsigned long last_page_nr = -1UL; 1024 int c = 0; 1025 1026 if (e >= b->bm_bits) { 1027 dev_err(DEV, "ASSERT FAILED: bit_s=%lu bit_e=%lu bm_bits=%lu\n", 1028 s, e, b->bm_bits); 1029 e = b->bm_bits ? b->bm_bits -1 : 0; 1030 } 1031 for (bitnr = s; bitnr <= e; bitnr++) { 1032 unsigned long offset = bitnr>>LN2_BPL; 1033 unsigned long page_nr = offset >> (PAGE_SHIFT - LN2_BPL + 3); 1034 if (page_nr != last_page_nr) { 1035 if (p_addr) 1036 __bm_unmap(p_addr, km); 1037 p_addr = __bm_map_paddr(b, offset, km); 1038 last_page_nr = page_nr; 1039 } 1040 if (val) 1041 c += (0 == __test_and_set_bit(bitnr & BPP_MASK, p_addr)); 1042 else 1043 c -= (0 != __test_and_clear_bit(bitnr & BPP_MASK, p_addr)); 1044 } 1045 if (p_addr) 1046 __bm_unmap(p_addr, km); 1047 b->bm_set += c; 1048 return c; 1049 } 1050 1051 /* returns number of bits actually changed. 1052 * for val != 0, we change 0 -> 1, return code positive 1053 * for val == 0, we change 1 -> 0, return code negative 1054 * wants bitnr, not sector */ 1055 int bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s, 1056 const unsigned long e, int val) 1057 { 1058 unsigned long flags; 1059 struct drbd_bitmap *b = mdev->bitmap; 1060 int c = 0; 1061 1062 ERR_IF(!b) return 1; 1063 ERR_IF(!b->bm_pages) return 0; 1064 1065 spin_lock_irqsave(&b->bm_lock, flags); 1066 if (bm_is_locked(b)) 1067 bm_print_lock_info(mdev); 1068 1069 c = __bm_change_bits_to(mdev, s, e, val, KM_IRQ1); 1070 1071 spin_unlock_irqrestore(&b->bm_lock, flags); 1072 return c; 1073 } 1074 1075 /* returns number of bits changed 0 -> 1 */ 1076 int drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsigned long e) 1077 { 1078 return bm_change_bits_to(mdev, s, e, 1); 1079 } 1080 1081 /* returns number of bits changed 1 -> 0 */ 1082 int drbd_bm_clear_bits(struct drbd_conf *mdev, const unsigned long s, const unsigned long e) 1083 { 1084 return -bm_change_bits_to(mdev, s, e, 0); 1085 } 1086 1087 /* sets all bits in full words, 1088 * from first_word up to, but not including, last_word */ 1089 static inline void bm_set_full_words_within_one_page(struct drbd_bitmap *b, 1090 int page_nr, int first_word, int last_word) 1091 { 1092 int i; 1093 int bits; 1094 unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr], KM_USER0); 1095 for (i = first_word; i < last_word; i++) { 1096 bits = hweight_long(paddr[i]); 1097 paddr[i] = ~0UL; 1098 b->bm_set += BITS_PER_LONG - bits; 1099 } 1100 kunmap_atomic(paddr, KM_USER0); 1101 } 1102 1103 /* Same thing as drbd_bm_set_bits, but without taking the spin_lock_irqsave. 1104 * You must first drbd_bm_lock(). 1105 * Can be called to set the whole bitmap in one go. 1106 * Sets bits from s to e _inclusive_. */ 1107 void _drbd_bm_set_bits(struct drbd_conf *mdev, const unsigned long s, const unsigned long e) 1108 { 1109 /* First set_bit from the first bit (s) 1110 * up to the next long boundary (sl), 1111 * then assign full words up to the last long boundary (el), 1112 * then set_bit up to and including the last bit (e). 1113 * 1114 * Do not use memset, because we must account for changes, 1115 * so we need to loop over the words with hweight() anyways. 1116 */ 1117 unsigned long sl = ALIGN(s,BITS_PER_LONG); 1118 unsigned long el = (e+1) & ~((unsigned long)BITS_PER_LONG-1); 1119 int first_page; 1120 int last_page; 1121 int page_nr; 1122 int first_word; 1123 int last_word; 1124 1125 if (e - s <= 3*BITS_PER_LONG) { 1126 /* don't bother; el and sl may even be wrong. */ 1127 __bm_change_bits_to(mdev, s, e, 1, KM_USER0); 1128 return; 1129 } 1130 1131 /* difference is large enough that we can trust sl and el */ 1132 1133 /* bits filling the current long */ 1134 if (sl) 1135 __bm_change_bits_to(mdev, s, sl-1, 1, KM_USER0); 1136 1137 first_page = sl >> (3 + PAGE_SHIFT); 1138 last_page = el >> (3 + PAGE_SHIFT); 1139 1140 /* MLPP: modulo longs per page */ 1141 /* LWPP: long words per page */ 1142 first_word = MLPP(sl >> LN2_BPL); 1143 last_word = LWPP; 1144 1145 /* first and full pages, unless first page == last page */ 1146 for (page_nr = first_page; page_nr < last_page; page_nr++) { 1147 bm_set_full_words_within_one_page(mdev->bitmap, page_nr, first_word, last_word); 1148 cond_resched(); 1149 first_word = 0; 1150 } 1151 1152 /* last page (respectively only page, for first page == last page) */ 1153 last_word = MLPP(el >> LN2_BPL); 1154 bm_set_full_words_within_one_page(mdev->bitmap, last_page, first_word, last_word); 1155 1156 /* possibly trailing bits. 1157 * example: (e & 63) == 63, el will be e+1. 1158 * if that even was the very last bit, 1159 * it would trigger an assert in __bm_change_bits_to() 1160 */ 1161 if (el <= e) 1162 __bm_change_bits_to(mdev, el, e, 1, KM_USER0); 1163 } 1164 1165 /* returns bit state 1166 * wants bitnr, NOT sector. 1167 * inherently racy... area needs to be locked by means of {al,rs}_lru 1168 * 1 ... bit set 1169 * 0 ... bit not set 1170 * -1 ... first out of bounds access, stop testing for bits! 1171 */ 1172 int drbd_bm_test_bit(struct drbd_conf *mdev, const unsigned long bitnr) 1173 { 1174 unsigned long flags; 1175 struct drbd_bitmap *b = mdev->bitmap; 1176 unsigned long *p_addr; 1177 int i; 1178 1179 ERR_IF(!b) return 0; 1180 ERR_IF(!b->bm_pages) return 0; 1181 1182 spin_lock_irqsave(&b->bm_lock, flags); 1183 if (bm_is_locked(b)) 1184 bm_print_lock_info(mdev); 1185 if (bitnr < b->bm_bits) { 1186 unsigned long offset = bitnr>>LN2_BPL; 1187 p_addr = bm_map_paddr(b, offset); 1188 i = test_bit(bitnr & BPP_MASK, p_addr) ? 1 : 0; 1189 bm_unmap(p_addr); 1190 } else if (bitnr == b->bm_bits) { 1191 i = -1; 1192 } else { /* (bitnr > b->bm_bits) */ 1193 dev_err(DEV, "bitnr=%lu > bm_bits=%lu\n", bitnr, b->bm_bits); 1194 i = 0; 1195 } 1196 1197 spin_unlock_irqrestore(&b->bm_lock, flags); 1198 return i; 1199 } 1200 1201 /* returns number of bits set in the range [s, e] */ 1202 int drbd_bm_count_bits(struct drbd_conf *mdev, const unsigned long s, const unsigned long e) 1203 { 1204 unsigned long flags; 1205 struct drbd_bitmap *b = mdev->bitmap; 1206 unsigned long *p_addr = NULL, page_nr = -1; 1207 unsigned long bitnr; 1208 int c = 0; 1209 size_t w; 1210 1211 /* If this is called without a bitmap, that is a bug. But just to be 1212 * robust in case we screwed up elsewhere, in that case pretend there 1213 * was one dirty bit in the requested area, so we won't try to do a 1214 * local read there (no bitmap probably implies no disk) */ 1215 ERR_IF(!b) return 1; 1216 ERR_IF(!b->bm_pages) return 1; 1217 1218 spin_lock_irqsave(&b->bm_lock, flags); 1219 if (bm_is_locked(b)) 1220 bm_print_lock_info(mdev); 1221 for (bitnr = s; bitnr <= e; bitnr++) { 1222 w = bitnr >> LN2_BPL; 1223 if (page_nr != w >> (PAGE_SHIFT - LN2_BPL + 3)) { 1224 page_nr = w >> (PAGE_SHIFT - LN2_BPL + 3); 1225 if (p_addr) 1226 bm_unmap(p_addr); 1227 p_addr = bm_map_paddr(b, w); 1228 } 1229 ERR_IF (bitnr >= b->bm_bits) { 1230 dev_err(DEV, "bitnr=%lu bm_bits=%lu\n", bitnr, b->bm_bits); 1231 } else { 1232 c += (0 != test_bit(bitnr - (page_nr << (PAGE_SHIFT+3)), p_addr)); 1233 } 1234 } 1235 if (p_addr) 1236 bm_unmap(p_addr); 1237 spin_unlock_irqrestore(&b->bm_lock, flags); 1238 return c; 1239 } 1240 1241 1242 /* inherently racy... 1243 * return value may be already out-of-date when this function returns. 1244 * but the general usage is that this is only use during a cstate when bits are 1245 * only cleared, not set, and typically only care for the case when the return 1246 * value is zero, or we already "locked" this "bitmap extent" by other means. 1247 * 1248 * enr is bm-extent number, since we chose to name one sector (512 bytes) 1249 * worth of the bitmap a "bitmap extent". 1250 * 1251 * TODO 1252 * I think since we use it like a reference count, we should use the real 1253 * reference count of some bitmap extent element from some lru instead... 1254 * 1255 */ 1256 int drbd_bm_e_weight(struct drbd_conf *mdev, unsigned long enr) 1257 { 1258 struct drbd_bitmap *b = mdev->bitmap; 1259 int count, s, e; 1260 unsigned long flags; 1261 unsigned long *p_addr, *bm; 1262 1263 ERR_IF(!b) return 0; 1264 ERR_IF(!b->bm_pages) return 0; 1265 1266 spin_lock_irqsave(&b->bm_lock, flags); 1267 if (bm_is_locked(b)) 1268 bm_print_lock_info(mdev); 1269 1270 s = S2W(enr); 1271 e = min((size_t)S2W(enr+1), b->bm_words); 1272 count = 0; 1273 if (s < b->bm_words) { 1274 int n = e-s; 1275 p_addr = bm_map_paddr(b, s); 1276 bm = p_addr + MLPP(s); 1277 while (n--) 1278 count += hweight_long(*bm++); 1279 bm_unmap(p_addr); 1280 } else { 1281 dev_err(DEV, "start offset (%d) too large in drbd_bm_e_weight\n", s); 1282 } 1283 spin_unlock_irqrestore(&b->bm_lock, flags); 1284 return count; 1285 } 1286 1287 /* set all bits covered by the AL-extent al_enr */ 1288 unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev, unsigned long al_enr) 1289 { 1290 struct drbd_bitmap *b = mdev->bitmap; 1291 unsigned long *p_addr, *bm; 1292 unsigned long weight; 1293 int count, s, e, i, do_now; 1294 ERR_IF(!b) return 0; 1295 ERR_IF(!b->bm_pages) return 0; 1296 1297 spin_lock_irq(&b->bm_lock); 1298 if (bm_is_locked(b)) 1299 bm_print_lock_info(mdev); 1300 weight = b->bm_set; 1301 1302 s = al_enr * BM_WORDS_PER_AL_EXT; 1303 e = min_t(size_t, s + BM_WORDS_PER_AL_EXT, b->bm_words); 1304 /* assert that s and e are on the same page */ 1305 D_ASSERT((e-1) >> (PAGE_SHIFT - LN2_BPL + 3) 1306 == s >> (PAGE_SHIFT - LN2_BPL + 3)); 1307 count = 0; 1308 if (s < b->bm_words) { 1309 i = do_now = e-s; 1310 p_addr = bm_map_paddr(b, s); 1311 bm = p_addr + MLPP(s); 1312 while (i--) { 1313 count += hweight_long(*bm); 1314 *bm = -1UL; 1315 bm++; 1316 } 1317 bm_unmap(p_addr); 1318 b->bm_set += do_now*BITS_PER_LONG - count; 1319 if (e == b->bm_words) 1320 b->bm_set -= bm_clear_surplus(b); 1321 } else { 1322 dev_err(DEV, "start offset (%d) too large in drbd_bm_ALe_set_all\n", s); 1323 } 1324 weight = b->bm_set - weight; 1325 spin_unlock_irq(&b->bm_lock); 1326 return weight; 1327 } 1328