@ -191,7 +191,7 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
pr_err ( " Received legacy SPC-2 RESERVE/RELEASE "
" while active SPC-3 registrations exist, "
" returning RESERVATION_CONFLICT \n " ) ;
* ret = PYX_TRANSPORT _RESERVATION_CONFLICT;
cmd - > scsi_sense_reason = TCM _RESERVATION_CONFLICT;
return true ;
}
@ -252,7 +252,8 @@ int target_scsi2_reservation_reserve(struct se_task *task)
( cmd - > t_task_cdb [ 1 ] & 0x02 ) ) {
pr_err ( " LongIO and Obselete Bits set, returning "
" ILLEGAL_REQUEST \n " ) ;
ret = PYX_TRANSPORT_ILLEGAL_REQUEST ;
cmd - > scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE ;
ret = - EINVAL ;
goto out ;
}
/*
@ -277,7 +278,8 @@ int target_scsi2_reservation_reserve(struct se_task *task)
" from %s \n " , cmd - > se_lun - > unpacked_lun ,
cmd - > se_deve - > mapped_lun ,
sess - > se_node_acl - > initiatorname ) ;
ret = PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
ret = - EINVAL ;
goto out_unlock ;
}
@ -1510,7 +1512,8 @@ static int core_scsi3_decode_spec_i_port(
tidh_new = kzalloc ( sizeof ( struct pr_transport_id_holder ) , GFP_KERNEL ) ;
if ( ! tidh_new ) {
pr_err ( " Unable to allocate tidh_new \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
INIT_LIST_HEAD ( & tidh_new - > dest_list ) ;
tidh_new - > dest_tpg = tpg ;
@ -1522,7 +1525,8 @@ static int core_scsi3_decode_spec_i_port(
sa_res_key , all_tg_pt , aptpl ) ;
if ( ! local_pr_reg ) {
kfree ( tidh_new ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - ENOMEM ;
}
tidh_new - > dest_pr_reg = local_pr_reg ;
/*
@ -1548,7 +1552,8 @@ static int core_scsi3_decode_spec_i_port(
pr_err ( " SPC-3 PR: Illegal tpdl: %u + 28 byte header "
" does not equal CDB data_length: %u \n " , tpdl ,
cmd - > data_length ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
/*
@ -1598,7 +1603,9 @@ static int core_scsi3_decode_spec_i_port(
" for tmp_tpg \n " ) ;
atomic_dec ( & tmp_tpg - > tpg_pr_ref_count ) ;
smp_mb__after_atomic_dec ( ) ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason =
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
ret = - EINVAL ;
goto out ;
}
/*
@ -1628,7 +1635,9 @@ static int core_scsi3_decode_spec_i_port(
atomic_dec ( & dest_node_acl - > acl_pr_ref_count ) ;
smp_mb__after_atomic_dec ( ) ;
core_scsi3_tpg_undepend_item ( tmp_tpg ) ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason =
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
ret = - EINVAL ;
goto out ;
}
@ -1646,7 +1655,8 @@ static int core_scsi3_decode_spec_i_port(
if ( ! dest_tpg ) {
pr_err ( " SPC-3 PR SPEC_I_PT: Unable to locate "
" dest_tpg \n " ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
#if 0
@ -1660,7 +1670,8 @@ static int core_scsi3_decode_spec_i_port(
" %u for Transport ID: %s \n " , tid_len , ptr ) ;
core_scsi3_nodeacl_undepend_item ( dest_node_acl ) ;
core_scsi3_tpg_undepend_item ( dest_tpg ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
/*
@ -1678,7 +1689,8 @@ static int core_scsi3_decode_spec_i_port(
core_scsi3_nodeacl_undepend_item ( dest_node_acl ) ;
core_scsi3_tpg_undepend_item ( dest_tpg ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
@ -1690,7 +1702,9 @@ static int core_scsi3_decode_spec_i_port(
smp_mb__after_atomic_dec ( ) ;
core_scsi3_nodeacl_undepend_item ( dest_node_acl ) ;
core_scsi3_tpg_undepend_item ( dest_tpg ) ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason =
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
ret = - EINVAL ;
goto out ;
}
#if 0
@ -1727,7 +1741,9 @@ static int core_scsi3_decode_spec_i_port(
core_scsi3_lunacl_undepend_item ( dest_se_deve ) ;
core_scsi3_nodeacl_undepend_item ( dest_node_acl ) ;
core_scsi3_tpg_undepend_item ( dest_tpg ) ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason =
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
ret = - ENOMEM ;
goto out ;
}
INIT_LIST_HEAD ( & tidh_new - > dest_list ) ;
@ -1759,7 +1775,8 @@ static int core_scsi3_decode_spec_i_port(
core_scsi3_nodeacl_undepend_item ( dest_node_acl ) ;
core_scsi3_tpg_undepend_item ( dest_tpg ) ;
kfree ( tidh_new ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
tidh_new - > dest_pr_reg = dest_pr_reg ;
@ -2098,7 +2115,8 @@ static int core_scsi3_emulate_pro_register(
if ( ! se_sess | | ! se_lun ) {
pr_err ( " SPC-3 PR: se_sess || struct se_lun is NULL! \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
se_tpg = se_sess - > se_tpg ;
se_deve = & se_sess - > se_node_acl - > device_list [ cmd - > orig_fe_lun ] ;
@ -2117,13 +2135,14 @@ static int core_scsi3_emulate_pro_register(
if ( res_key ) {
pr_warn ( " SPC-3 PR: Reservation Key non-zero "
" for SA REGISTER, returning CONFLICT \n " ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* Do nothing but return GOOD status .
*/
if ( ! sa_res_key )
return PYX_TRANSPORT_SENT_TO_TRANSPORT ;
return 0 ;
if ( ! spec_i_pt ) {
/*
@ -2138,7 +2157,8 @@ static int core_scsi3_emulate_pro_register(
if ( ret ! = 0 ) {
pr_err ( " Unable to allocate "
" struct t10_pr_registration \n " ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
} else {
/*
@ -2197,14 +2217,16 @@ static int core_scsi3_emulate_pro_register(
" 0x%016Lx \n " , res_key ,
pr_reg - > pr_res_key ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
}
if ( spec_i_pt ) {
pr_err ( " SPC-3 PR UNREGISTER: SPEC_I_PT "
" set while sa_res_key=0 \n " ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
/*
* An existing ALL_TG_PT = 1 registration being released
@ -2215,7 +2237,8 @@ static int core_scsi3_emulate_pro_register(
" registration exists, but ALL_TG_PT=1 bit not "
" present in received PROUT \n " ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
/*
* Allocate APTPL metadata buffer used for UNREGISTER ops
@ -2227,7 +2250,9 @@ static int core_scsi3_emulate_pro_register(
pr_err ( " Unable to allocate "
" pr_aptpl_buf \n " ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason =
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
}
/*
@ -2241,7 +2266,8 @@ static int core_scsi3_emulate_pro_register(
if ( pr_holder < 0 ) {
kfree ( pr_aptpl_buf ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
spin_lock ( & pr_tmpl - > registration_lock ) ;
@ -2405,7 +2431,8 @@ static int core_scsi3_pro_reserve(
if ( ! se_sess | | ! se_lun ) {
pr_err ( " SPC-3 PR: se_sess || struct se_lun is NULL! \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
se_tpg = se_sess - > se_tpg ;
se_deve = & se_sess - > se_node_acl - > device_list [ cmd - > orig_fe_lun ] ;
@ -2417,7 +2444,8 @@ static int core_scsi3_pro_reserve(
if ( ! pr_reg ) {
pr_err ( " SPC-3 PR: Unable to locate "
" PR_REGISTERED *pr_reg for RESERVE \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
/*
* From spc4r17 Section 5.7 .9 : Reserving :
@ -2433,7 +2461,8 @@ static int core_scsi3_pro_reserve(
" does not match existing SA REGISTER res_key: "
" 0x%016Lx \n " , res_key , pr_reg - > pr_res_key ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* From spc4r17 Section 5.7 .9 : Reserving :
@ -2448,7 +2477,8 @@ static int core_scsi3_pro_reserve(
if ( scope ! = PR_SCOPE_LU_SCOPE ) {
pr_err ( " SPC-3 PR: Illegal SCOPE: 0x%02x \n " , scope ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
/*
* See if we have an existing PR reservation holder pointer at
@ -2480,7 +2510,8 @@ static int core_scsi3_pro_reserve(
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* From spc4r17 Section 5.7 .9 : Reserving :
@ -2503,7 +2534,8 @@ static int core_scsi3_pro_reserve(
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* From spc4r17 Section 5.7 .9 : Reserving :
@ -2517,7 +2549,7 @@ static int core_scsi3_pro_reserve(
*/
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_SENT_TO_TRANSPORT ;
return 0 ;
}
/*
* Otherwise , our * pr_reg becomes the PR reservation holder for said
@ -2574,7 +2606,8 @@ static int core_scsi3_emulate_pro_reserve(
default :
pr_err ( " SPC-3 PR: Unknown Service Action RESERVE Type: "
" 0x%02x \n " , type ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
return ret ;
@ -2630,7 +2663,8 @@ static int core_scsi3_emulate_pro_release(
if ( ! se_sess | | ! se_lun ) {
pr_err ( " SPC-3 PR: se_sess || struct se_lun is NULL! \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
/*
* Locate the existing * pr_reg via struct se_node_acl pointers
@ -2639,7 +2673,8 @@ static int core_scsi3_emulate_pro_release(
if ( ! pr_reg ) {
pr_err ( " SPC-3 PR: Unable to locate "
" PR_REGISTERED *pr_reg for RELEASE \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
/*
* From spc4r17 Section 5.7 .11 .2 Releasing :
@ -2661,7 +2696,7 @@ static int core_scsi3_emulate_pro_release(
*/
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_SENT_TO_TRANSPORT ;
return 0 ;
}
if ( ( pr_res_holder - > pr_res_type = = PR_TYPE_WRITE_EXCLUSIVE_ALLREG ) | |
( pr_res_holder - > pr_res_type = = PR_TYPE_EXCLUSIVE_ACCESS_ALLREG ) )
@ -2675,7 +2710,7 @@ static int core_scsi3_emulate_pro_release(
*/
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_SENT_TO_TRANSPORT ;
return 0 ;
}
/*
* From spc4r17 Section 5.7 .11 .2 Releasing :
@ -2697,7 +2732,8 @@ static int core_scsi3_emulate_pro_release(
" 0x%016Lx \n " , res_key , pr_reg - > pr_res_key ) ;
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* From spc4r17 Section 5.7 .11 .2 Releasing and above :
@ -2719,7 +2755,8 @@ static int core_scsi3_emulate_pro_release(
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* In response to a persistent reservation release request from the
@ -2802,7 +2839,8 @@ static int core_scsi3_emulate_pro_clear(
if ( ! pr_reg_n ) {
pr_err ( " SPC-3 PR: Unable to locate "
" PR_REGISTERED *pr_reg for CLEAR \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
/*
* From spc4r17 section 5.7 .11 .6 , Clearing :
@ -2821,7 +2859,8 @@ static int core_scsi3_emulate_pro_clear(
" existing SA REGISTER res_key: "
" 0x%016Lx \n " , res_key , pr_reg_n - > pr_res_key ) ;
core_scsi3_put_pr_reg ( pr_reg_n ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* a ) Release the persistent reservation , if any ;
@ -2979,8 +3018,10 @@ static int core_scsi3_pro_preempt(
int all_reg = 0 , calling_it_nexus = 0 , released_regs = 0 ;
int prh_type = 0 , prh_scope = 0 , ret ;
if ( ! se_sess )
return PYX_TRANSPORT_LU_COMM_FAILURE ;
if ( ! se_sess ) {
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
se_deve = & se_sess - > se_node_acl - > device_list [ cmd - > orig_fe_lun ] ;
pr_reg_n = core_scsi3_locate_pr_reg ( cmd - > se_dev , se_sess - > se_node_acl ,
@ -2989,16 +3030,19 @@ static int core_scsi3_pro_preempt(
pr_err ( " SPC-3 PR: Unable to locate "
" PR_REGISTERED *pr_reg for PREEMPT%s \n " ,
( abort ) ? " _AND_ABORT " : " " ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
if ( pr_reg_n - > pr_res_key ! = res_key ) {
core_scsi3_put_pr_reg ( pr_reg_n ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
if ( scope ! = PR_SCOPE_LU_SCOPE ) {
pr_err ( " SPC-3 PR: Illegal SCOPE: 0x%02x \n " , scope ) ;
core_scsi3_put_pr_reg ( pr_reg_n ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
INIT_LIST_HEAD ( & preempt_and_abort_list ) ;
@ -3012,7 +3056,8 @@ static int core_scsi3_pro_preempt(
if ( ! all_reg & & ! sa_res_key ) {
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg_n ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
/*
* From spc4r17 , section 5.7 .11 .4 .4 Removing Registrations :
@ -3106,7 +3151,8 @@ static int core_scsi3_pro_preempt(
if ( ! released_regs ) {
spin_unlock ( & dev - > dev_reservation_lock ) ;
core_scsi3_put_pr_reg ( pr_reg_n ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* For an existing all registrants type reservation
@ -3297,7 +3343,8 @@ static int core_scsi3_emulate_pro_preempt(
default :
pr_err ( " SPC-3 PR: Unknown Service Action PREEMPT%s "
" Type: 0x%02x \n " , ( abort ) ? " _AND_ABORT " : " " , type ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
return ret ;
@ -3331,7 +3378,8 @@ static int core_scsi3_emulate_pro_register_and_move(
if ( ! se_sess | | ! se_lun ) {
pr_err ( " SPC-3 PR: se_sess || struct se_lun is NULL! \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
memset ( dest_iport , 0 , 64 ) ;
memset ( i_buf , 0 , PR_REG_ISID_ID_LEN ) ;
@ -3349,7 +3397,8 @@ static int core_scsi3_emulate_pro_register_and_move(
if ( ! pr_reg ) {
pr_err ( " SPC-3 PR: Unable to locate PR_REGISTERED "
" *pr_reg for REGISTER_AND_MOVE \n " ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
/*
* The provided reservation key much match the existing reservation key
@ -3360,7 +3409,8 @@ static int core_scsi3_emulate_pro_register_and_move(
" res_key: 0x%016Lx does not match existing SA REGISTER "
" res_key: 0x%016Lx \n " , res_key , pr_reg - > pr_res_key ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
/*
* The service active reservation key needs to be non zero
@ -3369,7 +3419,8 @@ static int core_scsi3_emulate_pro_register_and_move(
pr_warn ( " SPC-3 PR REGISTER_AND_MOVE: Received zero "
" sa_res_key \n " ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
/*
@ -3392,7 +3443,8 @@ static int core_scsi3_emulate_pro_register_and_move(
" does not equal CDB data_length: %u \n " , tid_len ,
cmd - > data_length ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
spin_lock ( & dev - > se_port_lock ) ;
@ -3417,7 +3469,8 @@ static int core_scsi3_emulate_pro_register_and_move(
atomic_dec ( & dest_se_tpg - > tpg_pr_ref_count ) ;
smp_mb__after_atomic_dec ( ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
spin_lock ( & dev - > se_port_lock ) ;
@ -3430,7 +3483,8 @@ static int core_scsi3_emulate_pro_register_and_move(
" fabric ops from Relative Target Port Identifier: "
" %hu \n " , rtpi ) ;
core_scsi3_put_pr_reg ( pr_reg ) ;
return PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
return - EINVAL ;
}
buf = transport_kmap_first_data_page ( cmd ) ;
@ -3445,14 +3499,16 @@ static int core_scsi3_emulate_pro_register_and_move(
" from fabric: %s \n " , proto_ident ,
dest_tf_ops - > get_fabric_proto_ident ( dest_se_tpg ) ,
dest_tf_ops - > get_fabric_name ( ) ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
if ( dest_tf_ops - > tpg_parse_pr_out_transport_id = = NULL ) {
pr_err ( " SPC-3 PR REGISTER_AND_MOVE: Fabric does not "
" containg a valid tpg_parse_pr_out_transport_id "
" function pointer \n " ) ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
ret = - EINVAL ;
goto out ;
}
initiator_str = dest_tf_ops - > tpg_parse_pr_out_transport_id ( dest_se_tpg ,
@ -3460,7 +3516,8 @@ static int core_scsi3_emulate_pro_register_and_move(
if ( ! initiator_str ) {
pr_err ( " SPC-3 PR REGISTER_AND_MOVE: Unable to locate "
" initiator_str from Transport ID \n " ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
@ -3489,7 +3546,8 @@ static int core_scsi3_emulate_pro_register_and_move(
pr_err ( " SPC-3 PR REGISTER_AND_MOVE: TransportID: %s "
" matches: %s on received I_T Nexus \n " , initiator_str ,
pr_reg_nacl - > initiatorname ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
if ( ! strcmp ( iport_ptr , pr_reg - > pr_reg_isid ) ) {
@ -3497,7 +3555,8 @@ static int core_scsi3_emulate_pro_register_and_move(
" matches: %s %s on received I_T Nexus \n " ,
initiator_str , iport_ptr , pr_reg_nacl - > initiatorname ,
pr_reg - > pr_reg_isid ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
after_iport_check :
@ -3517,7 +3576,8 @@ after_iport_check:
pr_err ( " Unable to locate %s dest_node_acl for "
" TransportID%s \n " , dest_tf_ops - > get_fabric_name ( ) ,
initiator_str ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
ret = core_scsi3_nodeacl_depend_item ( dest_node_acl ) ;
@ -3527,7 +3587,8 @@ after_iport_check:
atomic_dec ( & dest_node_acl - > acl_pr_ref_count ) ;
smp_mb__after_atomic_dec ( ) ;
dest_node_acl = NULL ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
#if 0
@ -3543,7 +3604,8 @@ after_iport_check:
if ( ! dest_se_deve ) {
pr_err ( " Unable to locate %s dest_se_deve from RTPI: "
" %hu \n " , dest_tf_ops - > get_fabric_name ( ) , rtpi ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
@ -3553,7 +3615,8 @@ after_iport_check:
atomic_dec ( & dest_se_deve - > pr_ref_count ) ;
smp_mb__after_atomic_dec ( ) ;
dest_se_deve = NULL ;
ret = PYX_TRANSPORT_LU_COMM_FAILURE ;
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
ret = - EINVAL ;
goto out ;
}
#if 0
@ -3572,7 +3635,8 @@ after_iport_check:
pr_warn ( " SPC-3 PR REGISTER_AND_MOVE: No reservation "
" currently held \n " ) ;
spin_unlock ( & dev - > dev_reservation_lock ) ;
ret = PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
ret = - EINVAL ;
goto out ;
}
/*
@ -3585,7 +3649,8 @@ after_iport_check:
pr_warn ( " SPC-3 PR REGISTER_AND_MOVE: Calling I_T "
" Nexus is not reservation holder \n " ) ;
spin_unlock ( & dev - > dev_reservation_lock ) ;
ret = PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
ret = - EINVAL ;
goto out ;
}
/*
@ -3603,7 +3668,8 @@ after_iport_check:
" reservation for type: %s \n " ,
core_scsi3_pr_dump_type ( pr_res_holder - > pr_res_type ) ) ;
spin_unlock ( & dev - > dev_reservation_lock ) ;
ret = PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
ret = - EINVAL ;
goto out ;
}
pr_res_nacl = pr_res_holder - > pr_reg_nacl ;
@ -3640,7 +3706,8 @@ after_iport_check:
sa_res_key , 0 , aptpl , 2 , 1 ) ;
if ( ret ! = 0 ) {
spin_unlock ( & dev - > dev_reservation_lock ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
dest_pr_reg = __core_scsi3_locate_pr_reg ( dev , dest_node_acl ,
@ -3771,7 +3838,8 @@ int target_scsi3_emulate_pr_out(struct se_task *task)
pr_err ( " Received PERSISTENT_RESERVE CDB while legacy "
" SPC-2 reservation is held, returning "
" RESERVATION_CONFLICT \n " ) ;
ret = PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
ret = EINVAL ;
goto out ;
}
@ -3779,13 +3847,16 @@ int target_scsi3_emulate_pr_out(struct se_task *task)
* FIXME : A NULL struct se_session pointer means an this is not coming from
* a $ FABRIC_MOD ' s nexus , but from internal passthrough ops .
*/
if ( ! cmd - > se_sess )
return PYX_TRANSPORT_LU_COMM_FAILURE ;
if ( ! cmd - > se_sess ) {
cmd - > scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
return - EINVAL ;
}
if ( cmd - > data_length < 24 ) {
pr_warn ( " SPC-PR: Received PR OUT parameter list "
" length too small: %u \n " , cmd - > data_length ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
/*
@ -3820,7 +3891,8 @@ int target_scsi3_emulate_pr_out(struct se_task *task)
* SPEC_I_PT = 1 is only valid for Service action : REGISTER
*/
if ( spec_i_pt & & ( ( cdb [ 1 ] & 0x1f ) ! = PRO_REGISTER ) ) {
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
@ -3837,7 +3909,8 @@ int target_scsi3_emulate_pr_out(struct se_task *task)
( cmd - > data_length ! = 24 ) ) {
pr_warn ( " SPC-PR: Received PR OUT illegal parameter "
" list length: %u \n " , cmd - > data_length ) ;
ret = PYX_TRANSPORT_INVALID_PARAMETER_LIST ;
cmd - > scsi_sense_reason = TCM_INVALID_PARAMETER_LIST ;
ret = - EINVAL ;
goto out ;
}
/*
@ -3878,7 +3951,8 @@ int target_scsi3_emulate_pr_out(struct se_task *task)
default :
pr_err ( " Unknown PERSISTENT_RESERVE_OUT service "
" action: 0x%02x \n " , cdb [ 1 ] & 0x1f ) ;
ret = PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
ret = - EINVAL ;
break ;
}
@ -3906,7 +3980,8 @@ static int core_scsi3_pri_read_keys(struct se_cmd *cmd)
if ( cmd - > data_length < 8 ) {
pr_err ( " PRIN SA READ_KEYS SCSI Data Length: %u "
" too small \n " , cmd - > data_length ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
buf = transport_kmap_first_data_page ( cmd ) ;
@ -3965,7 +4040,8 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd)
if ( cmd - > data_length < 8 ) {
pr_err ( " PRIN SA READ_RESERVATIONS SCSI Data Length: %u "
" too small \n " , cmd - > data_length ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
buf = transport_kmap_first_data_page ( cmd ) ;
@ -4047,7 +4123,8 @@ static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
if ( cmd - > data_length < 6 ) {
pr_err ( " PRIN SA REPORT_CAPABILITIES SCSI Data Length: "
" %u too small \n " , cmd - > data_length ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
buf = transport_kmap_first_data_page ( cmd ) ;
@ -4108,7 +4185,8 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
if ( cmd - > data_length < 8 ) {
pr_err ( " PRIN SA READ_FULL_STATUS SCSI Data Length: %u "
" too small \n " , cmd - > data_length ) ;
return PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
return - EINVAL ;
}
buf = transport_kmap_first_data_page ( cmd ) ;
@ -4255,7 +4333,8 @@ int target_scsi3_emulate_pr_in(struct se_task *task)
pr_err ( " Received PERSISTENT_RESERVE CDB while legacy "
" SPC-2 reservation is held, returning "
" RESERVATION_CONFLICT \n " ) ;
return PYX_TRANSPORT_RESERVATION_CONFLICT ;
cmd - > scsi_sense_reason = TCM_RESERVATION_CONFLICT ;
return - EINVAL ;
}
switch ( cmd - > t_task_cdb [ 1 ] & 0x1f ) {
@ -4274,7 +4353,8 @@ int target_scsi3_emulate_pr_in(struct se_task *task)
default :
pr_err ( " Unknown PERSISTENT_RESERVE_IN service "
" action: 0x%02x \n " , cmd - > t_task_cdb [ 1 ] & 0x1f ) ;
ret = PYX_TRANSPORT_INVALID_CDB_FIELD ;
cmd - > scsi_sense_reason = TCM_INVALID_CDB_FIELD ;
ret = - EINVAL ;
break ;
}