public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* Problems with sr_get_events
@ 2012-04-08 13:24 Alan Stern
  2012-04-16 22:55 ` Tejun Heo
  0 siblings, 1 reply; 5+ messages in thread
From: Alan Stern @ 2012-04-08 13:24 UTC (permalink / raw)
  To: Tejun Heo; +Cc: SCSI development list

Tejun:

There are several closely related issues involving sr_get_events().

The first may just be confusion on my part.  You've got a 
cd->ignore_get_event flag, whose name seems to mean that the result 
from sr_get_events() should be ignored.  But the result isn't ignored 
entirely; only the DISK_EVENT_MEDIA_CHANGE bit is cleared.

Furthermore, if you really do intend to ignore the result from 
sr_get_events() then why call it in the first place?  Or does the flag 
actually mean that you want to ignore the media-change bit from 
get_events while still using the other bits?

Finally, the GET_EVENT_STATUS_NOTIFICATION command is not present in 
all versions of SCSI, and not all drives support it.  sr_get_events() 
should check for an ILLEGAL_REQUEST sense key and stop sending the 
command if it is found.  Maybe a new flag will be needed for this.

Alan Stern


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Problems with sr_get_events
  2012-04-08 13:24 Problems with sr_get_events Alan Stern
@ 2012-04-16 22:55 ` Tejun Heo
  2012-04-17 15:33   ` Alan Stern
  0 siblings, 1 reply; 5+ messages in thread
From: Tejun Heo @ 2012-04-16 22:55 UTC (permalink / raw)
  To: Alan Stern; +Cc: SCSI development list

Hello, Alan.  Sorry about the delay.

On Sun, Apr 08, 2012 at 09:24:32AM -0400, Alan Stern wrote:
> There are several closely related issues involving sr_get_events().
> 
> The first may just be confusion on my part.  You've got a 
> cd->ignore_get_event flag, whose name seems to mean that the result 
> from sr_get_events() should be ignored.  But the result isn't ignored 
> entirely; only the DISK_EVENT_MEDIA_CHANGE bit is cleared.
>
> Furthermore, if you really do intend to ignore the result from 
> sr_get_events() then why call it in the first place?  Or does the flag 
> actually mean that you want to ignore the media-change bit from 
> get_events while still using the other bits?

The only thing which caused actual problem was media changed
detection.  This being a workaround for badly broken hardware, I think
it would be better to keep the behavior minmially deviated from the
normal path.  Let's say it's abbreviation of
->ignore_media_changed_from_get_event.

> Finally, the GET_EVENT_STATUS_NOTIFICATION command is not present in 
> all versions of SCSI, and not all drives support it.  sr_get_events() 
> should check for an ILLEGAL_REQUEST sense key and stop sending the 
> command if it is found.  Maybe a new flag will be needed for this.

Hmmm... Maybe but we've been sending GET_EVENT without such provision
for very long time now.  I feel reluctant to change something which
seems to work in this area even if that something is technically
wrong.  It's not like cheap USB devices tend to be technically correct
anyway.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Problems with sr_get_events
  2012-04-16 22:55 ` Tejun Heo
@ 2012-04-17 15:33   ` Alan Stern
  2012-04-17 15:38     ` Tejun Heo
  0 siblings, 1 reply; 5+ messages in thread
From: Alan Stern @ 2012-04-17 15:33 UTC (permalink / raw)
  To: Tejun Heo; +Cc: SCSI development list

On Mon, 16 Apr 2012, Tejun Heo wrote:

> Hello, Alan.  Sorry about the delay.
> 
> On Sun, Apr 08, 2012 at 09:24:32AM -0400, Alan Stern wrote:
> > There are several closely related issues involving sr_get_events().
> > 
> > The first may just be confusion on my part.  You've got a 
> > cd->ignore_get_event flag, whose name seems to mean that the result 
> > from sr_get_events() should be ignored.  But the result isn't ignored 
> > entirely; only the DISK_EVENT_MEDIA_CHANGE bit is cleared.
> >
> > Furthermore, if you really do intend to ignore the result from 
> > sr_get_events() then why call it in the first place?  Or does the flag 
> > actually mean that you want to ignore the media-change bit from 
> > get_events while still using the other bits?
> 
> The only thing which caused actual problem was media changed
> detection.  This being a workaround for badly broken hardware, I think
> it would be better to keep the behavior minmially deviated from the
> normal path.  Let's say it's abbreviation of
> ->ignore_media_changed_from_get_event.
> 
> > Finally, the GET_EVENT_STATUS_NOTIFICATION command is not present in 
> > all versions of SCSI, and not all drives support it.  sr_get_events() 
> > should check for an ILLEGAL_REQUEST sense key and stop sending the 
> > command if it is found.  Maybe a new flag will be needed for this.
> 
> Hmmm... Maybe but we've been sending GET_EVENT without such provision
> for very long time now.  I feel reluctant to change something which
> seems to work in this area even if that something is technically
> wrong.  It's not like cheap USB devices tend to be technically correct
> anyway.

All right, then how do you feel about this patch?  It makes minimal
changes, to avoid the inefficiency of sending repeated commands that
can never work.

Alan Stern



Index: usb-3.4/drivers/scsi/sr.h
===================================================================
--- usb-3.4.orig/drivers/scsi/sr.h
+++ usb-3.4/drivers/scsi/sr.h
@@ -46,7 +46,8 @@ typedef struct scsi_cd {
 	int tur_mismatch;		/* nr of get_event TUR mismatches */
 	bool tur_changed:1;		/* changed according to TUR */
 	bool get_event_changed:1;	/* changed according to GET_EVENT */
-	bool ignore_get_event:1;	/* GET_EVENT is unreliable, use TUR */
+	bool ignore_get_event:1;	/* MEDIA_CHANGE is unreliable, use TUR */
+	bool skip_get_event:1;		/* GET_EVENT is unavailable, use TUR */
 
 	struct cdrom_device_info cdi;
 	/* We hold gendisk and scsi_device references on probe and use
Index: usb-3.4/drivers/scsi/sr.c
===================================================================
--- usb-3.4.orig/drivers/scsi/sr.c
+++ usb-3.4/drivers/scsi/sr.c
@@ -166,7 +166,7 @@ static void scsi_cd_put(struct scsi_cd *
 	mutex_unlock(&sr_ref_mutex);
 }
 
-static unsigned int sr_get_events(struct scsi_device *sdev)
+static unsigned int sr_get_events(struct scsi_cd *cd)
 {
 	u8 buf[8];
 	u8 cmd[] = { GET_EVENT_STATUS_NOTIFICATION,
@@ -182,10 +182,17 @@ static unsigned int sr_get_events(struct
 	struct scsi_sense_hdr sshdr;
 	int result;
 
-	result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, sizeof(buf),
+	result = scsi_execute_req(cd->device, cmd, DMA_FROM_DEVICE,
+				  buf, sizeof(buf),
 				  &sshdr, SR_TIMEOUT, MAX_RETRIES, NULL);
-	if (scsi_sense_valid(&sshdr) && sshdr.sense_key == UNIT_ATTENTION)
-		return DISK_EVENT_MEDIA_CHANGE;
+	if (scsi_sense_valid(&sshdr)) {
+		if (sshdr.sense_key == UNIT_ATTENTION)
+			return DISK_EVENT_MEDIA_CHANGE;
+		if (sshdr.sense_key == ILLEGAL_REQUEST) {
+			cd->skip_get_event = 1;
+			return 0;
+		}
+	}
 
 	if (result || be16_to_cpu(eh->data_len) < sizeof(*med))
 		return 0;
@@ -213,14 +220,16 @@ static unsigned int sr_check_events(stru
 	struct scsi_cd *cd = cdi->handle;
 	bool last_present;
 	struct scsi_sense_hdr sshdr;
-	unsigned int events;
+	unsigned int events = 0;
 	int ret;
 
 	/* no changer support */
 	if (CDSL_CURRENT != slot)
 		return 0;
 
-	events = sr_get_events(cd->device);
+	if (cd->skip_get_event)
+		goto do_tur;
+	events = sr_get_events(cd);
 	cd->get_event_changed |= events & DISK_EVENT_MEDIA_CHANGE;
 
 	/*


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Problems with sr_get_events
  2012-04-17 15:33   ` Alan Stern
@ 2012-04-17 15:38     ` Tejun Heo
  2012-04-17 15:46       ` Alan Stern
  0 siblings, 1 reply; 5+ messages in thread
From: Tejun Heo @ 2012-04-17 15:38 UTC (permalink / raw)
  To: Alan Stern; +Cc: SCSI development list

On Tue, Apr 17, 2012 at 11:33:27AM -0400, Alan Stern wrote:
> > Hmmm... Maybe but we've been sending GET_EVENT without such provision
> > for very long time now.  I feel reluctant to change something which
> > seems to work in this area even if that something is technically
> > wrong.  It's not like cheap USB devices tend to be technically correct
> > anyway.
> 
> All right, then how do you feel about this patch?  It makes minimal
> changes, to avoid the inefficiency of sending repeated commands that
> can never work.

Hmmm... while I don't object to the patch per-se, I'm not sure what
benefit it brings.  Do you have any specific case where this is
necessary / beneficial?  What are we gaining by not issuing GET_EVENT?

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Problems with sr_get_events
  2012-04-17 15:38     ` Tejun Heo
@ 2012-04-17 15:46       ` Alan Stern
  0 siblings, 0 replies; 5+ messages in thread
From: Alan Stern @ 2012-04-17 15:46 UTC (permalink / raw)
  To: Tejun Heo; +Cc: SCSI development list

On Tue, 17 Apr 2012, Tejun Heo wrote:

> On Tue, Apr 17, 2012 at 11:33:27AM -0400, Alan Stern wrote:
> > > Hmmm... Maybe but we've been sending GET_EVENT without such provision
> > > for very long time now.  I feel reluctant to change something which
> > > seems to work in this area even if that something is technically
> > > wrong.  It's not like cheap USB devices tend to be technically correct
> > > anyway.
> > 
> > All right, then how do you feel about this patch?  It makes minimal
> > changes, to avoid the inefficiency of sending repeated commands that
> > can never work.
> 
> Hmmm... while I don't object to the patch per-se, I'm not sure what
> benefit it brings.  Do you have any specific case where this is
> necessary / beneficial?  What are we gaining by not issuing GET_EVENT?

We save a little bit of time.  It's not necessary; it's just a small 
optimization.

Alan Stern


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-04-17 15:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-04-08 13:24 Problems with sr_get_events Alan Stern
2012-04-16 22:55 ` Tejun Heo
2012-04-17 15:33   ` Alan Stern
2012-04-17 15:38     ` Tejun Heo
2012-04-17 15:46       ` Alan Stern

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox