Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: zfcp: Handle event-lost notification for Version Change events

As recovery for a lost Version Change event, trigger an Exchange Config
Data cmd to retrieve the current FW version.

Doing so requires process context (as eg. zfcp_qdio_sbal_get() might need
to sleep), so defer from tasklet context into a work item.

Link: https://lore.kernel.org/r/297c7be2944c3714863fcd22d531d910312d29f0.1603908167.git.bblock@linux.ibm.com
Suggested-by: Steffen Maier <maier@linux.ibm.com>
Reviewed-by: Steffen Maier <maier@linux.ibm.com>
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Julian Wiedmann and committed by
Martin K. Petersen
d9019631 a6c37abe

+16
+11
drivers/s390/scsi/zfcp_aux.c
··· 292 292 stat_work)); 293 293 } 294 294 295 + static void zfcp_version_change_lost_work(struct work_struct *work) 296 + { 297 + struct zfcp_adapter *adapter = container_of(work, struct zfcp_adapter, 298 + version_change_lost_work); 299 + 300 + zfcp_fsf_exchange_config_data_sync(adapter->qdio, NULL); 301 + } 302 + 295 303 static void zfcp_print_sl(struct seq_file *m, struct service_level *sl) 296 304 { 297 305 struct zfcp_adapter *adapter = ··· 361 353 INIT_WORK(&adapter->stat_work, _zfcp_status_read_scheduler); 362 354 INIT_DELAYED_WORK(&adapter->scan_work, zfcp_fc_scan_ports); 363 355 INIT_WORK(&adapter->ns_up_work, zfcp_fc_sym_name_update); 356 + INIT_WORK(&adapter->version_change_lost_work, 357 + zfcp_version_change_lost_work); 364 358 365 359 adapter->next_port_scan = jiffies; 366 360 ··· 439 429 cancel_delayed_work_sync(&adapter->scan_work); 440 430 cancel_work_sync(&adapter->stat_work); 441 431 cancel_work_sync(&adapter->ns_up_work); 432 + cancel_work_sync(&adapter->version_change_lost_work); 442 433 zfcp_destroy_adapter_work_queue(adapter); 443 434 444 435 zfcp_fc_wka_ports_force_offline(adapter->gs);
+1
drivers/s390/scsi/zfcp_def.h
··· 201 201 struct zfcp_fc_events events; 202 202 unsigned long next_port_scan; 203 203 struct zfcp_diag_adapter *diagnostics; 204 + struct work_struct version_change_lost_work; 204 205 }; 205 206 206 207 struct zfcp_port {
+3
drivers/s390/scsi/zfcp_fsf.c
··· 309 309 case FSF_STATUS_READ_NOTIFICATION_LOST: 310 310 if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_INCOMING_ELS) 311 311 zfcp_fc_conditional_port_scan(adapter); 312 + if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_VERSION_CHANGE) 313 + queue_work(adapter->work_queue, 314 + &adapter->version_change_lost_work); 312 315 break; 313 316 case FSF_STATUS_READ_FEATURE_UPDATE_ALERT: 314 317 adapter->adapter_features = sr_buf->payload.word[0];
+1
drivers/s390/scsi/zfcp_fsf.h
··· 143 143 144 144 /* status subtypes for unsolicited status notification lost */ 145 145 #define FSF_STATUS_READ_SUB_INCOMING_ELS 0x00000001 146 + #define FSF_STATUS_READ_SUB_VERSION_CHANGE 0x00000100 146 147 147 148 /* status subtypes for version change */ 148 149 #define FSF_STATUS_READ_SUB_LIC_CHANGE 0x00000001