--- ./source/private_module/lun/lun_io/lun_io_proc.c	2018-04-19 08:47:18.000000000 +0000
+++ ./source/private_module/lun/lun_io/lun_io_proc.c.hotpatch	2020-05-14 14:47:19.000000000 +0000
@@ -1049,7 +1049,7 @@
 
 
 #if DESC("lun iod step")
-
+bool needEnterPatchFunc(LUN_IOD_STEP_S *steps, uint32_t curStep);int32_t lunIoEnterOverLoadPatch(REQ_S *req);
 /*****************************************************************************
      : execLunIodStep
    : lun io״̬
@@ -1064,14 +1064,11 @@
     int32_t result = CONTEXT_REPEAT;
     //char *name;
     uint32_t curStep;
-
-    /*ˣˣassert*/
     if (funcInfo->curStep >= funcInfo->maxStep)
     {
         VOLS_BUG_HANDLE_EXP(0, "curStep(%u) maxStep(%u).", funcInfo->curStep, funcInfo->maxStep);
         return;
     }
-
     while (CONTEXT_CONTINUE == result || CONTEXT_REPEAT == result)
     {
         if (CONTEXT_CONTINUE == result)
@@ -1082,13 +1079,16 @@
         {
             return;
         }
-        //name = funcInfo->steps[funcInfo->curStep].funcName;
         curStep = funcInfo->curStep;
-        //DBG_LogInfo(LUN_LOG_ID_NEW, "%s: curStep(%d) .",name, curStep);
 
-        result = funcInfo->steps[curStep].exec(req);
-        //DBG_LogInfo(LUN_LOG_ID_NEW, "22 %s: curStep(%d) result(%d) .",
-        //    name, curStep, result);
+        if (needEnterPatchFunc(funcInfo->steps, curStep))
+        {
+            result = lunIoEnterOverLoadPatch(req);
+        }
+        else
+        {
+            result = funcInfo->steps[curStep].exec(req);
+        }
     }
 
     return;
@@ -25933,7 +25933,7 @@
     LUN_FTDS_TRACE_RECORD(req, LUN_OVERLOAD_CTRL);
 
     ioPrivateInfo = (DEVLUN_IO_PRIVATE_S *)(void *)req->producerPrivate;
-    if (ioPrivateInfo->isUnmapIo)
+    if (ioPrivateInfo->isUnmapIo || vols_test_bit(31, (void *)&ioPrivateInfo->ioPrivateFlag))
     {
         LUN_COUNTER_BACK_INC(req, VOLS_COUNTER_LUN_UNMAP_IO_OVERLOAD_CTRL, ctrlRet);
     }
@@ -28017,3 +28017,69 @@
     return (isHostIoAbort(lunId, lba, len));
 }
 
+int32_t lunIoEnterOverLoadPatch(REQ_S *req)
+{
+    FLOW_CTRL_IO_PARA_S ctrlPara;
+    int32_t olReturn;
+    DEVLUN_IO_PRIVATE_S *ioPrivateInfo;
+
+    endCurPhase(VOLS_COUNTER_LUN_PRE_START_IO, req->objectId, GET_START_IO_TIME_IN_REQ(req), req->opCode);
+    if (isIoInLunWorkControl(req))
+    {
+        copyCtxTrace2Req(req);
+
+        ioPrivateInfo = (DEVLUN_IO_PRIVATE_S *)(void *)req->producerPrivate;
+
+        /*һIOֻһ*/
+        if (vols_test_bit(LUNIO_ATTR_ENTER_OVERLOAD, (void *)&ioPrivateInfo->ioPrivateFlag))
+        {
+            return CONTEXT_CONTINUE;
+        }
+
+        getOverloadPara(req, &ctrlPara);
+
+        VOLS_BUG_HANDLE(NULL != g_lunIoFlowCtrlObj);
+        VOLS_BUG_HANDLE(NULL != g_lunUnmapIoFlowCtrlObj);
+
+        if ((ioPrivateInfo->isUnmapIo) || vols_test_bit(31, (void *)&ioPrivateInfo->ioPrivateFlag))
+        {
+            LUN_COUNTER_START_INC(req, VOLS_COUNTER_LUN_UNMAP_IO_OVERLOAD_CTRL);
+            olReturn = overloadBGFlowCtrl(g_lunUnmapIoFlowCtrlObj, &ctrlPara,
+                                            overloadLunCallback, req);
+        }
+        else
+        {
+            LUN_COUNTER_START_INC(req, VOLS_COUNTER_LUN_OVERLOAD_CTRL);
+            olReturn = overloadDoFlowCtrl(g_lunIoFlowCtrlObj, &ctrlPara,
+                                            overloadLunCallback, req);
+        }
+
+        if (OVERLOAD_CTRL_PENDING != olReturn)
+        {
+            overloadLunCallback(olReturn, req);
+        }
+        return CONTEXT_PENDING;
+    }
+    return CONTEXT_CONTINUE;
+}
+
+bool needEnterPatchFunc(LUN_IOD_STEP_S *steps, uint32_t curStep)
+{
+    if ((steps == s_newWriteAllocStep) && (LUN_NEW_WRITE_ALLOC_ENTER_OVERLOAD == steps[curStep].index))
+    {
+        return TRUE;
+    }
+
+    if ((steps == s_newWriteStep) && (LUN_NEW_WRITE_ENTER_OVERLOAD == steps[curStep].index))
+    {
+        return TRUE;
+    }
+
+    if ((steps == s_newWriteTransStep) && (LUN_NEW_WRITE_ENTER_OVERLOAD == steps[curStep].index))
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
--- ./source/private_module/lun/lun_io/lun_io_util.c	2018-03-29 08:14:08.000000000 +0000
+++ ./source/private_module/lun/lun_io/lun_io_util.c.hotpatch	2020-05-14 11:57:41.000000000 +0000
@@ -626,11 +626,6 @@
     tempReq->onFlyProcess = 0;
     tempReq->result = RETURN_OK;
     privateInfo = (DEVLUN_IO_PRIVATE_S *)(void *)tempReq->producerPrivate;
-
-    /* Ƚ˽Ա־ֶγʼΪ0
-     * LUNIO_ATTR_ABORTIO_BIT, LUNIO_ATTR_WRITEERRIO_BIT,
-     * LUNIO_ATTR_INNERIO_BITLUNIO_ATTR_PAIRIO_BITĸ
-     * SCSIIOʱĬ϶Ϊ0Ҫٶʼ */
     privateInfo->ioPrivateFlag = 0;
     ioPrivateFlag = &(privateInfo->ioPrivateFlag);
 
@@ -645,6 +640,11 @@
         privateInfo->ebsOpcode = lunGenIo->ebsOpcode;
     }
 
+    if (4 == lunGenIo->ioSourceType)
+    {
+        vols_set_bit(31, (void *)ioPrivateFlag);
+    }
+
     /*SAN˫; l00240674; 20140126; start */
     SET_LUN_IO_EXTEND_TYPE(ioPrivateFlag, lunGenIo);
     /*SAN˫; l00240674; 20140126; end */
