在 Initiator 处理一个任务时,任务未完成,但中间数据有误了(如CRC失败),可以通过任务重置来本connection 上的该任务分配置到一个新的 connection 中,然后继续完成乘下的数据,免得整个任务重新执行。任务重置属于commond recovery,涉及到多 connection。
将一个 command 重新分配到一个connection上时,target应该从当前状态继续执行该command。例如,重置read command时, Target应当利用TestManageRequest中ExpDataSN(无数据传送时置0)值,来激活read command发送乘下的数据以及status. ExpDataSN 表示所有已经发送成功的数据pdu号(读时为Data-In中的DataSN, 写时为R2T中的R2TSN),但不包括DataSN等于ExpDataSN 的Data-In PDU,或R2TSN等于ExpDataSN的R2T。Target可以在重新分配的connect上发送或接收所有乘下的数据,当然,如果target无法得到一个准确的任务状态时,可以选择发送或接收所有的数据。Initiator不允许通过Snack请求重传PDU号小于
ExpDataSN的数据。对于所有类型的command,一个重置请求,表明了该任务仍在被initiator处理中,如果Target返回'Function Complete' response时,Target 必须正确地完成该任务,如果须要,可以调用Data/R2T/status 重传,但必须要传输/重传 status PDU.
Read Command 重置过程:
Connect-1: Read cmd ---------------->
<--------------- Data-In(DataSn=0)
<--------------- Data-In(DataSn=1)
CRC-Error <--------------- Data-In(DataSn=2)
Connect-2: Login(MC/s) ---------------->
<--------------- LoginResponse
Logout ----------------> Remove connect-1 for recovery
TaskManagement ----------------> Reassign task (ExpDataSN=2)
<--------------- TaskManagementRsp(complete)
<--------------- Data-In(DataSn=2)
<--------------- Data-In(ststud)
Write Command 重置过程:
Connect-1: Write cmd ---------------->
<--------------- R2T(R2TSN=0)
DataOut(SN=0) ---------------->
DataOut(SN=1) ---------------->
DataOut(SN=2) ----------------> CRC-Error
<--------------- Reject
Connect-2: Login(MC/s) ---------------->
<--------------- LoginResponse
Logout ----------------> Remove connect-1 for recovery
TaskManagement ----------------> Reassign task (ExpDataSN=0)
<--------------- TaskManagementRsp(complete)
<--------------- R2T(R2TSN=0)
DataOut(SN=0) ---------------->
DataOut(SN=1) ---------------->
DataOut(SN=2) ---------------->
DataOut(SN=3) ---------------->
DataOut(F) ---------------->
<--------------- Scsi Response
<--------------- Data-In(DataSn=2)
<--------------- Data-In(ststud)
阅读(1119) | 评论(0) | 转发(0) |