--- ./source/private_module/epl/V3/epl_forward.c	2018-03-10 06:52:19.000000000 +0000
+++ ./source/private_module/epl/V3/epl_forward.c.hotpatch	2018-11-09 11:59:17.000000000 +0000
@@ -1444,18 +1444,36 @@
 
     return RETURN_OK;
 }
-
-/**************************************************************************
-*     : 
-* : req    
-                 ctrlId 
-                 reqType
-                 timeout  һʱʱ: jiffies
-*
-* : 
-* ֵ  : 
-*     : 
-**************************************************************************/
+extern __IO_RW_CL__ uint32_t g_eplOnlineNidMap;
+extern __IO_RW_CL__ uint32_t g_eplOfflineNidMap;
+bool eplCanForwordingReq(const REQ_S *req,  const uint32_t dstNid, const EPL_REQ_TYPE_E reqType)
+{
+    const EBC_MSG_HEAD_S *ebcHead = NULL;
+    bool isDstNodeNormal = FALSE;
+    bool isDstNodeOffline = FALSE; 
+    bool isCnetMsg = FALSE;        
+    isDstNodeNormal = (0!=LVOS_test_bit((int32_t)dstNid, (void*)(&g_eplOnlineNidMap)));
+    isDstNodeOffline = (0!=LVOS_test_bit((int32_t)dstNid, (void*)(&g_eplOfflineNidMap)));   
+    DBG_LogDebug(DBG_LOGID_NEW, "Node maps:online(%x), offline(%x).",g_eplOnlineNidMap, g_eplOfflineNidMap);	
+    if (isDstNodeNormal) 
+    {
+        return TRUE;
+    }
+    if (EPL_REQ_TGT_EBC == reqType)
+    {
+        ebcHead = (const EBC_MSG_HEAD_S *)(const void *)req->sgl->entrys[0].buf;
+        if(NULL==ebcHead) return FALSE;
+        isCnetMsg = (PID_CLUSTER_MSG_FRAMEWORK == ebcHead->dstAppid) ||(PID_CLUSTER_MSG_FRAMEWORK == ebcHead->srcAppid);   
+        if (isCnetMsg && isDstNodeOffline)
+        {
+            DBG_LogDebug(DBG_LOGID_NEW, "Srcapp(%u)nid(%u), dstapp(%u)nid(%u) can send to(%u). offline(%x).", 
+               ebcHead->srcAppid,ebcHead->srcNid,ebcHead->dstAppid,ebcHead->dstNid,dstNid,g_eplOfflineNidMap);
+            return TRUE;
+        }
+    }
+    DBG_LogDebug(DBG_LOGID_NEW, "The dst nid(%u) is not online.", dstNid);    
+    return FALSE;
+}
 int32_t eplForwordingReq(REQ_S *req, uint32_t ctrlId, uint8_t reqType, uint32_t timeout)
 {
     int32_t ret = RETURN_ERROR;
@@ -1473,23 +1491,13 @@
     {
         datalen = eplGetReqLengthOfBytes(req);
     }
-
-    //DBG_ASSERT(ctrlId != g_eplModuleSpec.localNid);
+    
     EPL_BUG_NORM_WITH_RET((ctrlId != g_eplModuleSpec.localNid), RETURN_ERROR);
-    DBG_LogDebug(EPL_LOG_ID_033D,
-                 "LUN(%llx) req(%p) forward to ctrl(%d): opc(0x%x), lba(%llu), len(%d).", 
-                 req->objectId, 
-                 req,
-                 ctrlId,
-                 req->opCode, 
-                 req->objectLba, 
-                 req->length);
-
-    /*жĿڵǷ*/
-    eplGetOnlineNids(&ctrlMap);
+    DBG_LogDebug(EPL_LOG_ID_033D, "LUN(%llx) req(%p) forward to ctrl(%d): opc(0x%x), lba(%llu), len(%d).", 
+                 req->objectId, req, ctrlId, req->opCode, req->objectLba, req->length);
     LVOS_TP_START(EPL_IO_CTRL_ONLINE_MAP_FORWARD, &ctrlMap)
-    LVOS_TP_END    
-    if (!LVOS_test_bit((int32_t)ctrlId, (void*)(&ctrlMap)))
+    LVOS_TP_END     
+    if (!eplCanForwordingReq(req, ctrlId, (EPL_REQ_TYPE_E)reqType))
     {
         DBG_LogError(DBG_LOGID_NEW, "The dst nid(%u) is not online.", ctrlId);
         return RETURN_ERROR;
@@ -1513,8 +1521,6 @@
                             req->objectId, req, ctrlId);
         return RETURN_ERROR;
     }
-
-    /*ֵibd   */
     xrbData = (EPL_FWD_XRB_DATA_S *)ibdData;
     xrbData->version = EPL_XNET_VERSION_0;
     xrbData->xnetMsgMode = XNET_MSG_MODE_REQ;
@@ -1527,19 +1533,14 @@
     ret = eplFwdReq2XrbData(xrbData, req);
     if (RETURN_OK != ret)
     {
-        DBG_LogError(EPL_LOG_ID_033F, "LUN(%llx) req(%p) forward to ctrl(%d) failed.", 
-                            req->objectId, req, ctrlId);
-        /*ͷĿռ*/
+        DBG_LogError(EPL_LOG_ID_033F, "LUN(%llx) req(%p) forward to ctrl(%d) failed.", req->objectId, req, ctrlId);
         XRB_FreeIbd(ibdData);
         ibdData = NULL;
         return RETURN_ERROR;
     }
-
-    /*XRB   */
     XRB_SET_MSG_PARAM(ibdData, sizeof(EPL_FWD_XRB_DATA_S), EPL_FWD_IO_TIMEOUT, req, req->opCode);
     XRB_SET_MSG_ADDR(ibdData, (uint16_t)ctrlId, (uint16_t)MY_PID);
 
-    /*IO*/
     switch (xrbData->sendMode)
     {
         case EPL_FWD_SEND_MODE_DATA:
@@ -1564,8 +1565,7 @@
                                     xrbData->sendMode, req->opCode);
             XRB_FreeIbd(ibdData);
             break;
-    }
-    
+    }    
     return RETURN_OK;
 }
 
--- ./source/private_module/epl/V3/epl_main.c	2018-03-10 06:52:19.000000000 +0000
+++ ./source/private_module/epl/V3/epl_main.c.hotpatch	2018-11-09 11:59:17.000000000 +0000
@@ -80,7 +80,7 @@
 
 __IO_RW_CL__ atomic_t g_eplMasterCtrl;
 __IO_RW_CL__ uint32_t g_eplOnlineNidMap;
-
+uint32_t g_eplOfflineNidMap = 0;
 uint32_t g_eplIsCapsSwitchOn = (uint32_t)(EPL_CAPS_ALL_ON);
 
 EPL_CONF_ITEM_FILE_INFO_S g_eplBgCfgInfo[EPL_CONF_ITEM_FILE_TYPE_BUTT] =
@@ -548,7 +548,7 @@
         DBG_LogError(EPL_LOG_ID_041D, "The cluster change information is incorrect.");
         return;
     }
-
+    g_eplOfflineNidMap = clusterInfo.offlineNodeBitmap;
     atomic_set(&g_eplMasterCtrl, clusterInfo.glbMasterNid);
     atomic_set(&g_eplSwapMasterCbParam.swapStatus, EPL_SWAP_MASTER_OVER);
     memcpy(g_eplModuleSpec.arraySn, clusterInfo.productSerial, EPL_MAX_SN_LEN);
