Skip to content

Commit

Permalink
Revert "sd: implement sd_check_events()"
Browse files Browse the repository at this point in the history
This reverts commit c8d2e93.

We run into merging problems with the SCSI tree, revert this one
so it can be handled by a postmerge tree there.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
  • Loading branch information
Jens Axboe committed Dec 22, 2010
1 parent 30a7caa commit fcc5704
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 47 deletions.
87 changes: 40 additions & 47 deletions drivers/scsi/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -991,50 +991,30 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,

static void set_media_not_present(struct scsi_disk *sdkp)
{
if (sdkp->media_present)
sdkp->device->changed = 1;
sdkp->media_present = 0;
sdkp->capacity = 0;
}

static int media_not_present(struct scsi_disk *sdkp,
struct scsi_sense_hdr *sshdr)
{
if (!scsi_sense_valid(sshdr))
return 0;

/* not invoked for commands that could return deferred errors */
switch (sshdr->sense_key) {
case UNIT_ATTENTION:
sdkp->device->changed = 1;
/* fall through */
case NOT_READY:
/* medium not present */
if (sshdr->asc == 0x3A) {
set_media_not_present(sdkp);
return 1;
}
}
return 0;
sdkp->device->changed = 1;
}

/**
* sd_check_events - check media events
* @disk: kernel device descriptor
* @clearing: disk events currently being cleared
* sd_media_changed - check if our medium changed
* @disk: kernel device descriptor
*
* Returns mask of DISK_EVENT_*.
* Returns 0 if not applicable or no change; 1 if change
*
* Note: this function is invoked from the block subsystem.
**/
static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
static int sd_media_changed(struct gendisk *disk)
{
struct scsi_disk *sdkp = scsi_disk(disk);
struct scsi_device *sdp = sdkp->device;
struct scsi_sense_hdr *sshdr = NULL;
int retval;

SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n"));
SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_media_changed\n"));

if (!sdp->removable)
return 0;

/*
* If the device is offline, don't send any commands - just pretend as
Expand All @@ -1044,6 +1024,7 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
*/
if (!scsi_device_online(sdp)) {
set_media_not_present(sdkp);
retval = 1;
goto out;
}

Expand All @@ -1064,30 +1045,26 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
sshdr);
}

/* failed to execute TUR, assume media not present */
if (host_byte(retval)) {
if (retval) {
set_media_not_present(sdkp);
retval = 1;
goto out;
}

if (media_not_present(sdkp, sshdr))
goto out;

/*
* For removable scsi disk we have to recognise the presence
* of a disk in the drive.
* of a disk in the drive. This is kept in the struct scsi_disk
* struct and tested at open ! Daniel Roche (dan@lectra.fr)
*/
if (!sdkp->media_present)
sdp->changed = 1;
sdkp->media_present = 1;

retval = sdp->changed;
sdp->changed = 0;
out:
/* for backward compatibility */
if (sdp->changed)
if (retval != sdkp->previous_state)
sdev_evt_send_simple(sdp, SDEV_EVT_MEDIA_CHANGE, GFP_KERNEL);
sdkp->previous_state = retval;
kfree(sshdr);

retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0;
sdp->changed = 0;
return retval;
}

Expand Down Expand Up @@ -1180,7 +1157,7 @@ static const struct block_device_operations sd_fops = {
#ifdef CONFIG_COMPAT
.compat_ioctl = sd_compat_ioctl,
#endif
.check_events = sd_check_events,
.media_changed = sd_media_changed,
.revalidate_disk = sd_revalidate_disk,
.unlock_native_capacity = sd_unlock_native_capacity,
};
Expand Down Expand Up @@ -1316,6 +1293,23 @@ static int sd_done(struct scsi_cmnd *SCpnt)
return good_bytes;
}

static int media_not_present(struct scsi_disk *sdkp,
struct scsi_sense_hdr *sshdr)
{

if (!scsi_sense_valid(sshdr))
return 0;
/* not invoked for commands that could return deferred errors */
if (sshdr->sense_key != NOT_READY &&
sshdr->sense_key != UNIT_ATTENTION)
return 0;
if (sshdr->asc != 0x3A) /* medium not present */
return 0;

set_media_not_present(sdkp);
return 1;
}

/*
* spinup disk - called only in sd_revalidate_disk()
*/
Expand Down Expand Up @@ -1490,7 +1484,7 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
*/
if (sdp->removable &&
sense_valid && sshdr->sense_key == NOT_READY)
set_media_not_present(sdkp);
sdp->changed = 1;

/*
* We used to set media_present to 0 here to indicate no media
Expand Down Expand Up @@ -2345,10 +2339,8 @@ static void sd_probe_async(void *data, async_cookie_t cookie)

gd->driverfs_dev = &sdp->sdev_gendev;
gd->flags = GENHD_FL_EXT_DEVT;
if (sdp->removable) {
if (sdp->removable)
gd->flags |= GENHD_FL_REMOVABLE;
gd->events |= DISK_EVENT_MEDIA_CHANGE;
}

add_disk(gd);
sd_dif_config_host(sdkp);
Expand Down Expand Up @@ -2430,6 +2422,7 @@ static int sd_probe(struct device *dev)
sdkp->disk = gd;
sdkp->index = index;
atomic_set(&sdkp->openers, 0);
sdkp->previous_state = 1;

if (!sdp->request_queue->rq_timeout) {
if (sdp->type != TYPE_MOD)
Expand Down
1 change: 1 addition & 0 deletions drivers/scsi/sd.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ struct scsi_disk {
u8 media_present;
u8 write_prot;
u8 protection_type;/* Data Integrity Field */
unsigned previous_state : 1;
unsigned ATO : 1; /* state of disk ATO bit */
unsigned WCE : 1; /* state of disk WCE bit */
unsigned RCD : 1; /* state of disk RCD bit, unused */
Expand Down

0 comments on commit fcc5704

Please sign in to comment.