• Matthew Wilcox's avatar
    [SCSI] Fix async scanning double-add problems · 6b7f123f
    Matthew Wilcox authored
    Stress-testing and some thought has revealed some places where
    asynchronous scanning needs some more attention to locking.
    
     - Since async_scan is a bit, we need to hold the host_lock while
       modifying it to prevent races against other CPUs modifying the word
       that bit is in.  This is probably a theoretical race for the moment,
       but other patches may change that.
     - The async_scan bit means not only that this host is being scanned
       asynchronously, but that all the devices attached to this host are not
       yet added to sysfs.  So we must ensure that this bit is always in sync.
       I've chosen to do this with the scan_mutex since it's already acquired
       in most of the right places.
     - If the host changes state to deleted while we're in the middle of
       a scan, we'll end up with some devices on the host's list which must
       be deleted.  Add a check to scsi_sysfs_add_devices() to ensure the
       host is still running.
     - To avoid the async_scan bit being protected by three locks, the
       async_scan_lock now only protects the scanning_list.
    Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
    6b7f123f
scsi_scan.c 52.6 KB