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

Configure Feed

Select the types of activity you want to include in your feed.

scsi: zfcp: Fix sysfs roll-back on error in zfcp_adapter_enqueue()

When zfcp_adapter_enqueue() fails to create the zfcp_sysfs_adapter_attrs
group, it calls zfcp_adapter_unregister() to tear down the adapter state
again. This then unconditionally attempts to remove the
zfcp_sysfs_adapter_attrs group, resulting in a "group not found" WARN from
sysfs code.

Avoid this by copying most of zfcp_adapter_unregister() into the error
path, allowing for more fine-granular roll-back. Then skip the sysfs
tear-down steps if we haven't progressed this far in the initialization.

Link: https://lore.kernel.org/r/790922cc3af075795fff9a4b787e6bda19bdb3be.1618417667.git.bblock@linux.ibm.com
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Reviewed-by: Steffen Maier <maier@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
ab1fa880 8824db89

+18 -2
+18 -2
drivers/s390/scsi/zfcp_aux.c
··· 418 418 goto failed; 419 419 420 420 if (zfcp_diag_sysfs_setup(adapter)) 421 - goto failed; 421 + goto err_diag_sysfs; 422 422 423 423 /* report size limit per scatter-gather segment */ 424 424 adapter->ccw_device->dev.dma_parms = &adapter->dma_parms; ··· 427 427 428 428 return adapter; 429 429 430 + err_diag_sysfs: 431 + sysfs_remove_group(&ccw_device->dev.kobj, &zfcp_sysfs_adapter_attrs); 430 432 failed: 431 - zfcp_adapter_unregister(adapter); 433 + /* TODO: make this more fine-granular */ 434 + cancel_delayed_work_sync(&adapter->scan_work); 435 + cancel_work_sync(&adapter->stat_work); 436 + cancel_work_sync(&adapter->ns_up_work); 437 + cancel_work_sync(&adapter->version_change_lost_work); 438 + zfcp_destroy_adapter_work_queue(adapter); 439 + 440 + zfcp_fc_wka_ports_force_offline(adapter->gs); 441 + zfcp_scsi_adapter_unregister(adapter); 442 + 443 + zfcp_erp_thread_kill(adapter); 444 + zfcp_dbf_adapter_unregister(adapter); 445 + zfcp_qdio_destroy(adapter->qdio); 446 + 447 + zfcp_ccw_adapter_put(adapter); /* final put to release */ 432 448 return ERR_PTR(-ENOMEM); 433 449 } 434 450