diff options
author | Andi Kleen <ak@muc.de> | 2005-12-20 14:45:19 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-12-20 10:13:54 -0800 |
commit | 7e8702334841b6da4b8f564dc1771ca17c59a621 (patch) | |
tree | 73f52ad8b0b61a5d863b324041bcc519d7cc5242 /lib | |
parent | 7ca0b3bf695632003a2a0f98b9fc1451b0483346 (diff) | |
download | op-kernel-dev-7e8702334841b6da4b8f564dc1771ca17c59a621.zip op-kernel-dev-7e8702334841b6da4b8f564dc1771ca17c59a621.tar.gz |
[PATCH] Fix swiotlb pci_map_sg error handling
The overflow checking condition in lib/swiotlb.c was wrong.
It would first run a NULL pointer through virt_to_phys before
testing it. Since pci_map_sg overflow is not that uncommon
and causes data corruption (including broken file systems) when not
properly detected I think it's better to fix it in 2.6.15.
This affects x86-64 and IA64.
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/swiotlb.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 57216f3..1ff8dce 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -704,8 +704,9 @@ swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nelems, addr = SG_ENT_VIRT_ADDRESS(sg); dev_addr = virt_to_phys(addr); if (swiotlb_force || address_needs_mapping(hwdev, dev_addr)) { - sg->dma_address = (dma_addr_t) virt_to_phys(map_single(hwdev, addr, sg->length, dir)); - if (!sg->dma_address) { + void *map = map_single(hwdev, addr, sg->length, dir); + sg->dma_address = virt_to_bus(map); + if (!map) { /* Don't panic here, we expect map_sg users to do proper error handling. */ swiotlb_full(hwdev, sg->length, dir, 0); |