Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Jun 2014 09:42:00 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r267906 - in head/sys/cam: ctl scsi
Message-ID:  <201406260942.s5Q9g0O3088364@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Jun 26 09:42:00 2014
New Revision: 267906
URL: http://svnweb.freebsd.org/changeset/base/267906

Log:
  Allow MODE SENSE commands through Write Exclusive persistent reservation,
  as required by SPC-4.
  
  Report that fact in persistent reservation capabilities.
  
  MFC after:	2 weeks

Modified:
  head/sys/cam/ctl/ctl.c
  head/sys/cam/ctl/ctl_cmd_table.c
  head/sys/cam/scsi/scsi_all.h

Modified: head/sys/cam/ctl/ctl.c
==============================================================================
--- head/sys/cam/ctl/ctl.c	Thu Jun 26 08:56:36 2014	(r267905)
+++ head/sys/cam/ctl/ctl.c	Thu Jun 26 09:42:00 2014	(r267906)
@@ -6672,6 +6672,24 @@ ctl_mode_sense(struct ctl_scsiio *ctsio)
 	else
 		control_dev = 0;
 
+	if (lun->flags & CTL_LUN_PR_RESERVED) {
+		uint32_t residx;
+
+		/*
+		 * XXX KDM need a lock here.
+		 */
+		residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
+		if ((lun->res_type == SPR_TYPE_EX_AC
+		  && residx != lun->pr_res_idx)
+		 || ((lun->res_type == SPR_TYPE_EX_AC_RO
+		   || lun->res_type == SPR_TYPE_EX_AC_AR)
+		  && !lun->per_res[residx].registered)) {
+			ctl_set_reservation_conflict(ctsio);
+			ctl_done((union ctl_io *)ctsio);
+			return (CTL_RETVAL_COMPLETE);
+		}
+	}
+
 	switch (ctsio->cdb[0]) {
 	case MODE_SENSE_6: {
 		struct scsi_mode_sense_6 *cdb;
@@ -7465,7 +7483,7 @@ retry:
 
 		res_cap = (struct scsi_per_res_cap *)ctsio->kern_data_ptr;
 		scsi_ulto2b(sizeof(*res_cap), res_cap->length);
-		res_cap->flags2 |= SPRI_TMV;
+		res_cap->flags2 |= SPRI_TMV | SPRI_ALLOW_3;
 		type_mask = SPRI_TM_WR_EX_AR |
 			    SPRI_TM_EX_AC_RO |
 			    SPRI_TM_WR_EX_RO |

Modified: head/sys/cam/ctl/ctl_cmd_table.c
==============================================================================
--- head/sys/cam/ctl/ctl_cmd_table.c	Thu Jun 26 08:56:36 2014	(r267905)
+++ head/sys/cam/ctl/ctl_cmd_table.c	Thu Jun 26 09:42:00 2014	(r267906)
@@ -192,7 +192,8 @@ struct ctl_cmd_entry ctl_cmd_table[] =
 				    CTL_CMD_FLAG_OK_ON_STOPPED |
 				    CTL_CMD_FLAG_OK_ON_INOPERABLE |
 				    CTL_CMD_FLAG_OK_ON_SECONDARY |
-				    CTL_FLAG_DATA_IN,
+				    CTL_FLAG_DATA_IN |
+				    CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
  CTL_LUN_PAT_NONE},
 
 /* 1B START STOP UNIT */
@@ -436,7 +437,8 @@ struct ctl_cmd_entry ctl_cmd_table[] =
 				    CTL_CMD_FLAG_OK_ON_STOPPED |
 				    CTL_CMD_FLAG_OK_ON_INOPERABLE |
 				    CTL_CMD_FLAG_OK_ON_SECONDARY |
-				    CTL_FLAG_DATA_IN,
+				    CTL_FLAG_DATA_IN |
+				    CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
  CTL_LUN_PAT_NONE},
 
 /* 5B CLOSE TRACK/SESSION */

Modified: head/sys/cam/scsi/scsi_all.h
==============================================================================
--- head/sys/cam/scsi/scsi_all.h	Thu Jun 26 08:56:36 2014	(r267905)
+++ head/sys/cam/scsi/scsi_all.h	Thu Jun 26 09:42:00 2014	(r267906)
@@ -308,6 +308,11 @@ struct scsi_per_res_cap
 #define	SPRI_PTPL_C	0x01
 	uint8_t flags2;
 #define	SPRI_TMV	0x80
+#define	SPRI_ALLOW_MASK	0x70
+#define	SPRI_ALLOW_0	0x00
+#define	SPRI_ALLOW_1	0x10
+#define	SPRI_ALLOW_2	0x20
+#define	SPRI_ALLOW_3	0x30
 #define	SPRI_PTPL_A	0x01
 	uint8_t type_mask[2];
 #define	SPRI_TM_WR_EX_AR	0x8000
@@ -746,12 +751,16 @@ struct scsi_read_buffer
 {
 	u_int8_t opcode;
 	u_int8_t byte2;
-#define	RWB_MODE		0x07
+#define	RWB_MODE		0x1F
 #define	RWB_MODE_HDR_DATA	0x00
 #define	RWB_MODE_VENDOR		0x01
 #define	RWB_MODE_DATA		0x02
+#define	RWB_MODE_DESCR		0x03
 #define	RWB_MODE_DOWNLOAD	0x04
 #define	RWB_MODE_DOWNLOAD_SAVE	0x05
+#define	RWB_MODE_ECHO		0x0A
+#define	RWB_MODE_ECHO_DESCR	0x0B
+#define	RWB_MODE_ERROR_HISTORY	0x1C
         u_int8_t buffer_id;
         u_int8_t offset[3];
         u_int8_t length[3];



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406260942.s5Q9g0O3088364>