Device init call Device reset call: do_scsi_scan_host() scsi_evt_thread() scsi_scan_host_selected() scsi_evt_emit() <- add wait_event() scsi_scan_channel() scsi_probe_and_add_lun() scsi_target_add() device_add() // add kobj.parent kobject_uevent_env() kobject_get_path() fill_kobj_path() //call wake_up() after scsi_scan_host_selected is done kobject_uevent_env() kobject_get_path() // get valid kobj.parent ... fill_kobj_path() > kobject_get_path() // get valid kobj.parent > fill_kobj_path() > > After we add wake_up at do_scsi_scan_host() in device init thread, we can > ensure that device reset thread will get kobject after device init thread > finishes adding parent. > > Signed-off-by: Alice Chao <alice.chao@xxxxxxxxxxxx> > > --- > > Change since v2 > -Change commit: Describes the preblem first and then the solution. > -Add commit: Add KASAN error log. Please keep all change history. e.g., See https://lore.kernel.org/lkml/20220326022728.2969-1-jianjun.wang@xxxxxxxxxxxx/ as an example Thanks, Miles > > --- > drivers/scsi/scsi_lib.c | 1 + > drivers/scsi/scsi_scan.c | 1 + > 2 files changed, 2 insertions(+) > > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c > index 0a70aa763a96..abf9a71ed77c 100644 > --- a/drivers/scsi/scsi_lib.c > +++ b/drivers/scsi/scsi_lib.c > @@ -2461,6 +2461,7 @@ static void scsi_evt_emit(struct scsi_device *sdev, struct scsi_event *evt) > break; > case SDEV_EVT_POWER_ON_RESET_OCCURRED: > envp[idx++] = "SDEV_UA=POWER_ON_RESET_OCCURRED"; > + wait_event(sdev->host->host_wait, sdev->sdev_gendev.kobj.parent != NULL); > break; > default: > /* do nothing */ > diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c > index f4e6c68ac99e..431f229ac435 100644 > --- a/drivers/scsi/scsi_scan.c > +++ b/drivers/scsi/scsi_scan.c > @@ -1904,6 +1904,7 @@ static void do_scsi_scan_host(struct Scsi_Host *shost) > } else { > scsi_scan_host_selected(shost, SCAN_WILD_CARD, SCAN_WILD_CARD, > SCAN_WILD_CARD, 0); > + wake_up(&shost->host_wait); > } > } > > -- > 2.18.0 > >