diff options
author | Hugh Dickins <hugh@veritas.com> | 2005-06-29 10:15:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-29 11:46:30 -0400 |
commit | fd782a4a99d2d3e818b9465c427b10f7f027d7da (patch) | |
tree | 271bdff83dc68c7196c7319c18bd6292b5d177c5 /drivers/block | |
parent | 541cecac534ea0df95fbc76b0a3091e91b101895 (diff) |
[PATCH] Fix get_request nastiness
get_request is now expected to be holding on to queue_lock, with interrupts
disabled, when it returns NULL; but one path forgot that, causing all kinds
of nastiness under swap load - badness backtraces, strange failures, BUGs.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/ll_rw_blk.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c index 1197462bb6ba..692a5fced76e 100644 --- a/drivers/block/ll_rw_blk.c +++ b/drivers/block/ll_rw_blk.c | |||
@@ -1917,10 +1917,9 @@ get_rq: | |||
1917 | * limit of requests, otherwise we could have thousands of requests | 1917 | * limit of requests, otherwise we could have thousands of requests |
1918 | * allocated with any setting of ->nr_requests | 1918 | * allocated with any setting of ->nr_requests |
1919 | */ | 1919 | */ |
1920 | if (rl->count[rw] >= (3 * q->nr_requests / 2)) { | 1920 | if (rl->count[rw] >= (3 * q->nr_requests / 2)) |
1921 | spin_unlock_irq(q->queue_lock); | ||
1922 | goto out; | 1921 | goto out; |
1923 | } | 1922 | |
1924 | rl->count[rw]++; | 1923 | rl->count[rw]++; |
1925 | rl->starved[rw] = 0; | 1924 | rl->starved[rw] = 0; |
1926 | if (rl->count[rw] >= queue_congestion_on_threshold(q)) | 1925 | if (rl->count[rw] >= queue_congestion_on_threshold(q)) |