Whamcloud - gitweb
f64557ecc53f3f3186d8bc38bbe0ff69950bd589
[fs/lustre-release.git] / lustre / kernel_patches / patches / md-avoid-bug_on-when-bmc-overflow.patch
1 diff .prev/drivers/md/bitmap.c ./drivers/md/bitmap.c
2 --- .prev/drivers/md/bitmap.c   2007-02-07 13:03:56.000000000 +1100
3 +++ ./drivers/md/bitmap.c       2007-02-07 21:34:47.000000000 +1100
4 @@ -1160,6 +1160,22 @@ int bitmap_startwrite(struct bitmap *bit
5                         return 0;
6                 }
7  
8 +               if (unlikely((*bmc & COUNTER_MAX) == COUNTER_MAX)) {
9 +                       DEFINE_WAIT(__wait);
10 +                       /* note that it is safe to do the prepare_to_wait
11 +                        * after the test as long as we do it before dropping
12 +                        * the spinlock.
13 +                        */
14 +                       prepare_to_wait(&bitmap->overflow_wait, &__wait,
15 +                                       TASK_UNINTERRUPTIBLE);
16 +                       spin_unlock_irq(&bitmap->lock);
17 +                       bitmap->mddev->queue
18 +                               ->unplug_fn(bitmap->mddev->queue);
19 +                       schedule();
20 +                       finish_wait(&bitmap->overflow_wait, &__wait);
21 +                       continue;
22 +               }
23 +
24                 switch(*bmc) {
25                 case 0:
26                         bitmap_file_set_bit(bitmap, offset);
27 @@ -1169,7 +1185,7 @@ int bitmap_startwrite(struct bitmap *bit
28                 case 1:
29                         *bmc = 2;
30                 }
31 -               BUG_ON((*bmc & COUNTER_MAX) == COUNTER_MAX);
32 +
33                 (*bmc)++;
34  
35                 spin_unlock_irq(&bitmap->lock);
36 @@ -1207,6 +1223,9 @@ void bitmap_endwrite(struct bitmap *bitm
37                 if (!success && ! (*bmc & NEEDED_MASK))
38                         *bmc |= NEEDED_MASK;
39  
40 +               if ((*bmc & COUNTER_MAX) == COUNTER_MAX)
41 +                       wake_up(&bitmap->overflow_wait);
42 +
43                 (*bmc)--;
44                 if (*bmc <= 2) {
45                         set_page_attr(bitmap,
46 @@ -1431,6 +1450,7 @@ int bitmap_create(mddev_t *mddev)
47         spin_lock_init(&bitmap->lock);
48         atomic_set(&bitmap->pending_writes, 0);
49         init_waitqueue_head(&bitmap->write_wait);
50 +       init_waitqueue_head(&bitmap->overflow_wait);
51  
52         bitmap->mddev = mddev;
53  
54 diff .prev/include/linux/raid/bitmap.h ./include/linux/raid/bitmap.h
55 --- .prev/include/linux/raid/bitmap.h   2007-02-07 13:03:56.000000000 +1100
56 +++ ./include/linux/raid/bitmap.h       2007-02-07 20:57:57.000000000 +1100
57 @@ -247,6 +247,7 @@ struct bitmap {
58  
59         atomic_t pending_writes; /* pending writes to the bitmap file */
60         wait_queue_head_t write_wait;
61 +       wait_queue_head_t overflow_wait;
62  
63  };
64