| From: Julian Wiedmann <jwi@linux.ibm.com> |
| Date: Wed, 2 May 2018 08:28:34 +0200 |
| Subject: s390/qdio: don't release memory in qdio_setup_irq() |
| |
| commit 2e68adcd2fb21b7188ba449f0fab3bee2910e500 upstream. |
| |
| Calling qdio_release_memory() on error is just plain wrong. It frees |
| the main qdio_irq struct, when following code still uses it. |
| |
| Also, no other error path in qdio_establish() does this. So trust |
| callers to clean up via qdio_free() if some step of the QDIO |
| initialization fails. |
| |
| Fixes: 779e6e1c724d ("[S390] qdio: new qdio driver.") |
| Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/s390/cio/qdio_setup.c | 10 ++-------- |
| 1 file changed, 2 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/s390/cio/qdio_setup.c |
| +++ b/drivers/s390/cio/qdio_setup.c |
| @@ -406,7 +406,6 @@ int qdio_setup_irq(struct qdio_initializ |
| { |
| struct ciw *ciw; |
| struct qdio_irq *irq_ptr = init_data->cdev->private->qdio_data; |
| - int rc; |
| |
| memset(&irq_ptr->qib, 0, sizeof(irq_ptr->qib)); |
| memset(&irq_ptr->siga_flag, 0, sizeof(irq_ptr->siga_flag)); |
| @@ -443,16 +442,14 @@ int qdio_setup_irq(struct qdio_initializ |
| ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_EQUEUE); |
| if (!ciw) { |
| DBF_ERROR("%4x NO EQ", irq_ptr->schid.sch_no); |
| - rc = -EINVAL; |
| - goto out_err; |
| + return -EINVAL; |
| } |
| irq_ptr->equeue = *ciw; |
| |
| ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_AQUEUE); |
| if (!ciw) { |
| DBF_ERROR("%4x NO AQ", irq_ptr->schid.sch_no); |
| - rc = -EINVAL; |
| - goto out_err; |
| + return -EINVAL; |
| } |
| irq_ptr->aqueue = *ciw; |
| |
| @@ -460,9 +457,6 @@ int qdio_setup_irq(struct qdio_initializ |
| irq_ptr->orig_handler = init_data->cdev->handler; |
| init_data->cdev->handler = qdio_int_handler; |
| return 0; |
| -out_err: |
| - qdio_release_memory(irq_ptr); |
| - return rc; |
| } |
| |
| void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, |