> -----Original Message----- > From: linux-scsi-owner@xxxxxxxxxxxxxxx [mailto:linux-scsi- > owner@xxxxxxxxxxxxxxx] On Behalf Of Hannes Reinecke > Sent: Wednesday, October 04, 2017 3:29 AM > To: Martin K. Petersen <martin.petersen@xxxxxxxxxx> > Cc: Christoph Hellwig <hch@xxxxxx>; James Bottomley > <james.bottomley@xxxxxxxxxxxxxxxxxxxxx>; linux-scsi@xxxxxxxxxxxxxxx; > Hannes Reinecke <hare@xxxxxxx>; Hannes Reinecke <hare@xxxxxxxx> > Subject: [PATCH] scsi: fixup kernel warning during rmmod() > > EXTERNAL EMAIL > > > Calling rmmod() on a FC driver will results in warnings like > > WARNING: CPU: 60 PID: 14640 at fs/sysfs/group.c:237 > device_del+0x54/0x240() > sysfs group ffffffff81eff140 not found for kobject '3:0:0:3' > > The problem here is that during scsi_remove_target() we will iterate > over all devices, but fail to remove any of those as the call to > scsi_device_get() fails the check to module_is_live(). > Hence the devices will not be removed at this point, but all > intermediate structures like fc rport etc. will be. > Later on during scsi_forget_host() the devices are removed for > real, but the device parent is already removed and causes > this warning. > > Signed-off-by: Hannes Reinecke <hare@xxxxxxxx> Tested-by: Don Brace <don.brace@xxxxxxxxxxxxx> Using the smartpqi driver. Thanks for your effort. Thanks, Don Brace ESC - Smart Storage Microsemi Corporation > --- > drivers/scsi/scsi_sysfs.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c > index 1889761..995539f 100644 > --- a/drivers/scsi/scsi_sysfs.c > +++ b/drivers/scsi/scsi_sysfs.c > @@ -1336,13 +1336,19 @@ static void __scsi_remove_target(struct > scsi_target *starget) > spin_lock_irqsave(shost->host_lock, flags); > restart: > list_for_each_entry(sdev, &shost->__devices, siblings) { > + /* > + * We cannot call scsi_device_get() here, as > + * we might've been called from rmmod() causing > + * scsi_device_get() to fail the module_is_live() > + * check. > + */ > if (sdev->channel != starget->channel || > sdev->id != starget->id || > - scsi_device_get(sdev)) > + !get_device(&sdev->sdev_gendev)) > continue; > spin_unlock_irqrestore(shost->host_lock, flags); > scsi_remove_device(sdev); > - scsi_device_put(sdev); > + put_device(&sdev->sdev_gendev); > spin_lock_irqsave(shost->host_lock, flags); > goto restart; > } > -- > 1.8.5.6