diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-08-22 17:53:31 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-10-03 12:46:13 -0400 |
commit | 6f4267e3bd1211b3d09130e626b0b3d885077610 (patch) | |
tree | e9350f919238866c3bcd9c340ffea639a0c5de1d /include/scsi | |
parent | 0f1d87a2acb8fd1f2ef8af109a785123ddc1a6cb (diff) |
[SCSI] Update the SCSI state model to allow blocking in the created state
Brian King <brking@linux.vnet.ibm.com> reported that fibre channel
devices can oops during scanning if their ports block (because the
device goes from CREATED -> BLOCK -> RUNNING rather than CREATED ->
BLOCK -> CREATED).
Fix this by adding a new state: CREATED_BLOCK which can only transition
back to CREATED and disallow the CREATED -> BLOCK transition. Now both
the created and blocked states that the mid-layer recognises can include
CREATED_BLOCK.
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/scsi_device.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index cc46652e4658..b49e725be039 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -42,9 +42,11 @@ enum scsi_device_state { | |||
42 | * originate in the mid-layer) */ | 42 | * originate in the mid-layer) */ |
43 | SDEV_OFFLINE, /* Device offlined (by error handling or | 43 | SDEV_OFFLINE, /* Device offlined (by error handling or |
44 | * user request */ | 44 | * user request */ |
45 | SDEV_BLOCK, /* Device blocked by scsi lld. No scsi | 45 | SDEV_BLOCK, /* Device blocked by scsi lld. No |
46 | * commands from user or midlayer should be issued | 46 | * scsi commands from user or midlayer |
47 | * to the scsi lld. */ | 47 | * should be issued to the scsi |
48 | * lld. */ | ||
49 | SDEV_CREATED_BLOCK, /* same as above but for created devices */ | ||
48 | }; | 50 | }; |
49 | 51 | ||
50 | enum scsi_device_event { | 52 | enum scsi_device_event { |
@@ -393,11 +395,13 @@ static inline int scsi_device_online(struct scsi_device *sdev) | |||
393 | } | 395 | } |
394 | static inline int scsi_device_blocked(struct scsi_device *sdev) | 396 | static inline int scsi_device_blocked(struct scsi_device *sdev) |
395 | { | 397 | { |
396 | return sdev->sdev_state == SDEV_BLOCK; | 398 | return sdev->sdev_state == SDEV_BLOCK || |
399 | sdev->sdev_state == SDEV_CREATED_BLOCK; | ||
397 | } | 400 | } |
398 | static inline int scsi_device_created(struct scsi_device *sdev) | 401 | static inline int scsi_device_created(struct scsi_device *sdev) |
399 | { | 402 | { |
400 | return sdev->sdev_state == SDEV_CREATED; | 403 | return sdev->sdev_state == SDEV_CREATED || |
404 | sdev->sdev_state == SDEV_CREATED_BLOCK; | ||
401 | } | 405 | } |
402 | 406 | ||
403 | /* accessor functions for the SCSI parameters */ | 407 | /* accessor functions for the SCSI parameters */ |