summaryrefslogtreecommitdiffstats
path: root/drivers/ide
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2008-07-16 20:33:35 +0200
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-07-16 20:33:35 +0200
commit0b6abc17700a7843b165c677da0ac94522f83083 (patch)
treec347a4a03941731e4df26196fb52feb7492fac23 /drivers/ide
parent84e0f3f6c1e26588fdcb9f1b0f99d0275229bc99 (diff)
ide: avoid DMA on the stack for REQ_TYPE_ATA_PC
Some REQ_TYPE_ATA_PC commands uses the stack buffers for DMA, which leads to memory corruption on a non-coherent platform. With regard to alignment and padding, ide-cd has the the dma safe check for sg requests and REQ_TYPE_ATA_PC. This adds the stack buffer check to that check. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Borislav Petkov <petkovbb@gmail.com> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: Tejun Heo <htejun@gmail.com> Cc: Jens Axboe <jens.axboe@oracle.com> Cc: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide')
-rw-r--r--drivers/ide/ide-cd.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index d9984715718..d6667c36568 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -1195,6 +1195,7 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
int mask = drive->queue->dma_alignment;
unsigned long addr =
(unsigned long)page_address(bio_page(rq->bio));
+ unsigned long stack_mask = ~(THREAD_SIZE - 1);
info->dma = drive->using_dma;
@@ -1206,6 +1207,10 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
*/
if ((rq->data_len & 15) || (addr & mask))
info->dma = 0;
+
+ if (!((addr & stack_mask) ^
+ ((unsigned long)current->stack & stack_mask)))
+ info->dma = 0;
}
/* start sending the command to the drive */