mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-17 10:26:15 +00:00
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
This commit is contained in:
parent
85165a3f70
commit
f82388fd84
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=267906
@ -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 @@ ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
|
||||
|
||||
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 |
|
||||
|
@ -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 */
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user