aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-02-08 14:20:37 -0800
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-09 09:25:47 -0800
commitda6e1a32fb8d7539a27f699c8671f64d7fefd0cc (patch)
tree8faa7713ad1333b30d8ba668627251dbc1e0b4ad /include
parentaaf68cfbf2241d24d46583423f6bff5c47e088b3 (diff)
downloadkernel_samsung_smdk4412-da6e1a32fb8d7539a27f699c8671f64d7fefd0cc.zip
kernel_samsung_smdk4412-da6e1a32fb8d7539a27f699c8671f64d7fefd0cc.tar.gz
kernel_samsung_smdk4412-da6e1a32fb8d7539a27f699c8671f64d7fefd0cc.tar.bz2
[PATCH] md: avoid possible BUG_ON in md bitmap handling
md/bitmap tracks how many active write requests are pending on blocks associated with each bit in the bitmap, so that it knows when it can clear the bit (when count hits zero). The counter has 14 bits of space, so if there are ever more than 16383, we cannot cope. Currently the code just calles BUG_ON as "all" drivers have request queue limits much smaller than this. However is seems that some don't. Apparently some multipath configurations can allow more than 16383 concurrent write requests. So, in this unlikely situation, instead of calling BUG_ON we now wait for the count to drop down a bit. This requires a new wait_queue_head, some waiting code, and a wakeup call. Tested by limiting the counter to 20 instead of 16383 (writes go a lot slower in that case...). Signed-off-by: Neil Brown <neilb@suse.de> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/raid/bitmap.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h
index ebd42a3..6db9a4c 100644
--- a/include/linux/raid/bitmap.h
+++ b/include/linux/raid/bitmap.h
@@ -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;
};