~ubuntu-branches/ubuntu/karmic/linux-mvl-dove/karmic-proposed

« back to all changes in this revision

Viewing changes to ubuntu/drbd/drbd_bitmap.c

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Bader
  • Date: 2010-03-10 22:24:12 UTC
  • mto: (15.1.2 karmic-security)
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20100310222412-k86m3r53jw0je7x1
Tags: upstream-2.6.31
ImportĀ upstreamĀ versionĀ 2.6.31

Show diffs side-by-side

added added

removed removed

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