• Linus Torvalds's avatar
    Revert "scsi: make 'state' device attribute pollable" · a817e73f
    Linus Torvalds authored
    This reverts commit 8a97712e.
    
    This commit added a call to sysfs_notify() from within
    scsi_device_set_state(), which in turn turns out to make libata very
    unhappy, because ata_eh_detach_dev() does
    
            spin_lock_irqsave(ap->lock, flags);
            ..
            if (ata_scsi_offline_dev(dev)) {
                    dev->flags |= ATA_DFLAG_DETACHED;
                    ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG;
            }
    
    and ata_scsi_offline_dev() then does that scsi_device_set_state() to set
    it offline.
    
    So now we called sysfs_notify() from within a spinlocked region, which
    really doesn't work.  The 0day robot reported this as:
    
       BUG: sleeping function called from invalid context at kernel/locking/mutex.c:238
    
    because sysfs_notify() ends up calling kernfs_find_and_get_ns() which
    then does mutex_lock(&kernfs_mutex)..
    
    The pollability of the device state isn't critical, so revert this all
    for now, and maybe we'll do it differently in the future.
    Reported-by: default avatarFengguang Wu <fengguang.wu@intel.com>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Acked-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a817e73f
scsi_lib.c 89.4 KB