RE: [PATCH] scsi: fixup kernel warning during rmmod()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----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





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux