|
@@ -1160,6 +1160,22 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect
|
|
|
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 *bitmap, sector_t offset, unsigned long sect
|
|
|
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 *bitmap, sector_t offset, unsigned long secto
|
|
|
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;
|
|
|
|