diff mbox

[RESEND,1/1] ses: Retry UNIT ATTENTION for receive diagnostics

Message ID 20160916210607.054BF124047@b01ledav002.gho.pok.ibm.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Brian King Sept. 16, 2016, 9:06 p.m. UTC
If the ses driver receives a UNIT ATTENTION when issuing
a receive diagnostics while probing a SES device, it
fails to attach with messages such as:

scsi 1:0:7:0: Failed to get diagnostic page 0x8000002
scsi 1:0:7:0: Failed to bind enclosure -19

Fix this by eating unit attentions for these commands.

Cc: <stable@vger.kernel.org>
Suggested-by: Wen Xiong <wenxiong@linux.vnet.ibm.com>
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
---

 drivers/scsi/ses.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

Comments

Gabriel Krisman Bertazi Sept. 16, 2016, 9:25 p.m. UTC | #1
Brian King <brking@linux.vnet.ibm.com> writes:

> If the ses driver receives a UNIT ATTENTION when issuing
> a receive diagnostics while probing a SES device, it
> fails to attach with messages such as:
>
> scsi 1:0:7:0: Failed to get diagnostic page 0x8000002
> scsi 1:0:7:0: Failed to bind enclosure -19
>
> Fix this by eating unit attentions for these commands.


Reviewed-by: Gabriel Krisman Bertazi <krisman@linux.vnet.ibm.com>
Martin K. Petersen Sept. 19, 2016, 3:57 p.m. UTC | #2
>>>>> "Brian" == Brian King <brking@linux.vnet.ibm.com> writes:

Brian> If the ses driver receives a UNIT ATTENTION when issuing a
Brian> receive diagnostics while probing a SES device, it fails to
Brian> attach with messages such as:

Brian> scsi 1:0:7:0: Failed to get diagnostic page 0x8000002 scsi
Brian> 1:0:7:0: Failed to bind enclosure -19

Brian> Fix this by eating unit attentions for these commands.

James?
James Bottomley Sept. 19, 2016, 4:20 p.m. UTC | #3
On Mon, 2016-09-19 at 11:57 -0400, Martin K. Petersen wrote:
> > > > > > "Brian" == Brian King <brking@linux.vnet.ibm.com> writes:
> 
> Brian> If the ses driver receives a UNIT ATTENTION when issuing a
> Brian> receive diagnostics while probing a SES device, it fails to
> Brian> attach with messages such as:
> 
> Brian> scsi 1:0:7:0: Failed to get diagnostic page 0x8000002 scsi
> Brian> 1:0:7:0: Failed to bind enclosure -19
> 
> Brian> Fix this by eating unit attentions for these commands.
> 
> James?

It seems to me that UA handling should be a part of scsi_execute_req
(and scsi_execute) ... that is unless anyone can find a caller that
would actually be interested.  I've been looking but haven't found one
so far.

James

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ewan Milne Sept. 19, 2016, 5:14 p.m. UTC | #4
On Mon, 2016-09-19 at 09:20 -0700, James Bottomley wrote:
> On Mon, 2016-09-19 at 11:57 -0400, Martin K. Petersen wrote:
> > > > > > > "Brian" == Brian King <brking@linux.vnet.ibm.com> writes:
> > 
> > Brian> If the ses driver receives a UNIT ATTENTION when issuing a
> > Brian> receive diagnostics while probing a SES device, it fails to
> > Brian> attach with messages such as:
> > 
> > Brian> scsi 1:0:7:0: Failed to get diagnostic page 0x8000002 scsi
> > Brian> 1:0:7:0: Failed to bind enclosure -19
> > 
> > Brian> Fix this by eating unit attentions for these commands.
> > 
> > James?
> 
> It seems to me that UA handling should be a part of scsi_execute_req
> (and scsi_execute) ... that is unless anyone can find a caller that
> would actually be interested.  I've been looking but haven't found one
> so far.
> 
> James

Since UNIT ATTENTION is usually reporting a condition unrelated to
the command that was sent (I'm not sure 29 00 qualifies as unrelated
since it indicates loss of device state), we probably shouldn't
require every caller to retry on it.  Could we handle this internally,
(maybe unless it persists for N attempts), before returning?

We should still be going through the scsi_check_sense() path and
the device handlers need to see the sense.

(removed cc: stable from reply)

-Ewan


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff -puN drivers/scsi/ses.c~ses_rcv_diag_retry drivers/scsi/ses.c
--- linux-2.6.git/drivers/scsi/ses.c~ses_rcv_diag_retry	2016-08-25 18:28:18.720565322 -0500
+++ linux-2.6.git-bjking1/drivers/scsi/ses.c	2016-08-25 18:28:29.687496342 -0500
@@ -86,7 +86,7 @@  static void init_device_slot_control(uns
 static int ses_recv_diag(struct scsi_device *sdev, int page_code,
 			 void *buf, int bufflen)
 {
-	int ret;
+	int ret, retries = SES_RETRIES;
 	unsigned char cmd[] = {
 		RECEIVE_DIAGNOSTIC,
 		1,		/* Set PCV bit */
@@ -96,11 +96,14 @@  static int ses_recv_diag(struct scsi_dev
 		0
 	};
 	unsigned char recv_page_code;
+	struct scsi_sense_hdr sshdr;
 
-	ret =  scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
-				NULL, SES_TIMEOUT, SES_RETRIES, NULL);
-	if (unlikely(!ret))
-		return ret;
+	do {
+		memset(&sshdr, 0, sizeof(sshdr));
+		ret =  scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
+					&sshdr, SES_TIMEOUT, retries, NULL);
+	} while (scsi_sense_valid(&sshdr) &&
+		 sshdr.sense_key == UNIT_ATTENTION && --retries);
 
 	recv_page_code = ((unsigned char *)buf)[0];