]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/target/target_core_pr.c
Merge tag 'kvm-4.13-2' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[karo-tx-linux.git] / drivers / target / target_core_pr.c
index 129ca572673ceaed2aa6f4ca55d10bfcd6b1620a..6d5def64db61d98be33effdacb9deaa55c2147a0 100644 (file)
@@ -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
  */
@@ -3602,7 +3585,7 @@ target_scsi3_emulate_pr_out(struct se_cmd *cmd)
        if (cmd->data_length < 24) {
                pr_warn("SPC-PR: Received PR OUT parameter list"
                        " length too small: %u\n", cmd->data_length);
-               return TCM_INVALID_PARAMETER_LIST;
+               return TCM_PARAMETER_LIST_LENGTH_ERROR;
        }
 
        /*
@@ -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.
@@ -3646,7 +3629,7 @@ target_scsi3_emulate_pr_out(struct se_cmd *cmd)
        /*
         * SPEC_I_PT=1 is only valid for Service action: REGISTER
         */
-       if (spec_i_pt && ((cdb[1] & 0x1f) != PRO_REGISTER))
+       if (spec_i_pt && (sa != PRO_REGISTER))
                return TCM_INVALID_PARAMETER_LIST;
 
        /*
@@ -3658,11 +3641,11 @@ target_scsi3_emulate_pr_out(struct se_cmd *cmd)
         * the sense key set to ILLEGAL REQUEST, and the additional sense
         * code set to PARAMETER LIST LENGTH ERROR.
         */
-       if (!spec_i_pt && ((cdb[1] & 0x1f) != PRO_REGISTER_AND_MOVE) &&
+       if (!spec_i_pt && (sa != PRO_REGISTER_AND_MOVE) &&
            (cmd->data_length != 24)) {
                pr_warn("SPC-PR: Received PR OUT illegal parameter"
                        " list length: %u\n", cmd->data_length);
-               return TCM_INVALID_PARAMETER_LIST;
+               return TCM_PARAMETER_LIST_LENGTH_ERROR;
        }
 
        /*
@@ -3702,7 +3685,7 @@ target_scsi3_emulate_pr_out(struct se_cmd *cmd)
                break;
        default:
                pr_err("Unknown PERSISTENT_RESERVE_OUT service"
-                       " action: 0x%02x\n", cdb[1] & 0x1f);
+                       " action: 0x%02x\n", sa);
                return TCM_INVALID_CDB_FIELD;
        }
 
@@ -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);