--- ./source/private_module/lun_ctrl/master_agent/obj_lun_cfg.c	2018-04-21 09:08:09.000000000 +0000
+++ ./source/private_module/lun_ctrl/master_agent/obj_lun_cfg.c.hotpatch	2019-05-18 10:25:54.000000000 +0000
@@ -190,7 +190,7 @@
 /*SR-0000253011-016, , rowlunִ֧򿪹رֵ, w00251485, 2016/08/15, begin*/
 int32_t  delChildLunDB(void *dbHandle, lunid_t lunId);
 /*SR-0000253011-016, , rowlunִ֧򿪹رֵ, w00251485, 2016/08/15, end*/
-
+bool g_lunPreExpandFlag = FALSE;
 /*****************************************************************/
 
 /**************************************************************************
@@ -8575,7 +8575,7 @@
     SET_FLOW_ACTION_TRACE_STEP(expandLunTaskTmp->flowId, task);
 
     flowHandle = expandLunTaskTmp->flowHandle;
-
+    g_lunPreExpandFlag = FALSE;//ɺ󣬽ʼΪ0
     /* TaskִнϢ */
     result = GET_TASK_RESULT(task);
     if (RETURN_OK != result)
@@ -8770,50 +8770,50 @@
     TASK_CALL_ACTION_DONE_ASYNC_WITH_RESULT(task, retVal);
     return RETURN_OK;
 }
-
-/**************************************************************************
-     :  ڵ֪ͨDEV LUN
- :  task:           LUNݵTASK
- :  
- ֵ  :  RETURN_OK    -- ACTIONִгɹ
-            RETURN_ERROR -- ACTIONִʧ
-     :  
-**************************************************************************/
+int32_t getLunExpandCapacityBeforeCorrect(lunid_t lunId, uint64_t *userLunCapacity);
 static int32_t expandLunCapacity(TASK_S* task)
 {
     OBJ_EXPAND_LUN_TASK_S  *expandLunTaskTmp = NULL;
+    uint64_t userLunCapacity;
+    int32_t result = RETURN_OK;
 
     DBG_ASSERT(NULL != task);
-
     expandLunTaskTmp = (OBJ_EXPAND_LUN_TASK_S  *)task;
-
-    /* ӴӡϢ */
+    userLunCapacity = expandLunTaskTmp->userLunCapacity;
     SET_FLOW_ACTION_TRACE_STEP(expandLunTaskTmp->flowId, task);
-
-    /* ôΪ1 */
     SET_ACTION_CHILDNUM(task, 1);
 
+    if (g_lunPreExpandFlag)
+    {
+        g_lunPreExpandFlag = FALSE;
+
+        result = getLunExpandCapacityBeforeCorrect(expandLunTaskTmp->lunId, &userLunCapacity);
+        if (RETURN_OK != result)
+        {
+            DBG_LogError(0, "OBJ_LUN: LUN(ID %u) enter expand step 1 faled, capacity %llu.",
+                expandLunTaskTmp->lunId, userLunCapacity);
+
+            TASK_CALL_ACTION_CHILDDONE(task, RETURN_ERROR);
+            return RETURN_OK;
+        }
+
+        DBG_LogInfo(0, "OBJ_LUN: LUN(ID %u) enter expand step 1, capacity %llu.",
+            expandLunTaskTmp->lunId, userLunCapacity);
+    }
+    else
+    {
+        DBG_LogInfo(0, "OBJ_LUN: LUN(ID %u) enter expand step 2, capacity %llu.",
+            expandLunTaskTmp->lunId, userLunCapacity);
+    }
     startHandleSingleLunRpcTask(SYS_RPC_OBJ_EXPAND_LUN_CAPACITY,
                                 expandLunTaskTmp->lunId,
                                 expandLunTaskTmp->bitMap,
-                                expandLunTaskTmp->userLunCapacity,
+                                userLunCapacity,
                                 task);
-
-    /* ֪ͨDEVLUNݣȺλ */
     LVOS_TP_NOPARAM_START(EXPAND_LUN_1_47_1)
     LVOS_TP_END
-
     return RETURN_OK;
 }
-
-/**************************************************************************
-     :  LUNʱͷLUN
- :  task:           LUNݵTASK
- :  
- ֵ  :  RETURN_OK    -- ACTIONִгɹ
-            RETURN_ERROR -- ACTIONִʧ
-     :  
-**************************************************************************/
 static int32_t expandLunFreeLunLock(TASK_S* task)
 {
     OBJ_EXPAND_LUN_TASK_S  *expandLunTaskTmp = NULL;
@@ -8924,9 +8924,9 @@
     task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_TASK_OVER;
     /* DTS2015031910236  lunԪ޸ z00285285 2015.1.29 begin*/
     task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_CHECK_STATUS;
-    /* DTS2015031910236  lunԪ޸ z00285285 2015.1.29 end*/
-    task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_APPLAY_LUN_LOCK;
-    task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_CORRECT;    
+    task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_APPLAY_LUN_LOCK;    
+    task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_CAPACITY;//
+    task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_CORRECT;
     task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_PRE_CAPACITY_DB;
     task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_CAPACITY;
     task->ActionArray[index++] = ACTION_OBJ_EXPAND_LUN_FREE_LUN_LOCK;
@@ -9032,7 +9032,7 @@
     /* û˴ */
     arraySize = ARRAY_LEN(s_lunCfgFailActionEntry);
     SET_TASK_FAIL_POLICY_TABLE(baseTask, s_lunCfgFailActionEntry, arraySize);
-
+    g_lunPreExpandFlag = TRUE;//ҪǰݣǴеĸֵʹʱڲ
     TASK_CALL_ACTION_START_ASYNC(baseTask);
     return ;
 }
@@ -20850,7 +20850,7 @@
     memset(childLunDb->lunName, 0 ,sizeof(childLunDb->lunName));
     childLunDb->relatedLunId = lunCfgInfo->lunId;
     childLunDb->storageType  = lunCfgInfo->storageType;
-
+    childLunDb->preUserLunCapacity = childLunDb->userLunCapacity;
     retVal = scsiGenerateLunWwn(lunCfgInfo->relatedLunId, lunWwn, LUN_WWN_LENGTH);
     if (RETURN_OK != retVal)
     {
@@ -22727,3 +22727,60 @@
     return;
 }
 
+int32_t getLunExpandCapacityBeforeCorrect(lunid_t lunId, uint64_t *userLunCapacity)
+{
+    uint64_t preUserLunCapacity = 0;    
+    uint64_t localNodeUserLunSize = 0;
+    uint8_t lunAllocType;
+    int32_t ret = RETURN_OK;
+
+    if (NULL == userLunCapacity)
+    {
+        return RETURN_ERROR;
+    }
+
+    ret = getLunAllocTypeIntf(lunId, &lunAllocType);
+    if (RETURN_OK != ret)
+    {
+        DBG_LogError(0, "OBJ_LUN: get LUN(ID %u) alloc type failed, ret %d.",
+             lunId, ret);
+
+        return RETURN_ERROR;
+    }
+
+    if ((LUN_ALLOC_TYPE_FAT == lunAllocType) || (LUN_ALLOC_TYPE_THIN == lunAllocType))
+    {
+        ret = getLunUserSizeIntf(lunId, &localNodeUserLunSize);
+        if (RETURN_OK != ret)
+        {
+            DBG_LogError(0, "OBJ_LUN: get LUN(ID %u) user size failed, ret %d.",
+                 lunId, ret);
+
+            return RETURN_ERROR;
+        }
+
+        ret = DB_getLunInfo(lunId, offsetof(DB_LUN_S, preUserLunCapacity),
+                            (void *)&preUserLunCapacity, ST_MEMBER_SIZE(DB_LUN_S, preUserLunCapacity));
+
+        if (unlikely(RETURN_OK != ret))
+        {
+            DBG_LogError(0, "LUN_CTRL: get LUN(ID %u) pre capacity failed.", lunId);
+            return RETURN_ERROR;
+        }
+
+        DBG_LogInfo(0, "OBJ_LUN: LUN(ID %u) preUserLunCapacity %llu, localNodeUserLunSize %llu.",
+             lunId, preUserLunCapacity, localNodeUserLunSize);
+
+        /* ȡֵ֤ǰݳɹ*/
+        preUserLunCapacity = MAX(preUserLunCapacity, localNodeUserLunSize);
+
+        DBG_LogInfo(0, "OBJ_LUN: LUN(ID %u) preUserLunCapacity %llu, userLunCapacity %llu.",
+             lunId, preUserLunCapacity, *userLunCapacity);
+
+        /* ȡСֵ֤ݳɹ*/
+        *userLunCapacity = MIN(preUserLunCapacity, *userLunCapacity);
+    }
+
+    return RETURN_OK;
+}
+
--- ./source/private_module/lun_ctrl/master_agent/obj_lun_comm.c	2018-05-08 10:42:26.000000000 +0000
+++ ./source/private_module/lun_ctrl/master_agent/obj_lun_comm.c.hotpatch	2019-05-18 10:25:54.000000000 +0000
@@ -2165,7 +2165,7 @@
 
     return RETURN_OK;
 }
-
+void getUserLunSizeFromDb(LUN_INFO_S *lunInfo, DB_LUN_S *lunDb);
 /**************************************************************************
      :  DBϢLunĲ ioclass ֶ֮
  :  lunId    LunId
@@ -2223,17 +2223,17 @@
     lunInfo->workControllerId     = INVALID_NID;
     lunInfo->ownerControllerId    = (nid_t)lunDb->owningController;
 
-    /* ֻΪ˷preUserLunCapacityֵ쳣Ϊ0 */
-    lunInfo->userLunSize =
-        (0 != lunDb->preUserLunCapacity ? lunDb->preUserLunCapacity : lunDb->userLunCapacity);
+    getUserLunSizeFromDb(lunInfo, lunDb);
+
+
+
+
+
+
+
+
+
 
-    /* ˵޸ʱпλ*/
-    if (lunDb->preUserLunCapacity != lunDb->userLunCapacity)
-    {
-        DBG_LogWarning(LOG_ID_1FA9,
-            "OBJ_FLOW: LUN(id %u) pre capacity %llu and capacity %llu is not same.",
-            lunId, lunDb->preUserLunCapacity, lunDb->userLunCapacity);
-    }
 
     lunInfo->initializedSize      = lunDb->initialAllocCapacity;
     lunInfo->homePairId           = lunDb->homePairId;
@@ -37626,4 +37626,103 @@
     return;
 }
 
+void correctLunPreCapacity(lunid_t lunId, uint64_t userLunCapacity)
+{
+    DB_HANDLE dbHandle = NULL;
+    int32_t retVal = RETURN_OK;
+
+    /* DBд*/
+    if (UPGRADE_GetAllUpgradeFlag())
+    {
+        return;
+    }
+
+    /* DBд*/
+    if (!checkLocalNodeIsGlbMasterIntf())
+    {
+        return;
+    }
+
+    dbHandle = createDbTrans();
+    if (NULL == dbHandle)
+    {
+        LUN_PRINT_LIMIT(60 * HZ, 2, DBG_LOG_ERROR, LOG_ID_152B,
+            "OBJ_LUN: correct LUN(ID %u) pre capacity failed "
+            "because create dbHandle failed.", lunId);
+        return;
+    }
+
+    retVal = DB_TransSetLunPreUserCapacity(dbHandle, lunId, userLunCapacity, TRUE);
+    if (RETURN_OK != retVal)
+    {
+        LUN_PRINT_LIMIT(60 * HZ, 2, DBG_LOG_ERROR, 0,
+            "OBJ_LUN: correct LUN(id %d) pre capacity(%llu) in db failed.",
+            lunId, userLunCapacity);
+
+        abortDbTrans(dbHandle);
+        return;
+    }
+
+    DB_LockForWrite();
+    retVal = commitDbTrans(dbHandle);
+    DB_UnLockForWrite();
+    if (RETURN_OK != retVal)
+    {
+        DBG_LogError(0,
+            "OBJ_LUN: correct LUN(id %d) pre capacity(%llu) in db failed.",
+            lunId, userLunCapacity);
+    }
+    else
+    {
+        DBG_LogInfo(0,
+            "OBJ_LUN: correct LUN(id %d) pre capacity(%llu) in db succeed.",
+            lunId, userLunCapacity);
+    }
+
+    return;
+}
+
+void getUserLunSizeFromDb(LUN_INFO_S *lunInfo, DB_LUN_S *lunDb)
+{
+    bool isExpanding = FALSE;
+
+    if ((NULL == lunInfo) || (NULL == lunDb))
+    {
+        return;
+    }
+
+    /* ѾʹDBlunDbǴDBвѯ*/
+    (void)DB_IsLunInExpanding(lunDb->lunId, &isExpanding);
+
+    if (isExpanding && (0 != lunDb->preUserLunCapacity))
+    {
+        lunInfo->userLunSize = lunDb->preUserLunCapacity;
+    }
+    else
+    {
+        lunInfo->userLunSize = lunDb->userLunCapacity;
+    }
+
+    /* ָڴֵDBֵһ£˵*/
+    if (lunInfo->userLunSize != lunDb->userLunCapacity)
+    {
+        DBG_LogWarning(LOG_ID_1FA9,
+            "OBJ_FLOW: LUN(id %u) pre capacity %llu and capacity %llu is not same.",
+            lunInfo->lunId, lunDb->preUserLunCapacity, lunDb->userLunCapacity);
+    }
+
+    /* ϰ汾ĳ޸*/
+    if (isExpanding)
+    {
+        DBG_LogWarning(LOG_ID_1FA9,
+            "OBJ_FLOW: LUN(id %u) is in expanding when node recover.", lunDb->lunId);
+    }
+    /* δݳDBֵһҪ޸ɹдӡ*/
+    else if (lunDb->preUserLunCapacity != lunDb->userLunCapacity)
+    {
+        correctLunPreCapacity(lunDb->lunId, lunDb->userLunCapacity);
+    }
+
+    return;
+}
 
--- ./source/private_module/lun_ctrl/master_agent/obj_snapshot_cfg.c	2018-04-10 08:10:16.000000000 +0000
+++ ./source/private_module/lun_ctrl/master_agent/obj_snapshot_cfg.c.hotpatch	2019-05-18 10:25:54.000000000 +0000
@@ -2149,7 +2149,7 @@
 
     return;
 }
-
+extern uint32_t g_lunPreExpandFlag;
 void modifySnapCapacityChildTask(lunid_t snapId, uint64_t userCapacity,
                                             void (*callback)(void* ctx, int32_t ret),
                                             void* ctx, void *flowHandle)
@@ -2180,7 +2180,7 @@
     baseTask = &(expandLunTaskTmp->baseTask);
     SET_TASK_NAME(baseTask, "ExpandSnapChildTask");
     SET_TASK_PRIORITY_LOW(baseTask);
-
+    g_lunPreExpandFlag = FALSE;//ͨLUṆҪʼԺ
     TASK_CALL_ACTION_START_ASYNC(baseTask);
     return;
 }
