/*
                 * TARGET PORT GROUP
                 */
-               buf[off++] = ((tg_pt_gp->tg_pt_gp_id >> 8) & 0xff);
-               buf[off++] = (tg_pt_gp->tg_pt_gp_id & 0xff);
+               put_unaligned_be16(tg_pt_gp->tg_pt_gp_id, &buf[off]);
+               off += 2;
 
                off++; /* Skip over Reserved */
                /*
                        /*
                         * Set RELATIVE TARGET PORT IDENTIFIER
                         */
-                       buf[off++] = ((lun->lun_rtpi >> 8) & 0xff);
-                       buf[off++] = (lun->lun_rtpi & 0xff);
+                       put_unaligned_be16(lun->lun_rtpi, &buf[off]);
+                       off += 2;
                        rd_len += 4;
                }
                spin_unlock(&tg_pt_gp->tg_pt_gp_lock);
 
              TRANSPORT_FLAG_PASSTHROUGH_PGR)) {
                if (cdb[0] == PERSISTENT_RESERVE_IN) {
                        cmd->execute_cmd = target_scsi3_emulate_pr_in;
-                       size = (cdb[7] << 8) + cdb[8];
+                       size = get_unaligned_be16(&cdb[7]);
                        return target_cmd_size_check(cmd, size);
                }
                if (cdb[0] == PERSISTENT_RESERVE_OUT) {
                        cmd->execute_cmd = target_scsi3_emulate_pr_out;
-                       size = (cdb[7] << 8) + cdb[8];
+                       size = get_unaligned_be16(&cdb[7]);
                        return target_cmd_size_check(cmd, size);
                }
 
                if (cdb[0] == RELEASE || cdb[0] == RELEASE_10) {
                        cmd->execute_cmd = target_scsi2_reservation_release;
                        if (cdb[0] == RELEASE_10)
-                               size = (cdb[7] << 8) | cdb[8];
+                               size = get_unaligned_be16(&cdb[7]);
                        else
                                size = cmd->data_length;
                        return target_cmd_size_check(cmd, size);
                if (cdb[0] == RESERVE || cdb[0] == RESERVE_10) {
                        cmd->execute_cmd = target_scsi2_reservation_reserve;
                        if (cdb[0] == RESERVE_10)
-                               size = (cdb[7] << 8) | cdb[8];
+                               size = get_unaligned_be16(&cdb[7]);
                        else
                                size = cmd->data_length;
                        return target_cmd_size_check(cmd, size);
 
 #include <linux/ctype.h>
 #include <linux/spinlock.h>
 #include <linux/export.h>
+#include <asm/unaligned.h>
 
 #include <scsi/scsi_proto.h>
 
        if (padding != 0)
                len += padding;
 
-       buf[2] = ((len >> 8) & 0xff);
-       buf[3] = (len & 0xff);
+       put_unaligned_be16(len, &buf[2]);
        /*
         * Increment value for total payload + header length for
         * full status descriptor
         */
        if (out_tid_len) {
                /* The shift works thanks to integer promotion rules */
-               add_len = (buf[2] << 8) | buf[3];
+               add_len = get_unaligned_be16(&buf[2]);
 
                tid_len = strlen(&buf[4]);
                tid_len += 4; /* Add four bytes for iSCSI Transport ID header */
 
         * 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"
                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;
 
        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
  */
        /*
         * 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.
        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,
                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);
 
        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;
                /*
                 * 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;
                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
                 */
        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 */
        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) {
                /*
                 * 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 */
 
                /*
                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 */
 
                /*
                 * 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
        /*
         * 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);
 
 
        /*
         * If MODE_SENSE still returns zero, set the default value to 1024.
         */
-       sdev->sector_size = (buf[9] << 16) | (buf[10] << 8) | (buf[11]);
+       sdev->sector_size = get_unaligned_be24(&buf[9]);
 out_free:
        if (!sdev->sector_size)
                sdev->sector_size = 1024;
        cdb[0] = INQUIRY;
        cdb[1] = 0x01; /* Query VPD */
        cdb[2] = 0x80; /* Unit Serial Number */
-       cdb[3] = (INQUIRY_VPD_SERIAL_LEN >> 8) & 0xff;
-       cdb[4] = (INQUIRY_VPD_SERIAL_LEN & 0xff);
+       put_unaligned_be16(INQUIRY_VPD_SERIAL_LEN, &cdb[3]);
 
        ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
                              INQUIRY_VPD_SERIAL_LEN, NULL, HZ, 1, NULL);
        cdb[0] = INQUIRY;
        cdb[1] = 0x01; /* Query VPD */
        cdb[2] = 0x83; /* Device Identifier */
-       cdb[3] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN >> 8) & 0xff;
-       cdb[4] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN & 0xff);
+       put_unaligned_be16(INQUIRY_VPD_DEVICE_IDENTIFIER_LEN, &cdb[3]);
 
        ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
                              INQUIRY_VPD_DEVICE_IDENTIFIER_LEN,
        if (ret)
                goto out;
 
-       page_len = (buf[2] << 8) | buf[3];
+       page_len = get_unaligned_be16(&buf[2]);
        while (page_len > 0) {
                /* Grab a pointer to the Identification descriptor */
                page_83 = &buf[off];
                }
 
                if (cdb[0] == MODE_SELECT)
-                       bdl = (buf[3]);
+                       bdl = buf[3];
                else
-                       bdl = (buf[6] << 8) | (buf[7]);
+                       bdl = get_unaligned_be16(&buf[6]);
 
                if (!bdl)
                        goto after_mode_select;
 
                if (cdb[0] == MODE_SELECT)
-                       blocksize = (buf[9] << 16) | (buf[10] << 8) |
-                                       (buf[11]);
+                       blocksize = get_unaligned_be24(&buf[9]);
                else
-                       blocksize = (buf[13] << 16) | (buf[14] << 8) |
-                                       (buf[15]);
+                       blocksize = get_unaligned_be24(&buf[13]);
 
                sd->sector_size = blocksize;
        }
 
        else
                blocks = (u32)blocks_long;
 
-       buf[0] = (blocks >> 24) & 0xff;
-       buf[1] = (blocks >> 16) & 0xff;
-       buf[2] = (blocks >> 8) & 0xff;
-       buf[3] = blocks & 0xff;
-       buf[4] = (dev->dev_attrib.block_size >> 24) & 0xff;
-       buf[5] = (dev->dev_attrib.block_size >> 16) & 0xff;
-       buf[6] = (dev->dev_attrib.block_size >> 8) & 0xff;
-       buf[7] = dev->dev_attrib.block_size & 0xff;
+       put_unaligned_be32(blocks, &buf[0]);
+       put_unaligned_be32(dev->dev_attrib.block_size, &buf[4]);
 
        rbuf = transport_kmap_data_sg(cmd);
        if (rbuf) {
        unsigned long long blocks = dev->transport->get_blocks(dev);
 
        memset(buf, 0, sizeof(buf));
-       buf[0] = (blocks >> 56) & 0xff;
-       buf[1] = (blocks >> 48) & 0xff;
-       buf[2] = (blocks >> 40) & 0xff;
-       buf[3] = (blocks >> 32) & 0xff;
-       buf[4] = (blocks >> 24) & 0xff;
-       buf[5] = (blocks >> 16) & 0xff;
-       buf[6] = (blocks >> 8) & 0xff;
-       buf[7] = blocks & 0xff;
-       buf[8] = (dev->dev_attrib.block_size >> 24) & 0xff;
-       buf[9] = (dev->dev_attrib.block_size >> 16) & 0xff;
-       buf[10] = (dev->dev_attrib.block_size >> 8) & 0xff;
-       buf[11] = dev->dev_attrib.block_size & 0xff;
+       put_unaligned_be64(blocks, &buf[0]);
+       put_unaligned_be32(dev->dev_attrib.block_size, &buf[8]);
        /*
         * Set P_TYPE and PROT_EN bits for DIF support
         */
 
        if (dev->transport->get_alignment_offset_lbas) {
                u16 lalba = dev->transport->get_alignment_offset_lbas(dev);
-               buf[14] = (lalba >> 8) & 0x3f;
-               buf[15] = lalba & 0xff;
+
+               put_unaligned_be16(lalba, &buf[14]);
        }
 
        /*
 
 static inline u32 transport_get_sectors_10(unsigned char *cdb)
 {
-       return (u32)(cdb[7] << 8) + cdb[8];
+       return get_unaligned_be16(&cdb[7]);
 }
 
 static inline u32 transport_get_sectors_12(unsigned char *cdb)
 {
-       return (u32)(cdb[6] << 24) + (cdb[7] << 16) + (cdb[8] << 8) + cdb[9];
+       return get_unaligned_be32(&cdb[6]);
 }
 
 static inline u32 transport_get_sectors_16(unsigned char *cdb)
 {
-       return (u32)(cdb[10] << 24) + (cdb[11] << 16) +
-                   (cdb[12] << 8) + cdb[13];
+       return get_unaligned_be32(&cdb[10]);
 }
 
 /*
  */
 static inline u32 transport_get_sectors_32(unsigned char *cdb)
 {
-       return (u32)(cdb[28] << 24) + (cdb[29] << 16) +
-                   (cdb[30] << 8) + cdb[31];
+       return get_unaligned_be32(&cdb[28]);
 
 }
 
 static inline u32 transport_lba_21(unsigned char *cdb)
 {
-       return ((cdb[1] & 0x1f) << 16) | (cdb[2] << 8) | cdb[3];
+       return get_unaligned_be24(&cdb[1]) & 0x1fffff;
 }
 
 static inline u32 transport_lba_32(unsigned char *cdb)
 {
-       return (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
+       return get_unaligned_be32(&cdb[2]);
 }
 
 static inline unsigned long long transport_lba_64(unsigned char *cdb)
 {
-       unsigned int __v1, __v2;
-
-       __v1 = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
-       __v2 = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
-
-       return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
+       return get_unaligned_be64(&cdb[2]);
 }
 
 /*
  */
 static inline unsigned long long transport_lba_64_ext(unsigned char *cdb)
 {
-       unsigned int __v1, __v2;
-
-       __v1 = (cdb[12] << 24) | (cdb[13] << 16) | (cdb[14] << 8) | cdb[15];
-       __v2 = (cdb[16] << 24) | (cdb[17] << 16) | (cdb[18] << 8) | cdb[19];
-
-       return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
+       return get_unaligned_be64(&cdb[12]);
 }
 
 static sense_reason_t
                                cmd->t_task_cdb[1] & 0x1f);
                        return TCM_INVALID_CDB_FIELD;
                }
-               size = (cdb[10] << 24) | (cdb[11] << 16) |
-                      (cdb[12] << 8) | cdb[13];
+               size = get_unaligned_be32(&cdb[10]);
                break;
        case SYNCHRONIZE_CACHE:
        case SYNCHRONIZE_CACHE_16:
 
                /* Skip over Obsolete field in RTPI payload
                 * in Table 472 */
                off += 2;
-               buf[off++] = ((lun->lun_rtpi >> 8) & 0xff);
-               buf[off++] = (lun->lun_rtpi & 0xff);
+               put_unaligned_be16(lun->lun_rtpi, &buf[off]);
+               off += 2;
                len += 8; /* Header size + Designation descriptor */
                /*
                 * Target port group identifier, see spc4r17
                off++; /* Skip over Reserved */
                buf[off++] = 4; /* DESIGNATOR LENGTH */
                off += 2; /* Skip over Reserved Field */
-               buf[off++] = ((tg_pt_gp_id >> 8) & 0xff);
-               buf[off++] = (tg_pt_gp_id & 0xff);
+               put_unaligned_be16(tg_pt_gp_id, &buf[off]);
+               off += 2;
                len += 8; /* Header size + Designation descriptor */
                /*
                 * Logical Unit Group identifier, see spc4r17
                off++; /* Skip over Reserved */
                buf[off++] = 4; /* DESIGNATOR LENGTH */
                off += 2; /* Skip over Reserved Field */
-               buf[off++] = ((lu_gp_id >> 8) & 0xff);
-               buf[off++] = (lu_gp_id & 0xff);
+               put_unaligned_be16(lu_gp_id, &buf[off]);
+               off += 2;
                len += 8; /* Header size + Designation descriptor */
                /*
                 * SCSI name string designator, see spc4r17
                /* Header size + Designation descriptor */
                len += (scsi_target_len + 4);
        }
-       buf[2] = ((len >> 8) & 0xff);
-       buf[3] = (len & 0xff); /* Page Length for VPD 0x83 */
+       put_unaligned_be16(len, &buf[2]); /* Page Length for VPD 0x83 */
        return 0;
 }
 EXPORT_SYMBOL(spc_emulate_evpd_83);
                cmd->execute_cmd = spc_emulate_modeselect;
                break;
        case MODE_SELECT_10:
-               *size = (cdb[7] << 8) + cdb[8];
+               *size = get_unaligned_be16(&cdb[7]);
                cmd->execute_cmd = spc_emulate_modeselect;
                break;
        case MODE_SENSE:
                cmd->execute_cmd = spc_emulate_modesense;
                break;
        case MODE_SENSE_10:
-               *size = (cdb[7] << 8) + cdb[8];
+               *size = get_unaligned_be16(&cdb[7]);
                cmd->execute_cmd = spc_emulate_modesense;
                break;
        case LOG_SELECT:
        case LOG_SENSE:
-               *size = (cdb[7] << 8) + cdb[8];
+               *size = get_unaligned_be16(&cdb[7]);
                break;
        case PERSISTENT_RESERVE_IN:
-               *size = (cdb[7] << 8) + cdb[8];
+               *size = get_unaligned_be16(&cdb[7]);
                cmd->execute_cmd = target_scsi3_emulate_pr_in;
                break;
        case PERSISTENT_RESERVE_OUT:
-               *size = (cdb[7] << 8) + cdb[8];
+               *size = get_unaligned_be16(&cdb[7]);
                cmd->execute_cmd = target_scsi3_emulate_pr_out;
                break;
        case RELEASE:
        case RELEASE_10:
                if (cdb[0] == RELEASE_10)
-                       *size = (cdb[7] << 8) | cdb[8];
+                       *size = get_unaligned_be16(&cdb[7]);
                else
                        *size = cmd->data_length;
 
                 * Assume the passthrough or $FABRIC_MOD will tell us about it.
                 */
                if (cdb[0] == RESERVE_10)
-                       *size = (cdb[7] << 8) | cdb[8];
+                       *size = get_unaligned_be16(&cdb[7]);
                else
                        *size = cmd->data_length;
 
                cmd->execute_cmd = spc_emulate_request_sense;
                break;
        case INQUIRY:
-               *size = (cdb[3] << 8) + cdb[4];
+               *size = get_unaligned_be16(&cdb[3]);
 
                /*
                 * Do implicit HEAD_OF_QUEUE processing for INQUIRY.
                break;
        case SECURITY_PROTOCOL_IN:
        case SECURITY_PROTOCOL_OUT:
-               *size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
+               *size = get_unaligned_be32(&cdb[6]);
                break;
        case EXTENDED_COPY:
                *size = get_unaligned_be32(&cdb[10]);
                break;
        case READ_ATTRIBUTE:
        case WRITE_ATTRIBUTE:
-               *size = (cdb[10] << 24) | (cdb[11] << 16) |
-                      (cdb[12] << 8) | cdb[13];
+               *size = get_unaligned_be32(&cdb[10]);
                break;
        case RECEIVE_DIAGNOSTIC:
        case SEND_DIAGNOSTIC:
-               *size = (cdb[3] << 8) | cdb[4];
+               *size = get_unaligned_be16(&cdb[3]);
                break;
        case WRITE_BUFFER:
-               *size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
+               *size = get_unaligned_be24(&cdb[6]);
                break;
        case REPORT_LUNS:
                cmd->execute_cmd = spc_emulate_report_luns;
-               *size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
+               *size = get_unaligned_be32(&cdb[6]);
                /*
                 * Do implicit HEAD_OF_QUEUE processing for REPORT_LUNS
                 * See spc4r17 section 5.3
 
                (unsigned long long)xop->dst_lba);
 
        if (dc != 0) {
-               xop->dbl = (desc[29] & 0xff) << 16;
-               xop->dbl |= (desc[30] & 0xff) << 8;
-               xop->dbl |= desc[31] & 0xff;
+               xop->dbl = get_unaligned_be24(&desc[29]);
 
                pr_debug("XCOPY seg desc 0x02: DC=1 w/ dbl: %u\n", xop->dbl);
        }
 
 #define TARGET_CORE_BACKEND_H
 
 #include <linux/types.h>
+#include <asm/unaligned.h>
 #include <target/target_core_base.h>
 
 #define TRANSPORT_FLAG_PASSTHROUGH             0x1
 bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib,
                                       struct request_queue *q);
 
+
+/* Only use get_unaligned_be24() if reading p - 1 is allowed. */
+static inline uint32_t get_unaligned_be24(const uint8_t *const p)
+{
+       return get_unaligned_be32(p - 1) & 0xffffffU;
+}
+
 #endif /* TARGET_CORE_BACKEND_H */