diff options
author | James Bottomley <James.Bottomley@suse.de> | 2009-11-19 17:48:29 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-11-26 09:43:39 -0600 |
commit | 860dc73608a091e0b325218acc2701709d5f221a (patch) | |
tree | 2527b226e1991c459ac02de4a6ba5c98a4639add /include/scsi/scsi_device.h | |
parent | 3bf3583b6a49c318f7ed350862d7a217b500e71c (diff) | |
download | linux-stable-860dc73608a091e0b325218acc2701709d5f221a.tar.gz linux-stable-860dc73608a091e0b325218acc2701709d5f221a.tar.bz2 linux-stable-860dc73608a091e0b325218acc2701709d5f221a.zip |
[SCSI] fix async scan add/remove race resulting in an oops
Async scanning introduced a very wide window where the SCSI device is
up and running but has not yet been added to sysfs. We delay the
adding until all scans have completed to retain the same ordering as
sync scanning.
This delay in visibility causes an oops if a device is removed before
we make it visible because the SCSI removal routines have an inbuilt
assumption that if a device is in SDEV_RUNNING state, it must be
visible (which is not necessarily true in the async scanning case).
Fix this by introducing an additional is_visible flag which we can use
to condition the tear down so we do the right thing for running but
not yet made visible.
Reported-by: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'include/scsi/scsi_device.h')
-rw-r--r-- | include/scsi/scsi_device.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 9af48cbf0036..f097ae340bc1 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -145,6 +145,7 @@ struct scsi_device { unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ unsigned last_sector_bug:1; /* do not use multisector accesses on SD_LAST_BUGGY_SECTORS */ + unsigned is_visible:1; /* is the device visible in sysfs */ DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ struct list_head event_list; /* asserted events */ |