|
@@ -1661,49 +1661,3 @@ int drbd_bm_e_weight(struct drbd_conf *mdev, unsigned long enr)
|
|
|
spin_unlock_irqrestore(&b->bm_lock, flags);
|
|
|
return count;
|
|
|
}
|
|
|
-
|
|
|
-/* Set all bits covered by the AL-extent al_enr.
|
|
|
- * Returns number of bits changed. */
|
|
|
-unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev, unsigned long al_enr)
|
|
|
-{
|
|
|
- struct drbd_bitmap *b = mdev->bitmap;
|
|
|
- unsigned long *p_addr, *bm;
|
|
|
- unsigned long weight;
|
|
|
- unsigned long s, e;
|
|
|
- int count, i, do_now;
|
|
|
- if (!expect(b))
|
|
|
- return 0;
|
|
|
- if (!expect(b->bm_pages))
|
|
|
- return 0;
|
|
|
-
|
|
|
- spin_lock_irq(&b->bm_lock);
|
|
|
- if (BM_DONT_SET & b->bm_flags)
|
|
|
- bm_print_lock_info(mdev);
|
|
|
- weight = b->bm_set;
|
|
|
-
|
|
|
- s = al_enr * BM_WORDS_PER_AL_EXT;
|
|
|
- e = min_t(size_t, s + BM_WORDS_PER_AL_EXT, b->bm_words);
|
|
|
- /* assert that s and e are on the same page */
|
|
|
- D_ASSERT((e-1) >> (PAGE_SHIFT - LN2_BPL + 3)
|
|
|
- == s >> (PAGE_SHIFT - LN2_BPL + 3));
|
|
|
- count = 0;
|
|
|
- if (s < b->bm_words) {
|
|
|
- i = do_now = e-s;
|
|
|
- p_addr = bm_map_pidx(b, bm_word_to_page_idx(b, s));
|
|
|
- bm = p_addr + MLPP(s);
|
|
|
- while (i--) {
|
|
|
- count += hweight_long(*bm);
|
|
|
- *bm = -1UL;
|
|
|
- bm++;
|
|
|
- }
|
|
|
- bm_unmap(p_addr);
|
|
|
- b->bm_set += do_now*BITS_PER_LONG - count;
|
|
|
- if (e == b->bm_words)
|
|
|
- b->bm_set -= bm_clear_surplus(b);
|
|
|
- } else {
|
|
|
- dev_err(DEV, "start offset (%lu) too large in drbd_bm_ALe_set_all\n", s);
|
|
|
- }
|
|
|
- weight = b->bm_set - weight;
|
|
|
- spin_unlock_irq(&b->bm_lock);
|
|
|
- return weight;
|
|
|
-}
|