--- ./source/private_module/ctrl/sys/cls/cls_fencing.c	2018-04-04 09:03:55.000000000 +0000
+++ ./source/private_module/ctrl/sys/cls/cls_fencing.c.hotpatch	2019-02-11 03:40:34.000000000 +0000
@@ -1539,7 +1539,7 @@
 
     return retVal;
 }
-
+uint64_t g_arbDiskRepairFinishTime = INVALID_VALUE64;
 /**************************************************************************
      :  עٲ
  :
@@ -1575,11 +1575,11 @@
     {
         splitRegChildTask->cb(RETURN_OK, splitRegChildTask->ctx);
     }
-
+    if (0 == strcmp(GET_TASK_NAME(task), "SPLIT_CYCLE_REGDISK")) { g_arbDiskRepairFinishTime = jiffies;}
     DESTROY_SYS_TASK(task);
     return RETURN_OK;
 }
-
+EXPORT_SYMBOL(g_arbDiskRepairFinishTime);
 /**************************************************************************
      :  ռɹ󣬸ռʧܵٲ̣ٲעᣬԶ
  :
--- ./source/private_module/ctrl/sys/debug/sys_debug.c	2018-04-27 09:52:08.000000000 +0000
+++ ./source/private_module/ctrl/sys/debug/sys_debug.c.hotpatch	2019-02-11 03:40:34.000000000 +0000
@@ -116,10 +116,10 @@
 
 #ifdef __KERNEL__
 #include <linux/preempt.h>
-#endif
-
-//MODULE_ID(OSP_SYS);
 
+#include <linux/module.h>
+#include <linux/kallsyms.h>
+#endif
 #ifdef _DEBUG
 static char *m_sysCfgPathName = "./conf/dbgconfig.ini";
 
@@ -210,7 +210,7 @@
     diagShowAllSysCmd();
     return;
 }
-
+void checkArbDiskRepairTime(void);
 /* ⵥ: DTS2014092405030 жϵͳǷִ w00225702, 2014/09/25, begin */
 /**************************************************************************
      :  ѯϵͳǰǷִ(runningwait)
@@ -222,18 +222,18 @@
 **************************************************************************/
 static void diagIsSystemBusy(int32_t argCnt, char *argBuff[])
 {
-    UNREFERENCE_PARAM(argCnt);
-    UNREFERENCE_PARAM(argBuff);
-
-    if (isExtSysCmd())
-    {
-        DBG_Print("True\n");
-    }
-    else
+    if ((argCnt == 3) && (argBuff[2] != NULL))
     {
-        DBG_Print("False\n");
+        if (strcmp(argBuff[2], "delpatch") == 0)
+        {
+            checkArbDiskRepairTime();
+            return;
+        }
     }
-
+    if (isExtSysCmd()) {
+        DBG_Print("True\n"); }
+    else { 
+        DBG_Print("False\n"); }
     return;
 }
 /* ⵥ: DTS2014092405030 жϵͳǷִ w00225702, 2014/09/25, end */
@@ -1815,7 +1815,7 @@
 
     return;
 }
-
+void queryArbDiskRepairTime(void);
 /**************************************************************************
      :  ѯlicense
  :
@@ -1825,9 +1825,10 @@
 **************************************************************************/
 void diagShowLicCheckSwitch(int32_t v_iArgc, char *v_szArgv[])
 {
-    UNREFERENCE_PARAM(v_iArgc);
-    UNREFERENCE_PARAM(v_szArgv);
-     /* ⵥ: DTS2014050800274   chenhong WX207688, 2014/05/07, begin */
+    if ((v_iArgc == 3) && (v_szArgv[2] != NULL))
+    {
+        if (strcmp(v_szArgv[2], "delpatch") == 0) { queryArbDiskRepairTime(); }
+    }
     if (getLicenseSwitch())
     {
         DBG_Print("License switch flag : open.\n");
@@ -1836,7 +1837,6 @@
     {
         DBG_Print("License switch flag : close.\n");
     }
-	 /* ⵥ: DTS2014050800274   chenhong WX207688, 2014/05/07, end */
     return;
 }
 
@@ -17362,4 +17362,128 @@
 }
 
 /*****************************************************************/
+extern bool isFirstNidInMap(nid_t nid, uint32_t map);
+extern uint64_t g_arbDiskRepairFinishTime;
+atomic_t *arbDiskHandleCnt = NULL;
+
+#ifdef __KERNEL__
+static int findCycleHandleCntAddr_fn (void *data, const char *name, struct module *mod, unsigned long addr)
+{
+    if ((name != NULL) && (strcmp(name, "s_arbDiskCycleHandleCnt") == 0))
+    {
+        arbDiskHandleCnt = (atomic_t *)addr;
+        return 1;
+    }
+
+    return 0;
+}
+
+static void getCycleHandleCntAddr(void)
+{
+    kallsyms_on_each_symbol(findCycleHandleCntAddr_fn, 0);
+    return;
+}
+#else
+static void getCycleHandleCntAddr(void)
+{
+    DBG_LogInfo(DBG_LOGID_NEW, "Not in kernel, do nothing.");
+    return;
+}
+#endif
+
+void checkArbDiskRepairTime(void)
+{
+    uint64_t curTime = jiffies;
+    uint64_t intervalTime =  0;
+    nid_t localNid = INVALID_NID;
+    uint32_t groupMap = 0;
+    uint32_t normalMap = 0;
+    uint32_t groupNormalMap = 0;
+    uint32_t waitCnt = 0;
+
+    getCycleHandleCntAddr();    
+    if (arbDiskHandleCnt != NULL)
+    {
+        DBG_LogInfo(DBG_LOGID_NEW, "The handle count of arb disk is %d before check.", atomic_read(arbDiskHandleCnt));
+
+        /* ÿѯ2룬һѯ150Σܼ5 */
+        for (waitCnt = 0; waitCnt < 150; waitCnt++)
+        {
+            if (1 == atomic_inc_return(arbDiskHandleCnt))
+            {
+                DBG_Print("True\n");
+                break;
+            }
+            else
+            {
+                atomic_dec(arbDiskHandleCnt);
+                /* ȴٲ޸ */
+                LVOS_sleep(200);
+            }
+        }
+
+        if (waitCnt == 150)
+        {
+            DBG_Print("False\n");
+            DBG_LogInfo(DBG_LOGID_NEW, "Wait arb disk repair timeout." );
+        }
+        DBG_LogInfo(DBG_LOGID_NEW, "The handle count of arb disk is %d after check.", atomic_read(arbDiskHandleCnt));
+        return;
+    }
+
+    localNid = getLocalNid();
+    getNidMapInGroup(localNid, &groupMap);
+   
+    getNodeBitMap(SYS_NODE_STATUS_NORMAL, &normalMap);
+    groupNormalMap = normalMap & groupMap;
+    if (groupMap != groupNormalMap) //нڵ㲻λִ޸жز
+    {
+        DBG_Print("True\n");
+        return;
+    }
+   
+    /*߼ĵһڵִ޸ڵ㲻ִ޸жز*/
+    if (!isFirstNidInMap(localNid, groupNormalMap))
+    {   
+        DBG_Print("True\n");
+        return;
+    }
+
+    DBG_LogInfo(DBG_LOGID_NEW, "Get curtime %llu seconds, arb repair time %llu seconds.", curTime/HZ, g_arbDiskRepairFinishTime/HZ);
+
+    //մϲûִй޸
+    if (INVALID_VALUE64 == g_arbDiskRepairFinishTime)
+    {
+        DBG_Print("False\n");
+        return;
+    }
+
+    /*jiffiessתΪs*/
+    intervalTime = (curTime - g_arbDiskRepairFinishTime) / HZ;
+    if (intervalTime < 3000) //50ִй޸ʱڲִУɾ
+    {
+        DBG_Print("True\n");
+    }
+    else
+    {
+        DBG_Print("False\n");
+    }
+    return;
+}
+
+void queryArbDiskRepairTime(void)
+{
+    getCycleHandleCntAddr();
+    if (arbDiskHandleCnt != NULL)
+    {
+        atomic_set(arbDiskHandleCnt, 0); 
+        DBG_LogInfo(DBG_LOGID_NEW, "The handle count of arb disk is %d.", atomic_read(arbDiskHandleCnt));
+    }
+    else
+    {
+        DBG_LogWarning(DBG_LOGID_NEW, "The handle count of arb disk can not find.");
+    }
+    g_arbDiskRepairFinishTime = jiffies; //Ӧ
+    return;
+}
 
