Merge branch 'drbd-8.4_ed6' into for-3.8-drivers-drbd-8.4_ed6
[linux-drm-fsl-dcu.git] / drivers / block / drbd / drbd_bitmap.c
index e30ff720894f78abb636fb9404ffe05ad28bb77f..1ab205a4bf69c1b3e1ea733ebf716bd1bd83c31a 100644 (file)
@@ -304,25 +304,25 @@ static unsigned int bm_bit_to_page_idx(struct drbd_bitmap *b, u64 bitnr)
        return page_nr;
 }
 
-static unsigned long *__bm_map_pidx(struct drbd_bitmap *b, unsigned int idx, const enum km_type km)
+static unsigned long *__bm_map_pidx(struct drbd_bitmap *b, unsigned int idx)
 {
        struct page *page = b->bm_pages[idx];
-       return (unsigned long *) kmap_atomic(page, km);
+       return (unsigned long *) kmap_atomic(page);
 }
 
 static unsigned long *bm_map_pidx(struct drbd_bitmap *b, unsigned int idx)
 {
-       return __bm_map_pidx(b, idx, KM_IRQ1);
+       return __bm_map_pidx(b, idx);
 }
 
-static void __bm_unmap(unsigned long *p_addr, const enum km_type km)
+static void __bm_unmap(unsigned long *p_addr)
 {
-       kunmap_atomic(p_addr, km);
+       kunmap_atomic(p_addr);
 };
 
 static void bm_unmap(unsigned long *p_addr)
 {
-       return __bm_unmap(p_addr, KM_IRQ1);
+       return __bm_unmap(p_addr);
 }
 
 /* long word offset of _bitmap_ sector */
@@ -393,17 +393,16 @@ static struct page **bm_realloc_pages(struct drbd_bitmap *b, unsigned long want)
         * we must not block on IO to ourselves.
         * Context is receiver thread or dmsetup. */
        bytes = sizeof(struct page *)*want;
-       new_pages = kmalloc(bytes, GFP_NOIO);
+       new_pages = kzalloc(bytes, GFP_NOIO);
        if (!new_pages) {
                new_pages = __vmalloc(bytes,
-                               GFP_NOIO | __GFP_HIGHMEM,
+                               GFP_NOIO | __GFP_HIGHMEM | __GFP_ZERO,
                                PAGE_KERNEL);
                if (!new_pages)
                        return NULL;
                vmalloced = 1;
        }
 
-       memset(new_pages, 0, bytes);
        if (want >= have) {
                for (i = 0; i < have; i++)
                        new_pages[i] = old_pages[i];
@@ -563,15 +562,15 @@ static unsigned long bm_count_bits(struct drbd_bitmap *b)
 
        /* all but last page */
        for (idx = 0; idx < b->bm_number_of_pages - 1; idx++) {
-               p_addr = __bm_map_pidx(b, idx, KM_USER0);
+               p_addr = __bm_map_pidx(b, idx);
                for (i = 0; i < LWPP; i++)
                        bits += hweight_long(p_addr[i]);
-               __bm_unmap(p_addr, KM_USER0);
+               __bm_unmap(p_addr);
                cond_resched();
        }
        /* last (or only) page */
        last_word = ((b->bm_bits - 1) & BITS_PER_PAGE_MASK) >> LN2_BPL;
-       p_addr = __bm_map_pidx(b, idx, KM_USER0);
+       p_addr = __bm_map_pidx(b, idx);
        for (i = 0; i < last_word; i++)
                bits += hweight_long(p_addr[i]);
        p_addr[last_word] &= cpu_to_lel(mask);
@@ -579,7 +578,7 @@ static unsigned long bm_count_bits(struct drbd_bitmap *b)
        /* 32bit arch, may have an unused padding long */
        if (BITS_PER_LONG == 32 && (last_word & 1) == 0)
                p_addr[last_word+1] = 0;
-       __bm_unmap(p_addr, KM_USER0);
+       __bm_unmap(p_addr);
        return bits;
 }
 
@@ -1014,11 +1013,11 @@ static void bm_page_io_async(struct bm_aio_ctx *ctx, int page_nr, int rw) __must
        if (ctx->flags & BM_AIO_COPY_PAGES) {
                void *src, *dest;
                page = mempool_alloc(drbd_md_io_page_pool, __GFP_HIGHMEM|__GFP_WAIT);
-               dest = kmap_atomic(page, KM_USER0);
-               src = kmap_atomic(b->bm_pages[page_nr], KM_USER1);
+               dest = kmap_atomic(page);
+               src = kmap_atomic(b->bm_pages[page_nr]);
                memcpy(dest, src, PAGE_SIZE);
-               kunmap_atomic(src, KM_USER1);
-               kunmap_atomic(dest, KM_USER0);
+               kunmap_atomic(src);
+               kunmap_atomic(dest);
                bm_store_page_idx(page, page_nr);
        } else
                page = b->bm_pages[page_nr];
@@ -1295,7 +1294,7 @@ int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(loc
  * this returns a bit number, NOT a sector!
  */
 static unsigned long __bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo,
-       const int find_zero_bit, const enum km_type km)
+       const int find_zero_bit)
 {
        struct drbd_bitmap *b = mdev->bitmap;
        unsigned long *p_addr;
@@ -1310,7 +1309,7 @@ static unsigned long __bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo,
                while (bm_fo < b->bm_bits) {
                        /* bit offset of the first bit in the page */
                        bit_offset = bm_fo & ~BITS_PER_PAGE_MASK;
-                       p_addr = __bm_map_pidx(b, bm_bit_to_page_idx(b, bm_fo), km);
+                       p_addr = __bm_map_pidx(b, bm_bit_to_page_idx(b, bm_fo));
 
                        if (find_zero_bit)
                                i = find_next_zero_bit_le(p_addr,
@@ -1319,7 +1318,7 @@ static unsigned long __bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo,
                                i = find_next_bit_le(p_addr,
                                                PAGE_SIZE*8, bm_fo & BITS_PER_PAGE_MASK);
 
-                       __bm_unmap(p_addr, km);
+                       __bm_unmap(p_addr);
                        if (i < PAGE_SIZE*8) {
                                bm_fo = bit_offset + i;
                                if (bm_fo >= b->bm_bits)
@@ -1349,7 +1348,7 @@ static unsigned long bm_find_next(struct drbd_conf *mdev,
        if (BM_DONT_TEST & b->bm_flags)
                bm_print_lock_info(mdev);
 
-       i = __bm_find_next(mdev, bm_fo, find_zero_bit, KM_IRQ1);
+       i = __bm_find_next(mdev, bm_fo, find_zero_bit);
 
        spin_unlock_irq(&b->bm_lock);
        return i;
@@ -1373,13 +1372,13 @@ unsigned long drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_fo
 unsigned long _drbd_bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo)
 {
        /* WARN_ON(!(BM_DONT_SET & mdev->b->bm_flags)); */
-       return __bm_find_next(mdev, bm_fo, 0, KM_USER1);
+       return __bm_find_next(mdev, bm_fo, 0);
 }
 
 unsigned long _drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_fo)
 {
        /* WARN_ON(!(BM_DONT_SET & mdev->b->bm_flags)); */
-       return __bm_find_next(mdev, bm_fo, 1, KM_USER1);
+       return __bm_find_next(mdev, bm_fo, 1);
 }
 
 /* returns number of bits actually changed.
@@ -1407,14 +1406,14 @@ static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
                unsigned int page_nr = bm_bit_to_page_idx(b, bitnr);
                if (page_nr != last_page_nr) {
                        if (p_addr)
-                               __bm_unmap(p_addr, KM_IRQ1);
+                               __bm_unmap(p_addr);
                        if (c < 0)
                                bm_set_page_lazy_writeout(b->bm_pages[last_page_nr]);
                        else if (c > 0)
                                bm_set_page_need_writeout(b->bm_pages[last_page_nr]);
                        changed_total += c;
                        c = 0;
-                       p_addr = __bm_map_pidx(b, page_nr, KM_IRQ1);
+                       p_addr = __bm_map_pidx(b, page_nr);
                        last_page_nr = page_nr;
                }
                if (val)
@@ -1423,7 +1422,7 @@ static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
                        c -= (0 != __test_and_clear_bit_le(bitnr & BITS_PER_PAGE_MASK, p_addr));
        }
        if (p_addr)
-               __bm_unmap(p_addr, KM_IRQ1);
+               __bm_unmap(p_addr);
        if (c < 0)
                bm_set_page_lazy_writeout(b->bm_pages[last_page_nr]);
        else if (c > 0)
@@ -1479,13 +1478,13 @@ static inline void bm_set_full_words_within_one_page(struct drbd_bitmap *b,
        int i;
        int bits;
        int changed = 0;
-       unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr], KM_IRQ1);
+       unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr]);
        for (i = first_word; i < last_word; i++) {
                bits = hweight_long(paddr[i]);
                paddr[i] = ~0UL;
                changed += BITS_PER_LONG - bits;
        }
-       kunmap_atomic(paddr, KM_IRQ1);
+       kunmap_atomic(paddr);
        if (changed) {
                /* We only need lazy writeout, the information is still in the
                 * remote bitmap as well, and is reconstructed during the next