|
27 | 27 |
|
28 | 28 | struct kmem_cache *zfcp_fsf_qtcb_cache;
|
29 | 29 |
|
| 30 | +static bool ber_stop = true; |
| 31 | +module_param(ber_stop, bool, 0600); |
| 32 | +MODULE_PARM_DESC(ber_stop, |
| 33 | + "Shuts down FCP devices for FCP channels that report a bit-error count in excess of its threshold (default on)"); |
| 34 | + |
30 | 35 | static void zfcp_fsf_request_timeout_handler(struct timer_list *t)
|
31 | 36 | {
|
32 | 37 | struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer);
|
@@ -236,10 +241,15 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
|
236 | 241 | case FSF_STATUS_READ_SENSE_DATA_AVAIL:
|
237 | 242 | break;
|
238 | 243 | case FSF_STATUS_READ_BIT_ERROR_THRESHOLD:
|
239 |
| - dev_warn(&adapter->ccw_device->dev, |
240 |
| - "The error threshold for checksum statistics " |
241 |
| - "has been exceeded\n"); |
242 | 244 | zfcp_dbf_hba_bit_err("fssrh_3", req);
|
| 245 | + if (ber_stop) { |
| 246 | + dev_warn(&adapter->ccw_device->dev, |
| 247 | + "All paths over this FCP device are disused because of excessive bit errors\n"); |
| 248 | + zfcp_erp_adapter_shutdown(adapter, 0, "fssrh_b"); |
| 249 | + } else { |
| 250 | + dev_warn(&adapter->ccw_device->dev, |
| 251 | + "The error threshold for checksum statistics has been exceeded\n"); |
| 252 | + } |
243 | 253 | break;
|
244 | 254 | case FSF_STATUS_READ_LINK_DOWN:
|
245 | 255 | zfcp_fsf_status_read_link_down(req);
|
|
0 commit comments