在 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)
将一个 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)
http://mixin125.m.blog.chinaunix.net/uid-7749031-id-2044708.html