--- ./source/private_module/scsi/scsi_rsvread_cmd.c	2018-02-09 21:47:03.000000000 +0800
+++ ./source/private_module/scsi/scsi_rsvread_cmd.c.hotpatch	2018-07-07 13:58:56.000000000 +0800
@@ -362,7 +362,7 @@
     tgtResvReadCmd->rtpi = tgtCmd->rtpi;
     SCSI_GET_CMD_SN(tgtResvReadCmd) = SCSI_GET_CMD_SN(tgtCmd);
 }
-
+int32_t scsiPatchCawPeerAbort(TGT_CMD_S *rawTgtCmd);
 /**************************************************************************
 *     : ԶAbort
 * : tgtCmd : tgtָ
@@ -377,7 +377,7 @@
     struct list_head *pos = NULL;    
     SCSI_PEER_CMD_LIST_S *scsiPeerCmdList = NULL;
     OSP_ULONG flag = 0;
-    SCSI_CMD_OPS* pstCmdOps = NULL;
+    //SCSI_CMD_OPS* pstCmdOps = NULL;
         
     scsiPeerCmdList = scsiGetPeerCmdList();
 
@@ -396,8 +396,10 @@
                    SCSI_GET_CDB_OP(rawTgtCmd),
                    rawTgtCmd->ullStartLBA,
                    rawTgtCmd->ucCmdState);
+			(void)scsiPatchCawPeerAbort(rawTgtCmd);
             break;            
         }
+        rawTgtCmd = NULL;
     }    
     spin_unlock_irqrestore(&scsiPeerCmdList->listLock, flag);
     /*ִɣֱӷ*/
@@ -405,20 +407,18 @@
     {
         DBG_LogDebug(DBG_LOGID_BUTT,
                                     "Abort:Can not find tgtcmd to abort.");
-        return;
     }
-    pstCmdOps = scsiCmdGetPrimitiveOps(rawTgtCmd);
-    if (unlikely(NULL == pstCmdOps))
+	
+    do
     {
-        /*unsupported cmd*/
-        TGT_PRINT_INFO_LOW(LOG_ID_0262,
-                                    "Abort:Unsupported cmd:opcode(0x%x),cmd(%p).",
-                                    SCSI_GET_CDB_OP(rawTgtCmd),rawTgtCmd);
-        return;
-    }
+        static OSP_U32 uiPrinted = 0;static OSP_U32 uiMissed = 0;static OSP_ULONG ulLast = 0;
+
+        if (!jiffies)
+        {
+            printk("%x\n", uiPrinted++);printk("%x\n", uiMissed++);printk("%lx\n", ulLast++);
+        }
+    }while (0);
 
-    /*2,ABORT*/
-    (void)pstCmdOps->cmd_abort(rawTgtCmd);
     return;
 }
 /************************************************************************
@@ -2098,3 +2098,48 @@
 }
 #endif
 
+int32_t scsiPatchCawPeerAbort(TGT_CMD_S *rawTgtCmd)
+{
+    SCSI_CAW_CMD_S* cawCmd = NULL;
+    bool bPrint = B_FALSE;
+
+    if (TADRV_SCSIOPC_COMPARE_AND_WRITE != SCSI_GET_CDB_OP(rawTgtCmd))
+    {
+        SCSI_PRINT_INFO_LOW(DBG_LOGID_BUTT, 
+            SCSI_CMD_STRING("CHECK", "CAW_ABORT:cmd(%p),opcode(%x),lba(%llx) shouldn't be here.", rawTgtCmd),
+                    rawTgtCmd,
+                    SCSI_GET_CDB_OP(rawTgtCmd),
+                    rawTgtCmd->ullStartLBA);
+        return RETURN_ERROR;
+    }
+
+    cawCmd = (SCSI_CAW_CMD_S*)(void*)rawTgtCmd->scsiPrivate;
+
+    TGT_CONTROL_PRINT_LIMIT_PERIOD(DBG_LOG_INFO, DBG_LOGID_BUTT, 180 * HZ, 2, bPrint);       
+    if (bPrint)
+    {     
+        //TGT_PRINT_TGTCMD(rawTgtCmd);
+        DBG_LogInfo(DBG_LOGID_BUTT, 
+                   "Abort:Excute aborting, Cmd 0x%p,LUN %d, SN %llx,LBA %llu,caw stat %x.", 
+                   rawTgtCmd,
+                   rawTgtCmd->uiDevLunId,
+                   SCSI_GET_CMD_SN(rawTgtCmd),
+                   rawTgtCmd->ullStartLBA,
+                   cawCmd->cawStatus);
+    }
+   
+    /*cawǷATSУҪabortδ֮ǰͱabort*/
+    if (LVOS_test_and_set_bit(SCSI_CAW_STATUS_ABORTING, (void*)(&cawCmd->cawStatus)) )
+    {
+        SCSI_PRINT_INFO_LOW(DBG_LOGID_BUTT,
+                            SCSI_CMD_STRING("CHECK", "CAW_ABORT:cmd(%p),cawStat(%x),lba(%llu) abort again.", rawTgtCmd),
+                            rawTgtCmd,
+                            cawCmd->cawStatus,
+                            rawTgtCmd->ullStartLBA);
+        return RETURN_ERROR;
+    }
+
+    
+    return RETURN_OK;
+}
+
