| From 2c8fc867602e385fd2abe76da0b6bda8ed907547 Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <bp@alien8.de> |
| Date: Mon, 3 Oct 2011 14:28:18 -0400 |
| Subject: ide-disk: Fix request requeuing |
| |
| From: Borislav Petkov <bp@alien8.de> |
| |
| commit 2c8fc867602e385fd2abe76da0b6bda8ed907547 upstream. |
| |
| Simon Kirby reported that on his RAID setup with idedisk underneath |
| the box OOMs after a couple of days of runtime. Running with |
| CONFIG_DEBUG_KMEMLEAK pointed to idedisk_prep_fn() which unconditionally |
| allocates an ide_cmd struct. However, ide_requeue_and_plug() can be |
| called more than once per request, either from the request issue or the |
| IRQ handler path and do blk_peek_request() ends up in idedisk_prep_fn() |
| repeatedly, allocating a struct ide_cmd everytime and "forgetting" the |
| previous pointer. |
| |
| Make sure the code reuses the old allocated chunk. |
| |
| Reported-and-tested-by: Simon Kirby <sim@hostway.ca> |
| Link: http://marc.info/?l=linux-kernel&m=131667641517919 |
| Link: http://lkml.kernel.org/r/20110922072643.GA27232@hostway.ca |
| Signed-off-by: Borislav Petkov <bp@alien8.de> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/ide/ide-disk.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/ide/ide-disk.c |
| +++ b/drivers/ide/ide-disk.c |
| @@ -435,7 +435,12 @@ static int idedisk_prep_fn(struct reques |
| if (!(rq->cmd_flags & REQ_FLUSH)) |
| return BLKPREP_OK; |
| |
| - cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); |
| + if (rq->special) { |
| + cmd = rq->special; |
| + memset(cmd, 0, sizeof(*cmd)); |
| + } else { |
| + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); |
| + } |
| |
| /* FIXME: map struct ide_taskfile on rq->cmd[] */ |
| BUG_ON(cmd == NULL); |