On 7/14/22 11:02 AM, Mike Christie wrote: > On 7/12/22 5:19 PM, Bart Van Assche wrote: >> From: Ming Lei <ming.lei@xxxxxxxxxx> >> >> Fix the race conditions between SCSI LLD kernel module unloading and SCSI >> device and target removal by making sure that SCSI hosts are destroyed after >> all associated target and device objects have been freed. >> >> Cc: Christoph Hellwig <hch@xxxxxx> >> Cc: Ming Lei <ming.lei@xxxxxxxxxx> >> Cc: Mike Christie <michael.christie@xxxxxxxxxx> >> Cc: Hannes Reinecke <hare@xxxxxxx> >> Cc: John Garry <john.garry@xxxxxxxxxx> >> Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> >> Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> >> [ bvanassche: Reworked Ming's patch and split it ] >> --- >> drivers/scsi/hosts.c | 8 ++++++++ >> drivers/scsi/scsi_scan.c | 7 +++++++ >> include/scsi/scsi_host.h | 3 +++ >> 3 files changed, 18 insertions(+) >> >> diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c >> index ef6c0e37acce..8fa98c8d0ee0 100644 >> --- a/drivers/scsi/hosts.c >> +++ b/drivers/scsi/hosts.c >> @@ -190,6 +190,13 @@ void scsi_remove_host(struct Scsi_Host *shost) >> transport_unregister_device(&shost->shost_gendev); >> device_unregister(&shost->shost_dev); >> device_del(&shost->shost_gendev); >> + >> + /* >> + * After scsi_remove_host() has returned the scsi LLD module can be >> + * unloaded and/or the host resources can be released. Hence wait until >> + * the dependent SCSI targets and devices are gone before returning. >> + */ >> + wait_event(shost->targets_wq, atomic_read(&shost->target_count) == 0); >> } > > If we only wait here we can still hit the race I described right? > Sorry Bart. Ignore this mail. I missed patch 1/4. I see we do the wait in __scsi_remove_target.