]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.14.53/scsi-zfcp-fix-missing-rec-trigger-trace-for-all-objects-in-erp_failed.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.14.53 / scsi-zfcp-fix-missing-rec-trigger-trace-for-all-objects-in-erp_failed.patch
1 From 8c3d20aada70042a39c6a6625be037c1472ca610 Mon Sep 17 00:00:00 2001
2 From: Steffen Maier <maier@linux.ibm.com>
3 Date: Thu, 17 May 2018 19:14:48 +0200
4 Subject: scsi: zfcp: fix missing REC trigger trace for all objects in ERP_FAILED
5
6 From: Steffen Maier <maier@linux.ibm.com>
7
8 commit 8c3d20aada70042a39c6a6625be037c1472ca610 upstream.
9
10 That other commit introduced an inconsistency because it would trace on
11 ERP_FAILED for all callers of port forced reopen triggers (not just
12 terminate_rport_io), but it would not trace on ERP_FAILED for all callers of
13 other ERP triggers such as adapter, port regular, LUN.
14
15 Therefore, generalize that other commit. zfcp_erp_action_enqueue() already
16 had two early outs which re-used the one zfcp_dbf_rec_trig() call. All ERP
17 trigger functions finally run through zfcp_erp_action_enqueue(). So move
18 the special handling for ZFCP_STATUS_COMMON_ERP_FAILED into
19 zfcp_erp_action_enqueue() and add another early out with new trace marker
20 for pseudo ERP need in this case. This removes all early returns from all
21 ERP trigger functions so we always end up at zfcp_dbf_rec_trig().
22
23 Example trace record formatted with zfcpdbf from s390-tools:
24
25 Timestamp : ...
26 Area : REC
27 Subarea : 00
28 Level : 1
29 Exception : -
30 CPU ID : ..
31 Caller : 0x...
32 Record ID : 1 ZFCP_DBF_REC_TRIG
33 Tag : .......
34 LUN : 0x...
35 WWPN : 0x...
36 D_ID : 0x...
37 Adapter status : 0x...
38 Port status : 0x...
39 LUN status : 0x...
40 Ready count : 0x...
41 Running count : 0x...
42 ERP want : 0x0. ZFCP_ERP_ACTION_REOPEN_...
43 ERP need : 0xe0 ZFCP_ERP_ACTION_FAILED
44
45 Signed-off-by: Steffen Maier <maier@linux.ibm.com>
46 Cc: <stable@vger.kernel.org> #2.6.38+
47 Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
48 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
49 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
50
51 ---
52 drivers/s390/scsi/zfcp_erp.c | 79 +++++++++++++++++++++++++++----------------
53 1 file changed, 51 insertions(+), 28 deletions(-)
54
55 --- a/drivers/s390/scsi/zfcp_erp.c
56 +++ b/drivers/s390/scsi/zfcp_erp.c
57 @@ -143,6 +143,49 @@ static void zfcp_erp_action_dismiss_adap
58 }
59 }
60
61 +static int zfcp_erp_handle_failed(int want, struct zfcp_adapter *adapter,
62 + struct zfcp_port *port,
63 + struct scsi_device *sdev)
64 +{
65 + int need = want;
66 + struct zfcp_scsi_dev *zsdev;
67 +
68 + switch (want) {
69 + case ZFCP_ERP_ACTION_REOPEN_LUN:
70 + zsdev = sdev_to_zfcp(sdev);
71 + if (atomic_read(&zsdev->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
72 + need = 0;
73 + break;
74 + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
75 + if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
76 + need = 0;
77 + break;
78 + case ZFCP_ERP_ACTION_REOPEN_PORT:
79 + if (atomic_read(&port->status) &
80 + ZFCP_STATUS_COMMON_ERP_FAILED) {
81 + need = 0;
82 + /* ensure propagation of failed status to new devices */
83 + zfcp_erp_set_port_status(
84 + port, ZFCP_STATUS_COMMON_ERP_FAILED);
85 + }
86 + break;
87 + case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
88 + if (atomic_read(&adapter->status) &
89 + ZFCP_STATUS_COMMON_ERP_FAILED) {
90 + need = 0;
91 + /* ensure propagation of failed status to new devices */
92 + zfcp_erp_set_adapter_status(
93 + adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
94 + }
95 + break;
96 + default:
97 + need = 0;
98 + break;
99 + }
100 +
101 + return need;
102 +}
103 +
104 static int zfcp_erp_required_act(int want, struct zfcp_adapter *adapter,
105 struct zfcp_port *port,
106 struct scsi_device *sdev)
107 @@ -266,6 +309,12 @@ static int zfcp_erp_action_enqueue(int w
108 int retval = 1, need;
109 struct zfcp_erp_action *act;
110
111 + need = zfcp_erp_handle_failed(want, adapter, port, sdev);
112 + if (!need) {
113 + need = ZFCP_ERP_ACTION_FAILED; /* marker for trace */
114 + goto out;
115 + }
116 +
117 if (!adapter->erp_thread)
118 return -EIO;
119
120 @@ -314,12 +363,6 @@ static int _zfcp_erp_adapter_reopen(stru
121 zfcp_erp_adapter_block(adapter, clear_mask);
122 zfcp_scsi_schedule_rports_block(adapter);
123
124 - /* ensure propagation of failed status to new devices */
125 - if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
126 - zfcp_erp_set_adapter_status(adapter,
127 - ZFCP_STATUS_COMMON_ERP_FAILED);
128 - return -EIO;
129 - }
130 return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER,
131 adapter, NULL, NULL, id, 0);
132 }
133 @@ -338,12 +381,8 @@ void zfcp_erp_adapter_reopen(struct zfcp
134 zfcp_scsi_schedule_rports_block(adapter);
135
136 write_lock_irqsave(&adapter->erp_lock, flags);
137 - if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
138 - zfcp_erp_set_adapter_status(adapter,
139 - ZFCP_STATUS_COMMON_ERP_FAILED);
140 - else
141 - zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, adapter,
142 - NULL, NULL, id, 0);
143 + zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, adapter,
144 + NULL, NULL, id, 0);
145 write_unlock_irqrestore(&adapter->erp_lock, flags);
146 }
147
148 @@ -384,13 +423,6 @@ static void _zfcp_erp_port_forced_reopen
149 zfcp_erp_port_block(port, clear);
150 zfcp_scsi_schedule_rport_block(port);
151
152 - if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
153 - zfcp_dbf_rec_trig(id, port->adapter, port, NULL,
154 - ZFCP_ERP_ACTION_REOPEN_PORT_FORCED,
155 - ZFCP_ERP_ACTION_FAILED);
156 - return;
157 - }
158 -
159 zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED,
160 port->adapter, port, NULL, id, 0);
161 }
162 @@ -416,12 +448,6 @@ static int _zfcp_erp_port_reopen(struct
163 zfcp_erp_port_block(port, clear);
164 zfcp_scsi_schedule_rport_block(port);
165
166 - if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
167 - /* ensure propagation of failed status to new devices */
168 - zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED);
169 - return -EIO;
170 - }
171 -
172 return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT,
173 port->adapter, port, NULL, id, 0);
174 }
175 @@ -461,9 +487,6 @@ static void _zfcp_erp_lun_reopen(struct
176
177 zfcp_erp_lun_block(sdev, clear);
178
179 - if (atomic_read(&zfcp_sdev->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
180 - return;
181 -
182 zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_LUN, adapter,
183 zfcp_sdev->port, sdev, id, act_status);
184 }