mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 16:14:13 +08:00
[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:
parent
2ea0020250
commit
e5dbfa6621
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user