Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[libata] restore sg on DMA mapping failure

authored by

Tejun Heo and committed by
Jeff Garzik
537a95d9 fecb4a0c

+8 -2
+8 -2
drivers/scsi/libata-core.c
··· 2622 2622 2623 2623 dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt, 2624 2624 sg->length, dir); 2625 - if (dma_mapping_error(dma_address)) 2625 + if (dma_mapping_error(dma_address)) { 2626 + /* restore sg */ 2627 + sg->length += qc->pad_len; 2626 2628 return -1; 2629 + } 2627 2630 2628 2631 sg_dma_address(sg) = dma_address; 2629 2632 sg_dma_len(sg) = sg->length; ··· 2697 2694 2698 2695 dir = qc->dma_dir; 2699 2696 n_elem = dma_map_sg(ap->host_set->dev, sg, qc->n_elem, dir); 2700 - if (n_elem < 1) 2697 + if (n_elem < 1) { 2698 + /* restore last sg */ 2699 + lsg->length += qc->pad_len; 2701 2700 return -1; 2701 + } 2702 2702 2703 2703 DPRINTK("%d sg elements mapped\n", n_elem); 2704 2704