--- ./source/private_module/pmgr/pmgr_debug.c	2018-04-20 08:53:49.000000000 +0000
+++ ./source/private_module/pmgr/pmgr_debug.c.hotpatch	2019-05-06 10:06:27.000000000 +0000
@@ -104,7 +104,7 @@
     }
 };
 /* DTS2014061905191йĵ ,diagnoseֲCLI, s00250140, 20140804, end */
-
+bool checkCanStartHardReconAndDelTask(diskid_t diskId);
 /*****************************************************************/
 /*ontrackŵĩβ*/
 struct list_head  g_pmgrDbgOpsList;
@@ -4068,7 +4068,6 @@
     PMGR_OBJ_S *poolObj = NULL;
     bool tempResult;
     PMGR_HARD_RECON_PARAMS pmgrHardReconParams;
-
     /* ȡ·Ϣ */    
     getPmgrMustItemUnsigned(msgObj,
                            TLV_FIRST_RECORD_ID,
@@ -4102,7 +4101,6 @@
         DBG_LogError(PMGR_LOG_ID3405, "Check start recon task params failed.");
         return ret; 
     }
-
     poolObj = getPoolObj(poolId);
     spin_lock(&poolObj->poolObjLock);
     if (poolId != poolObj->diskPoolCfgPara.diskPoolId)   
@@ -4115,7 +4113,6 @@
         DBG_LogError(PMGR_LOG_ID3406, "This pool(%u) object does not exist in system.", poolId);
         return RETURN_DISK_POOL_ID_NOT_EXIST;
     }
-   
     /* ǹ */
     if (!poolObj->isPoolWorkNode)
     {
@@ -4127,11 +4124,9 @@
         DBG_LogError(PMGR_LOG_ID3407, "The command does not execute on not pool(%u) is work node.", poolId);
         return RETURN_NOT_ON_DISK_POOL_WORK_NODE;
     }
-
     /* ѯ״̬ */
     healthStatus = getPoolHealthStatus(poolObj);
     spin_unlock(&poolObj->poolObjLock);
-
     /* ֻpool״̬ʱִǿع */
     tempResult = (HEALTH_STATUS_NORMAL == healthStatus) || (HEALTH_STATUS_FAULT == healthStatus);
     if (tempResult)
@@ -4143,7 +4138,6 @@
         DBG_LogError(PMGR_LOG_ID3408, "The command can not execute on pool(%u) which status is normal or fault.", poolId);
         return RETURN_POOL_STATUS_IS_NO_DEGRADED; 
     }
-    
     /* ѯ߼״̬ */
     logicDiskInfo.state = 0;
     ret = ldGetLogicDiskInfo(diskId, &logicDiskInfo);
@@ -4196,7 +4190,13 @@
     /* ѯdiskڵdg */
     dgId = diskInfo->dgId;
     spin_unlock(&diskInfo->diskLock);
-
+    if (!checkCanStartHardReconAndDelTask(diskId)){
+        (void)ALM_SendAlarmEx(MY_PID, ALM_LOG_START_HARD_RECON_TASK_FAIL, ALM_TYPE_OPERATION,
+                              "%u, %u, %u", userSession, poolId, diskId);
+        DBG_LogError(PMGR_LOG_ID3411, "The command can not execute on logic disk(%u) which is exsit in task list"
+                  " and task state is not PMGR_TASK_ERROR.", diskId);
+        return RETURN_SYSTEM_INNER_ERROR;
+    }
     ret = startHardReconTask(poolId, dgId, diskId);
      
     if (RETURN_OK == ret) 
@@ -4617,3 +4617,59 @@
     return;
 }
 
+extern spinlock_t g_taskRcdListLockArray[TASK_LIST_BUTT];
+extern struct list_head g_taskRcdListArray[TASK_LIST_BUTT];
+extern uint32_t g_taskRcdPoolId;
+extern void sendPmgrPostMsg2Peer(poolid_t poolId, uint32_t opCode, void *data,
+                          uint32_t dataLength, void *context);
+
+/* жǷ̵ָûУֱӷؿԽǿعУҪж̵״̬ΪPMGR_TASK_ERROR
+ܽǿعҪɾе */
+bool checkCanStartHardReconAndDelTask(diskid_t diskId)
+{
+    struct list_head *pos = NULL; 
+    struct list_head *next = NULL;
+    TASK_RECORD_S *taskRecord = NULL;
+    
+    spin_lock(&g_taskRcdListLockArray[TASK_LIST_DISKRECON]);
+    list_for_each_safe(pos, next, &g_taskRcdListArray[TASK_LIST_DISKRECON])
+    {
+        taskRecord = list_entry(pos, TASK_RECORD_S, list);
+        if ((diskId == taskRecord->diskId))
+        {
+            /* д̵ָع񣬵ع״̬ΪPMGR_TASK_ERRORִǿع */
+            if (PMGR_TASK_ERROR == taskRecord->taskState)
+            {
+                /* ɾϵ󣬲ִǿع */
+                /* ǰ˫أ֪ͨԶ */
+                if (hasOtherNodeInChassis())
+                {        
+                    /* ͿϢִ֪ͨеɾӦĽڵ */
+                    sendPmgrPostMsg2Peer(taskRecord->poolId, MSG_PMGR_CODE_DEL_TASK_NODE,
+                                         taskRecord, sizeof(TASK_RECORD_S), NULL);
+                }
+                
+                list_del(&taskRecord->list);
+                spin_unlock(&g_taskRcdListLockArray[TASK_LIST_DISKRECON]);
+                FREE_STRUCTURE(taskRecord, g_taskRcdPoolId);
+
+                DBG_LogInfo(NO_LOGID, "task record state is PMGR_TASK_ERROR, can exec force recon, diskId(%u), state(%d)", 
+                            diskId, taskRecord->taskState);
+                return TRUE;
+            }
+            else
+            {
+                spin_unlock(&g_taskRcdListLockArray[TASK_LIST_DISKRECON]);
+                DBG_LogError(NO_LOGID, "task record state is not PMGR_TASK_ERROR, can't exec force recon, diskId(%u), state(%d)", 
+                            diskId, taskRecord->taskState);
+                return FALSE;
+            }
+        }
+    }
+    spin_unlock(&g_taskRcdListLockArray[TASK_LIST_DISKRECON]);
+
+    /* в̵ָع񣬷ִǿع */
+    DBG_LogInfo(NO_LOGID, "There is no task in task list, can exec force recon, diskId(%u).", diskId);
+    return TRUE;
+}
+
--- ./source/private_module/pmgr/pmgr_task_mgr.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/pmgr/pmgr_task_mgr.c.hotpatch	2019-05-06 10:06:27.000000000 +0000
@@ -3051,7 +3051,6 @@
     /* Modified by w90004114 for PANGEA DMI 2014/3/24 begin */
     PMGR_FRAME_INFO_S frameInfo = {0};
     /* Modified by w90004114 for PANGEA DMI 2014/3/24 end */
-    
     ehTask = (PMGR_EH_TASK *)task;
     memcpy(&newTaskRcd, ehTask->taskRcd, sizeof(TASK_RECORD_S));
     //newTaskRcd = ehTask->taskRcd;
@@ -3064,7 +3063,6 @@
                      newTaskRcd.poolId);
         return ret;  
     }
-
     /* ߼Ϣṹȡֶ */
     CLEAR_LD_INFO_SEGMENT(diskInfo);
 
@@ -3092,7 +3090,9 @@
         /* ָ֪̻ͨ */
         reportDiskRecovery(newTaskRcd.poolId, newTaskRcd.diskId);
     }
-    
+    if (DISK_RECON == newTaskRcd.taskType) {
+        modifyAndSyncSoftReconFlagOfDisk(newTaskRcd.poolId, newTaskRcd.diskId, FALSE);
+    }
     ret = startRelocTask(ehTask->taskRcd);
     if (RETURN_OK != ret)
     {
@@ -3707,7 +3707,7 @@
         DBG_LogInfo(PMGR_LOG_ID0764, "Execute soft reconstruct task(task id 0x%llx, pool %u, "
                     "disk %u, task name %s) succeeded.", taskRcd->taskId, 
                     taskRcd->poolId, taskRcd->diskId, getTaskName(taskRcd->taskType));
-
+        ehTask->pad1 = 0x56;
         fillSoftReconSucceedTaskStep((TASK_S *)ehTask);
     }
     else
@@ -4471,7 +4471,7 @@
     
     ehTask = (PMGR_EH_TASK *)task;
     taskRcd = ehTask->taskRcd;  
-
+    if (0x56 == ehTask->pad1) {return deleteRunningTaskRcd(task);}
     /* ֹtaskRcd Ƴ¼ͷ */
     taskId = taskRcd->taskId;
     poolId = taskRcd->poolId;
