Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 47292
b: refs/heads/master
c: da6e1a3
h: refs/heads/master
v: v3
  • Loading branch information
Neil Brown authored and Linus Torvalds committed Feb 9, 2007
1 parent ead4144 commit e71bb48
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: aaf68cfbf2241d24d46583423f6bff5c47e088b3
refs/heads/master: da6e1a32fb8d7539a27f699c8671f64d7fefd0cc
22 changes: 21 additions & 1 deletion trunk/drivers/md/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/raid/bitmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

};

Expand Down

0 comments on commit e71bb48

Please sign in to comment.