From fd8c09df09e89cbeb2ae34f5e1aaa65e065b8ecc Mon Sep 17 00:00:00 2001 From: yangsheng Date: Wed, 30 Sep 2009 04:13:00 +0000 Subject: [PATCH] Branch HEAD b=19990 i=adilger, johann Add patch come from upstream kernel to handle the bitmap counter overflow. --- .../md-avoid-bug_on-when-bmc-overflow.patch | 64 ++++++++++++++++++++++ lustre/kernel_patches/series/2.6-rhel5.series | 1 + 2 files changed, 65 insertions(+) create mode 100644 lustre/kernel_patches/patches/md-avoid-bug_on-when-bmc-overflow.patch diff --git a/lustre/kernel_patches/patches/md-avoid-bug_on-when-bmc-overflow.patch b/lustre/kernel_patches/patches/md-avoid-bug_on-when-bmc-overflow.patch new file mode 100644 index 0000000..f64557e --- /dev/null +++ b/lustre/kernel_patches/patches/md-avoid-bug_on-when-bmc-overflow.patch @@ -0,0 +1,64 @@ +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; + + }; + diff --git a/lustre/kernel_patches/series/2.6-rhel5.series b/lustre/kernel_patches/series/2.6-rhel5.series index 071c4d7..c6dccfe 100644 --- a/lustre/kernel_patches/series/2.6-rhel5.series +++ b/lustre/kernel_patches/series/2.6-rhel5.series @@ -26,3 +26,4 @@ mpt-fusion-max-sge.patch prune-icache-use-trylock-rhel5.patch jbd2-jcberr-2.6-rhel5.patch jbd2-commit-timer-no-jiffies-rounding.diff +md-avoid-bug_on-when-bmc-overflow.patch -- 1.8.3.1