diff options
author | Julian Wiedmann <jwi@linux.ibm.com> | 2018-05-02 02:28:34 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-05-15 01:40:38 -0400 |
commit | 2e68adcd2fb21b7188ba449f0fab3bee2910e500 (patch) | |
tree | 35c6161dd9e82d735dfcd6b9bc6f6c2c28eb77eb | |
parent | e521813468f786271a87e78e8644243bead48fad (diff) |
s390/qdio: don't release memory in qdio_setup_irq()
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.")
Cc: <stable@vger.kernel.org> #v2.6.27+
Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r-- | drivers/s390/cio/qdio_setup.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c index 22ddb49e0f50..4c14ce428e92 100644 --- a/drivers/s390/cio/qdio_setup.c +++ b/drivers/s390/cio/qdio_setup.c | |||
@@ -456,7 +456,6 @@ int qdio_setup_irq(struct qdio_initialize *init_data) | |||
456 | { | 456 | { |
457 | struct ciw *ciw; | 457 | struct ciw *ciw; |
458 | struct qdio_irq *irq_ptr = init_data->cdev->private->qdio_data; | 458 | struct qdio_irq *irq_ptr = init_data->cdev->private->qdio_data; |
459 | int rc; | ||
460 | 459 | ||
461 | memset(&irq_ptr->qib, 0, sizeof(irq_ptr->qib)); | 460 | memset(&irq_ptr->qib, 0, sizeof(irq_ptr->qib)); |
462 | memset(&irq_ptr->siga_flag, 0, sizeof(irq_ptr->siga_flag)); | 461 | memset(&irq_ptr->siga_flag, 0, sizeof(irq_ptr->siga_flag)); |
@@ -493,16 +492,14 @@ int qdio_setup_irq(struct qdio_initialize *init_data) | |||
493 | ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_EQUEUE); | 492 | ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_EQUEUE); |
494 | if (!ciw) { | 493 | if (!ciw) { |
495 | DBF_ERROR("%4x NO EQ", irq_ptr->schid.sch_no); | 494 | DBF_ERROR("%4x NO EQ", irq_ptr->schid.sch_no); |
496 | rc = -EINVAL; | 495 | return -EINVAL; |
497 | goto out_err; | ||
498 | } | 496 | } |
499 | irq_ptr->equeue = *ciw; | 497 | irq_ptr->equeue = *ciw; |
500 | 498 | ||
501 | ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_AQUEUE); | 499 | ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_AQUEUE); |
502 | if (!ciw) { | 500 | if (!ciw) { |
503 | DBF_ERROR("%4x NO AQ", irq_ptr->schid.sch_no); | 501 | DBF_ERROR("%4x NO AQ", irq_ptr->schid.sch_no); |
504 | rc = -EINVAL; | 502 | return -EINVAL; |
505 | goto out_err; | ||
506 | } | 503 | } |
507 | irq_ptr->aqueue = *ciw; | 504 | irq_ptr->aqueue = *ciw; |
508 | 505 | ||
@@ -512,9 +509,6 @@ int qdio_setup_irq(struct qdio_initialize *init_data) | |||
512 | init_data->cdev->handler = qdio_int_handler; | 509 | init_data->cdev->handler = qdio_int_handler; |
513 | spin_unlock_irq(get_ccwdev_lock(irq_ptr->cdev)); | 510 | spin_unlock_irq(get_ccwdev_lock(irq_ptr->cdev)); |
514 | return 0; | 511 | return 0; |
515 | out_err: | ||
516 | qdio_release_memory(irq_ptr); | ||
517 | return rc; | ||
518 | } | 512 | } |
519 | 513 | ||
520 | void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, | 514 | void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, |