diff options
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index a69b155f39a2..18343a6acd8e 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -749,8 +749,11 @@ static int sd_media_changed(struct gendisk *disk) | |||
749 | * can deal with it then. It is only because of unrecoverable errors | 749 | * can deal with it then. It is only because of unrecoverable errors |
750 | * that we would ever take a device offline in the first place. | 750 | * that we would ever take a device offline in the first place. |
751 | */ | 751 | */ |
752 | if (!scsi_device_online(sdp)) | 752 | if (!scsi_device_online(sdp)) { |
753 | goto not_present; | 753 | set_media_not_present(sdkp); |
754 | retval = 1; | ||
755 | goto out; | ||
756 | } | ||
754 | 757 | ||
755 | /* | 758 | /* |
756 | * Using TEST_UNIT_READY enables differentiation between drive with | 759 | * Using TEST_UNIT_READY enables differentiation between drive with |
@@ -762,6 +765,7 @@ static int sd_media_changed(struct gendisk *disk) | |||
762 | * sd_revalidate() is called. | 765 | * sd_revalidate() is called. |
763 | */ | 766 | */ |
764 | retval = -ENODEV; | 767 | retval = -ENODEV; |
768 | |||
765 | if (scsi_block_when_processing_errors(sdp)) | 769 | if (scsi_block_when_processing_errors(sdp)) |
766 | retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES); | 770 | retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES); |
767 | 771 | ||
@@ -771,8 +775,11 @@ static int sd_media_changed(struct gendisk *disk) | |||
771 | * and we will figure it out later once the drive is | 775 | * and we will figure it out later once the drive is |
772 | * available again. | 776 | * available again. |
773 | */ | 777 | */ |
774 | if (retval) | 778 | if (retval) { |
775 | goto not_present; | 779 | set_media_not_present(sdkp); |
780 | retval = 1; | ||
781 | goto out; | ||
782 | } | ||
776 | 783 | ||
777 | /* | 784 | /* |
778 | * For removable scsi disk we have to recognise the presence | 785 | * For removable scsi disk we have to recognise the presence |
@@ -783,12 +790,11 @@ static int sd_media_changed(struct gendisk *disk) | |||
783 | 790 | ||
784 | retval = sdp->changed; | 791 | retval = sdp->changed; |
785 | sdp->changed = 0; | 792 | sdp->changed = 0; |
786 | 793 | out: | |
794 | if (retval != sdkp->previous_state) | ||
795 | sdev_evt_send_simple(sdp, SDEV_EVT_MEDIA_CHANGE, GFP_KERNEL); | ||
796 | sdkp->previous_state = retval; | ||
787 | return retval; | 797 | return retval; |
788 | |||
789 | not_present: | ||
790 | set_media_not_present(sdkp); | ||
791 | return 1; | ||
792 | } | 798 | } |
793 | 799 | ||
794 | static int sd_sync_cache(struct scsi_disk *sdkp) | 800 | static int sd_sync_cache(struct scsi_disk *sdkp) |