[SCSI] ibmvscsi: fix leak when failing to send srp event
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Fri, 14 Apr 2006 04:52:18 +0000 (13:52 +0900)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Fri, 28 Apr 2006 14:24:44 +0000 (09:24 -0500)
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/ibmvscsi/ibmvscsi.c

index 0a8ad37ae8998407528f8c710e9ecb9b1cb82828..2e9be83a697feb90a36fbccfac58599ce19af58a 100644 (file)
@@ -739,7 +739,8 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
 {
        struct viosrp_adapter_info *req;
        struct srp_event_struct *evt_struct;
-       
+       dma_addr_t addr;
+
        evt_struct = get_event_struct(&hostdata->pool);
        if (!evt_struct) {
                printk(KERN_ERR "ibmvscsi: couldn't allocate an event "
@@ -757,10 +758,10 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
        
        req->common.type = VIOSRP_ADAPTER_INFO_TYPE;
        req->common.length = sizeof(hostdata->madapter_info);
-       req->buffer = dma_map_single(hostdata->dev,
-                                    &hostdata->madapter_info,
-                                    sizeof(hostdata->madapter_info),
-                                    DMA_BIDIRECTIONAL);
+       req->buffer = addr = dma_map_single(hostdata->dev,
+                                           &hostdata->madapter_info,
+                                           sizeof(hostdata->madapter_info),
+                                           DMA_BIDIRECTIONAL);
 
        if (dma_mapping_error(req->buffer)) {
                printk(KERN_ERR
@@ -770,8 +771,13 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
                return;
        }
        
-       if (ibmvscsi_send_srp_event(evt_struct, hostdata))
+       if (ibmvscsi_send_srp_event(evt_struct, hostdata)) {
                printk(KERN_ERR "ibmvscsi: couldn't send ADAPTER_INFO_REQ!\n");
+               dma_unmap_single(hostdata->dev,
+                                addr,
+                                sizeof(hostdata->madapter_info),
+                                DMA_BIDIRECTIONAL);
+       }
 };
 
 /**
@@ -1259,6 +1265,7 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata,
 {
        struct viosrp_host_config *host_config;
        struct srp_event_struct *evt_struct;
+       dma_addr_t addr;
        int rc;
 
        evt_struct = get_event_struct(&hostdata->pool);
@@ -1279,8 +1286,9 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata,
        memset(host_config, 0x00, sizeof(*host_config));
        host_config->common.type = VIOSRP_HOST_CONFIG_TYPE;
        host_config->common.length = length;
-       host_config->buffer = dma_map_single(hostdata->dev, buffer, length,
-                                           DMA_BIDIRECTIONAL);
+       host_config->buffer = addr = dma_map_single(hostdata->dev, buffer,
+                                                   length,
+                                                   DMA_BIDIRECTIONAL);
 
        if (dma_mapping_error(host_config->buffer)) {
                printk(KERN_ERR
@@ -1291,11 +1299,9 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata,
 
        init_completion(&evt_struct->comp);
        rc = ibmvscsi_send_srp_event(evt_struct, hostdata);
-       if (rc == 0) {
+       if (rc == 0)
                wait_for_completion(&evt_struct->comp);
-               dma_unmap_single(hostdata->dev, host_config->buffer,
-                                length, DMA_BIDIRECTIONAL);
-       }
+       dma_unmap_single(hostdata->dev, addr, length, DMA_BIDIRECTIONAL);
 
        return rc;
 }