]>
Commit | Line | Data |
---|---|---|
3839bec8 GKH |
1 | From 2e68adcd2fb21b7188ba449f0fab3bee2910e500 Mon Sep 17 00:00:00 2001 |
2 | From: Julian Wiedmann <jwi@linux.ibm.com> | |
3 | Date: Wed, 2 May 2018 08:28:34 +0200 | |
4 | Subject: s390/qdio: don't release memory in qdio_setup_irq() | |
5 | ||
6 | From: Julian Wiedmann <jwi@linux.ibm.com> | |
7 | ||
8 | commit 2e68adcd2fb21b7188ba449f0fab3bee2910e500 upstream. | |
9 | ||
10 | Calling qdio_release_memory() on error is just plain wrong. It frees | |
11 | the main qdio_irq struct, when following code still uses it. | |
12 | ||
13 | Also, no other error path in qdio_establish() does this. So trust | |
14 | callers to clean up via qdio_free() if some step of the QDIO | |
15 | initialization fails. | |
16 | ||
17 | Fixes: 779e6e1c724d ("[S390] qdio: new qdio driver.") | |
18 | Cc: <stable@vger.kernel.org> #v2.6.27+ | |
19 | Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> | |
20 | Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> | |
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
22 | ||
23 | --- | |
24 | drivers/s390/cio/qdio_setup.c | 10 ++-------- | |
25 | 1 file changed, 2 insertions(+), 8 deletions(-) | |
26 | ||
27 | --- a/drivers/s390/cio/qdio_setup.c | |
28 | +++ b/drivers/s390/cio/qdio_setup.c | |
29 | @@ -456,7 +456,6 @@ int qdio_setup_irq(struct qdio_initializ | |
30 | { | |
31 | struct ciw *ciw; | |
32 | struct qdio_irq *irq_ptr = init_data->cdev->private->qdio_data; | |
33 | - int rc; | |
34 | ||
35 | memset(&irq_ptr->qib, 0, sizeof(irq_ptr->qib)); | |
36 | memset(&irq_ptr->siga_flag, 0, sizeof(irq_ptr->siga_flag)); | |
37 | @@ -493,16 +492,14 @@ int qdio_setup_irq(struct qdio_initializ | |
38 | ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_EQUEUE); | |
39 | if (!ciw) { | |
40 | DBF_ERROR("%4x NO EQ", irq_ptr->schid.sch_no); | |
41 | - rc = -EINVAL; | |
42 | - goto out_err; | |
43 | + return -EINVAL; | |
44 | } | |
45 | irq_ptr->equeue = *ciw; | |
46 | ||
47 | ciw = ccw_device_get_ciw(init_data->cdev, CIW_TYPE_AQUEUE); | |
48 | if (!ciw) { | |
49 | DBF_ERROR("%4x NO AQ", irq_ptr->schid.sch_no); | |
50 | - rc = -EINVAL; | |
51 | - goto out_err; | |
52 | + return -EINVAL; | |
53 | } | |
54 | irq_ptr->aqueue = *ciw; | |
55 | ||
56 | @@ -510,9 +507,6 @@ int qdio_setup_irq(struct qdio_initializ | |
57 | irq_ptr->orig_handler = init_data->cdev->handler; | |
58 | init_data->cdev->handler = qdio_int_handler; | |
59 | return 0; | |
60 | -out_err: | |
61 | - qdio_release_memory(irq_ptr); | |
62 | - return rc; | |
63 | } | |
64 | ||
65 | void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, |