@ -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 ) ;