| From 96067723e46b0dd24ae7b934085ab4eff4d26a1b Mon Sep 17 00:00:00 2001 |
| From: James Bottomley <JBottomley@Parallels.com> |
| Date: Sun, 18 Sep 2011 18:56:20 +0400 |
| Subject: [SCSI] 3w-9xxx: fix iommu_iova leak |
| |
| From: James Bottomley <JBottomley@Parallels.com> |
| |
| commit 96067723e46b0dd24ae7b934085ab4eff4d26a1b upstream. |
| |
| Following reports on the list, it looks like the 3e-9xxx driver will leak dma |
| mappings every time we get a transient queueing error back from the card. |
| This is because it maps the sg list in the routine that sends the command, but |
| doesn't unmap again in the transient failure path (even though the command is |
| sent back to the block layer). Fix by unmapping before returning the status. |
| |
| Reported-by: Chris Boot <bootc@bootc.net> |
| Tested-by: Chris Boot <bootc@bootc.net> |
| Acked-by: Adam Radford <aradford@gmail.com> |
| Signed-off-by: James Bottomley <JBottomley@Parallels.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/3w-9xxx.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/scsi/3w-9xxx.c |
| +++ b/drivers/scsi/3w-9xxx.c |
| @@ -1786,10 +1786,12 @@ static int twa_scsi_queue(struct scsi_cm |
| switch (retval) { |
| case SCSI_MLQUEUE_HOST_BUSY: |
| twa_free_request_id(tw_dev, request_id); |
| + twa_unmap_scsi_data(tw_dev, request_id); |
| break; |
| case 1: |
| tw_dev->state[request_id] = TW_S_COMPLETED; |
| twa_free_request_id(tw_dev, request_id); |
| + twa_unmap_scsi_data(tw_dev, request_id); |
| SCpnt->result = (DID_ERROR << 16); |
| done(SCpnt); |
| retval = 0; |