[SCSI] ibmvscsi: fix leak when failing to send srp event

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
FUJITA Tomonori 2006-04-14 13:52:18 +09:00 committed by James Bottomley
parent 2ea0020250
commit e5dbfa6621

View File

@ -739,7 +739,8 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
{ {
struct viosrp_adapter_info *req; struct viosrp_adapter_info *req;
struct srp_event_struct *evt_struct; struct srp_event_struct *evt_struct;
dma_addr_t addr;
evt_struct = get_event_struct(&hostdata->pool); evt_struct = get_event_struct(&hostdata->pool);
if (!evt_struct) { if (!evt_struct) {
printk(KERN_ERR "ibmvscsi: couldn't allocate an event " 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.type = VIOSRP_ADAPTER_INFO_TYPE;
req->common.length = sizeof(hostdata->madapter_info); req->common.length = sizeof(hostdata->madapter_info);
req->buffer = dma_map_single(hostdata->dev, req->buffer = addr = dma_map_single(hostdata->dev,
&hostdata->madapter_info, &hostdata->madapter_info,
sizeof(hostdata->madapter_info), sizeof(hostdata->madapter_info),
DMA_BIDIRECTIONAL); DMA_BIDIRECTIONAL);
if (dma_mapping_error(req->buffer)) { if (dma_mapping_error(req->buffer)) {
printk(KERN_ERR printk(KERN_ERR
@ -770,8 +771,13 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
return; 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"); 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 viosrp_host_config *host_config;
struct srp_event_struct *evt_struct; struct srp_event_struct *evt_struct;
dma_addr_t addr;
int rc; int rc;
evt_struct = get_event_struct(&hostdata->pool); 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)); memset(host_config, 0x00, sizeof(*host_config));
host_config->common.type = VIOSRP_HOST_CONFIG_TYPE; host_config->common.type = VIOSRP_HOST_CONFIG_TYPE;
host_config->common.length = length; host_config->common.length = length;
host_config->buffer = dma_map_single(hostdata->dev, buffer, length, host_config->buffer = addr = dma_map_single(hostdata->dev, buffer,
DMA_BIDIRECTIONAL); length,
DMA_BIDIRECTIONAL);
if (dma_mapping_error(host_config->buffer)) { if (dma_mapping_error(host_config->buffer)) {
printk(KERN_ERR printk(KERN_ERR
@ -1291,11 +1299,9 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata,
init_completion(&evt_struct->comp); init_completion(&evt_struct->comp);
rc = ibmvscsi_send_srp_event(evt_struct, hostdata); rc = ibmvscsi_send_srp_event(evt_struct, hostdata);
if (rc == 0) { if (rc == 0)
wait_for_completion(&evt_struct->comp); wait_for_completion(&evt_struct->comp);
dma_unmap_single(hostdata->dev, host_config->buffer, dma_unmap_single(hostdata->dev, addr, length, DMA_BIDIRECTIONAL);
length, DMA_BIDIRECTIONAL);
}
return rc; return rc;
} }