--- /dev/null
+diff .prev/drivers/md/bitmap.c ./drivers/md/bitmap.c
+--- .prev/drivers/md/bitmap.c 2007-02-07 13:03:56.000000000 +1100
++++ ./drivers/md/bitmap.c 2007-02-07 21:34:47.000000000 +1100
+@@ -1160,6 +1160,22 @@ int bitmap_startwrite(struct bitmap *bit
+ return 0;
+ }
+
++ if (unlikely((*bmc & COUNTER_MAX) == COUNTER_MAX)) {
++ DEFINE_WAIT(__wait);
++ /* note that it is safe to do the prepare_to_wait
++ * after the test as long as we do it before dropping
++ * the spinlock.
++ */
++ prepare_to_wait(&bitmap->overflow_wait, &__wait,
++ TASK_UNINTERRUPTIBLE);
++ spin_unlock_irq(&bitmap->lock);
++ bitmap->mddev->queue
++ ->unplug_fn(bitmap->mddev->queue);
++ schedule();
++ finish_wait(&bitmap->overflow_wait, &__wait);
++ continue;
++ }
++
+ switch(*bmc) {
+ case 0:
+ bitmap_file_set_bit(bitmap, offset);
+@@ -1169,7 +1185,7 @@ int bitmap_startwrite(struct bitmap *bit
+ case 1:
+ *bmc = 2;
+ }
+- BUG_ON((*bmc & COUNTER_MAX) == COUNTER_MAX);
++
+ (*bmc)++;
+
+ spin_unlock_irq(&bitmap->lock);
+@@ -1207,6 +1223,9 @@ void bitmap_endwrite(struct bitmap *bitm
+ if (!success && ! (*bmc & NEEDED_MASK))
+ *bmc |= NEEDED_MASK;
+
++ if ((*bmc & COUNTER_MAX) == COUNTER_MAX)
++ wake_up(&bitmap->overflow_wait);
++
+ (*bmc)--;
+ if (*bmc <= 2) {
+ set_page_attr(bitmap,
+@@ -1431,6 +1450,7 @@ int bitmap_create(mddev_t *mddev)
+ spin_lock_init(&bitmap->lock);
+ atomic_set(&bitmap->pending_writes, 0);
+ init_waitqueue_head(&bitmap->write_wait);
++ init_waitqueue_head(&bitmap->overflow_wait);
+
+ bitmap->mddev = mddev;
+
+diff .prev/include/linux/raid/bitmap.h ./include/linux/raid/bitmap.h
+--- .prev/include/linux/raid/bitmap.h 2007-02-07 13:03:56.000000000 +1100
++++ ./include/linux/raid/bitmap.h 2007-02-07 20:57:57.000000000 +1100
+@@ -247,6 +247,7 @@ struct bitmap {
+
+ atomic_t pending_writes; /* pending writes to the bitmap file */
+ wait_queue_head_t write_wait;
++ wait_queue_head_t overflow_wait;
+
+ };
+