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];
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to