|
@@ -1562,10 +1562,7 @@ core_scsi3_decode_spec_i_port(
|
|
|
* first extract TransportID Parameter Data Length, and make sure
|
|
|
* the value matches up to the SCSI expected data transfer length.
|
|
|
*/
|
|
|
- tpdl = (buf[24] & 0xff) << 24;
|
|
|
- tpdl |= (buf[25] & 0xff) << 16;
|
|
|
- tpdl |= (buf[26] & 0xff) << 8;
|
|
|
- tpdl |= buf[27] & 0xff;
|
|
|
+ tpdl = get_unaligned_be32(&buf[24]);
|
|
|
|
|
|
if ((tpdl + 28) != cmd->data_length) {
|
|
|
pr_err("SPC-3 PR: Illegal tpdl: %u + 28 byte header"
|
|
@@ -3221,12 +3218,8 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
|
|
|
goto out_put_pr_reg;
|
|
|
}
|
|
|
|
|
|
- rtpi = (buf[18] & 0xff) << 8;
|
|
|
- rtpi |= buf[19] & 0xff;
|
|
|
- tid_len = (buf[20] & 0xff) << 24;
|
|
|
- tid_len |= (buf[21] & 0xff) << 16;
|
|
|
- tid_len |= (buf[22] & 0xff) << 8;
|
|
|
- tid_len |= buf[23] & 0xff;
|
|
|
+ rtpi = get_unaligned_be16(&buf[18]);
|
|
|
+ tid_len = get_unaligned_be32(&buf[20]);
|
|
|
transport_kunmap_data_sg(cmd);
|
|
|
buf = NULL;
|
|
|
|
|
@@ -3552,16 +3545,6 @@ out_put_pr_reg:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static unsigned long long core_scsi3_extract_reservation_key(unsigned char *cdb)
|
|
|
-{
|
|
|
- unsigned int __v1, __v2;
|
|
|
-
|
|
|
- __v1 = (cdb[0] << 24) | (cdb[1] << 16) | (cdb[2] << 8) | cdb[3];
|
|
|
- __v2 = (cdb[4] << 24) | (cdb[5] << 16) | (cdb[6] << 8) | cdb[7];
|
|
|
-
|
|
|
- return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* See spc4r17 section 6.14 Table 170
|
|
|
*/
|
|
@@ -3619,8 +3602,8 @@ target_scsi3_emulate_pr_out(struct se_cmd *cmd)
|
|
|
/*
|
|
|
* From PERSISTENT_RESERVE_OUT parameter list (payload)
|
|
|
*/
|
|
|
- res_key = core_scsi3_extract_reservation_key(&buf[0]);
|
|
|
- sa_res_key = core_scsi3_extract_reservation_key(&buf[8]);
|
|
|
+ res_key = get_unaligned_be64(&buf[0]);
|
|
|
+ sa_res_key = get_unaligned_be64(&buf[8]);
|
|
|
/*
|
|
|
* REGISTER_AND_MOVE uses a different SA parameter list containing
|
|
|
* SCSI TransportIDs.
|
|
@@ -3734,10 +3717,7 @@ core_scsi3_pri_read_keys(struct se_cmd *cmd)
|
|
|
if (!buf)
|
|
|
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
|
|
|
|
- buf[0] = ((dev->t10_pr.pr_generation >> 24) & 0xff);
|
|
|
- buf[1] = ((dev->t10_pr.pr_generation >> 16) & 0xff);
|
|
|
- buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
|
|
|
- buf[3] = (dev->t10_pr.pr_generation & 0xff);
|
|
|
+ put_unaligned_be32(dev->t10_pr.pr_generation, buf);
|
|
|
|
|
|
spin_lock(&dev->t10_pr.registration_lock);
|
|
|
list_for_each_entry(pr_reg, &dev->t10_pr.registration_list,
|
|
@@ -3749,23 +3729,13 @@ core_scsi3_pri_read_keys(struct se_cmd *cmd)
|
|
|
if ((add_len + 8) > (cmd->data_length - 8))
|
|
|
break;
|
|
|
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 56) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 48) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 40) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 32) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 24) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 16) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 8) & 0xff);
|
|
|
- buf[off++] = (pr_reg->pr_res_key & 0xff);
|
|
|
-
|
|
|
+ put_unaligned_be64(pr_reg->pr_res_key, &buf[off]);
|
|
|
+ off += 8;
|
|
|
add_len += 8;
|
|
|
}
|
|
|
spin_unlock(&dev->t10_pr.registration_lock);
|
|
|
|
|
|
- buf[4] = ((add_len >> 24) & 0xff);
|
|
|
- buf[5] = ((add_len >> 16) & 0xff);
|
|
|
- buf[6] = ((add_len >> 8) & 0xff);
|
|
|
- buf[7] = (add_len & 0xff);
|
|
|
+ put_unaligned_be32(add_len, &buf[4]);
|
|
|
|
|
|
transport_kunmap_data_sg(cmd);
|
|
|
|
|
@@ -3796,10 +3766,7 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd)
|
|
|
if (!buf)
|
|
|
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
|
|
|
|
- buf[0] = ((dev->t10_pr.pr_generation >> 24) & 0xff);
|
|
|
- buf[1] = ((dev->t10_pr.pr_generation >> 16) & 0xff);
|
|
|
- buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
|
|
|
- buf[3] = (dev->t10_pr.pr_generation & 0xff);
|
|
|
+ put_unaligned_be32(dev->t10_pr.pr_generation, &buf[0]);
|
|
|
|
|
|
spin_lock(&dev->dev_reservation_lock);
|
|
|
pr_reg = dev->dev_pr_res_holder;
|
|
@@ -3807,10 +3774,7 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd)
|
|
|
/*
|
|
|
* Set the hardcoded Additional Length
|
|
|
*/
|
|
|
- buf[4] = ((add_len >> 24) & 0xff);
|
|
|
- buf[5] = ((add_len >> 16) & 0xff);
|
|
|
- buf[6] = ((add_len >> 8) & 0xff);
|
|
|
- buf[7] = (add_len & 0xff);
|
|
|
+ put_unaligned_be32(add_len, &buf[4]);
|
|
|
|
|
|
if (cmd->data_length < 22)
|
|
|
goto err;
|
|
@@ -3837,14 +3801,7 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd)
|
|
|
else
|
|
|
pr_res_key = pr_reg->pr_res_key;
|
|
|
|
|
|
- buf[8] = ((pr_res_key >> 56) & 0xff);
|
|
|
- buf[9] = ((pr_res_key >> 48) & 0xff);
|
|
|
- buf[10] = ((pr_res_key >> 40) & 0xff);
|
|
|
- buf[11] = ((pr_res_key >> 32) & 0xff);
|
|
|
- buf[12] = ((pr_res_key >> 24) & 0xff);
|
|
|
- buf[13] = ((pr_res_key >> 16) & 0xff);
|
|
|
- buf[14] = ((pr_res_key >> 8) & 0xff);
|
|
|
- buf[15] = (pr_res_key & 0xff);
|
|
|
+ put_unaligned_be64(pr_res_key, &buf[8]);
|
|
|
/*
|
|
|
* Set the SCOPE and TYPE
|
|
|
*/
|
|
@@ -3882,8 +3839,7 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
|
|
|
if (!buf)
|
|
|
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
|
|
|
|
- buf[0] = ((add_len >> 8) & 0xff);
|
|
|
- buf[1] = (add_len & 0xff);
|
|
|
+ put_unaligned_be16(add_len, &buf[0]);
|
|
|
buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */
|
|
|
buf[2] |= 0x08; /* SIP_C: Specify Initiator Ports Capable bit */
|
|
|
buf[2] |= 0x04; /* ATP_C: All Target Ports Capable bit */
|
|
@@ -3947,10 +3903,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
|
|
if (!buf)
|
|
|
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
|
|
|
|
- buf[0] = ((dev->t10_pr.pr_generation >> 24) & 0xff);
|
|
|
- buf[1] = ((dev->t10_pr.pr_generation >> 16) & 0xff);
|
|
|
- buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
|
|
|
- buf[3] = (dev->t10_pr.pr_generation & 0xff);
|
|
|
+ put_unaligned_be32(dev->t10_pr.pr_generation, &buf[0]);
|
|
|
|
|
|
spin_lock(&dev->dev_reservation_lock);
|
|
|
if (dev->dev_pr_res_holder) {
|
|
@@ -3992,14 +3945,8 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
|
|
/*
|
|
|
* Set RESERVATION KEY
|
|
|
*/
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 56) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 48) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 40) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 32) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 24) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 16) & 0xff);
|
|
|
- buf[off++] = ((pr_reg->pr_res_key >> 8) & 0xff);
|
|
|
- buf[off++] = (pr_reg->pr_res_key & 0xff);
|
|
|
+ put_unaligned_be64(pr_reg->pr_res_key, &buf[off]);
|
|
|
+ off += 8;
|
|
|
off += 4; /* Skip Over Reserved area */
|
|
|
|
|
|
/*
|
|
@@ -4041,8 +3988,8 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
|
|
if (!pr_reg->pr_reg_all_tg_pt) {
|
|
|
u16 sep_rtpi = pr_reg->tg_pt_sep_rtpi;
|
|
|
|
|
|
- buf[off++] = ((sep_rtpi >> 8) & 0xff);
|
|
|
- buf[off++] = (sep_rtpi & 0xff);
|
|
|
+ put_unaligned_be16(sep_rtpi, &buf[off]);
|
|
|
+ off += 2;
|
|
|
} else
|
|
|
off += 2; /* Skip over RELATIVE TARGET PORT IDENTIFIER */
|
|
|
|
|
@@ -4062,10 +4009,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
|
|
/*
|
|
|
* Set the ADDITIONAL DESCRIPTOR LENGTH
|
|
|
*/
|
|
|
- buf[off++] = ((desc_len >> 24) & 0xff);
|
|
|
- buf[off++] = ((desc_len >> 16) & 0xff);
|
|
|
- buf[off++] = ((desc_len >> 8) & 0xff);
|
|
|
- buf[off++] = (desc_len & 0xff);
|
|
|
+ put_unaligned_be32(desc_len, &buf[off]);
|
|
|
/*
|
|
|
* Size of full desctipor header minus TransportID
|
|
|
* containing $FABRIC_MOD specific) initiator device/port
|
|
@@ -4082,10 +4026,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
|
|
/*
|
|
|
* Set ADDITIONAL_LENGTH
|
|
|
*/
|
|
|
- buf[4] = ((add_len >> 24) & 0xff);
|
|
|
- buf[5] = ((add_len >> 16) & 0xff);
|
|
|
- buf[6] = ((add_len >> 8) & 0xff);
|
|
|
- buf[7] = (add_len & 0xff);
|
|
|
+ put_unaligned_be32(add_len, &buf[4]);
|
|
|
|
|
|
transport_kunmap_data_sg(cmd);
|
|
|
|