--- ./source/private_module/pal/pal_core/pal_core_adel.c	2018-04-27 09:30:05.000000000 +0000
+++ ./source/private_module/pal/pal_core/pal_core_adel.c.hotpatch	2021-11-12 08:35:08.000000000 +0000
@@ -1756,7 +1756,7 @@
 
     return CONTEXT_PENDING;
 }
-
+extern uint64_t getBlockNumberOfLinearSpaceInstInDmn(SPC_DMN_S *dmn); 
 /**************************************************************************
      :  ضļbonus
  :  *context            
@@ -1767,50 +1767,50 @@
 PROC_STAGE STATIC int32_t dirtyTrucateBonusCheck(CONTEXT_S *context)
 {
     TRUNCATE_OBJECT_RES_S *res = (TRUNCATE_OBJECT_RES_S *)getData(context);
-    uint64_t objSize = 0;
-
-    VOLS_COUNTER_BACK_INC(VOLS_COUNTER_DIRTY_SPC_OBJECT_BONUS, VOLS_DEBUG_PAL_IO,
-                           res->dirtyBonusOut.result);
+    uint64_t objSize = 0; uint64_t itemNum = getBlockNumberOfLinearSpaceInstInDmn(res->in->vnode->dmn); uint64_t maxNormalSize = 1610612736ULL;
+    VOLS_COUNTER_BACK_INC(VOLS_COUNTER_DIRTY_SPC_OBJECT_BONUS, VOLS_DEBUG_PAL_IO, res->dirtyBonusOut.result);
     palRttEnd(context, PAL_3_TRUNC_FILE_DIRTY_BONUS);
     /*bonusʧ Ӧȥͷbonusȡ*/
-    if (unlikely(0 != res->dirtyBonusOut.result))
-    {         
-        PAL_LOG_ERROR(DBG_LOGID_NEW, "When FS(FS%u) trucate file object(ID %llu), dirty bonus fail(errcode %d).", 
-                                    res->fsId, res->in->objectId, res->dirtyBonusOut.result);   
-
+    if (unlikely(0 != res->dirtyBonusOut.result)) {         
+        PAL_LOG_ERROR(DBG_LOGID_NEW, "When FS(FS%u) trucate file object(ID %llu), dirty bonus fail(errcode %d).", res->fsId, res->in->objectId, res->dirtyBonusOut.result);   
         res->out->result = res->dirtyBonusOut.result;
         releaseSpcObjectBonusEx(res->adelSpcHandle, res->holdBonusOut.bonusBuf); 
         cancelSpcHandle(res->adelSpcHandle);
         res->adelSpcHandle = NULL;
         return CONTEXT_FINISH;
-    }
-    
+    }   
     /*bonusлȡattr*/
     res->fileAttr = WRITE_GET_VNODE(res->holdBonusOut.bonusBuf, SPC_BONUS_TYPE_VNODE);
-    if (unlikely(NULL == res->fileAttr))
-    {         
-        PAL_LOG_ERROR(DBG_LOGID_NEW, "When FS(FS%u) trucate file object(ID %llu), get vnode attr fail(errcode %d).",  
-                                    res->fsId, res->in->objectId, RETURN_ERROR);   
-
+    if (unlikely(NULL == res->fileAttr)) {         
+        PAL_LOG_ERROR(DBG_LOGID_NEW, "When FS(FS%u) trucate file object(ID %llu), get vnode attr fail(errcode %d).", res->fsId, res->in->objectId, RETURN_ERROR);   
         res->out->result = RETURN_ERROR;
         releaseSpcObjectBonusEx(res->adelSpcHandle, res->holdBonusOut.bonusBuf); 
         cancelSpcHandle(res->adelSpcHandle);
         res->adelSpcHandle = NULL;
         return CONTEXT_FINISH;
     }
-
     /* ԤļhandleдӦ־ */
-    if (IS_RESERVE_FILE(res->fileAttr))
-    {
+    if (IS_RESERVE_FILE(res->fileAttr)) {
         enableSpcHandleUsingRsvCapacity(res->adelSpcHandle, SPC_RSV_CAPACITY_VAAI);
     }
-
     objSize             = getSpcObjectSize(res->in->vnode->dmn);
-    res->fileAttr->size = MAX(res->fileAttr->size, objSize);
-
+    res->fileAttr->size = MAX(res->fileAttr->size, objSize); 
+    if (res->fileAttr->size <= res->truncSizeOneTime && (uint64_t)itemNum * res->fileAttr->blkSize > maxNormalSize) {
+        res->fileAttr->ctimeNsec = 274877906944ULL; /* ʹctimensֶΣЧȡֵΧ0999999999 */
+        res->fileAttr->size = 549755813888ULL; DBG_LogInfo(0, "Fs %u, file %llu, size %llu, cN %llu, itemNum %llu, truncSize %llu, blkSize %u.", res->fsId, res->fileAttr->id, res->fileAttr->size, res->fileAttr->ctimeNsec, itemNum, res->truncSizeOneTime, res->fileAttr->blkSize);
+    }
+    if (res->fileAttr->ctimeNsec >= 274877906944ULL) {
+        if ((uint64_t)itemNum * res->fileAttr->blkSize <= 33554432ULL || res->fileAttr->size >= 281474976710656ULL) {
+            res->fileAttr->size = res->truncSizeOneTime;
+            res->fileAttr->ctimeNsec = 0;DBG_LogInfo(0, "Fs %u, file %llu size %llu, cN %llu, itemNum %llu, truncSize %llu, blkSize %u.", res->fsId, res->fileAttr->id, res->fileAttr->size, res->fileAttr->ctimeNsec, itemNum, res->truncSizeOneTime, res->fileAttr->blkSize);
+        } else if (res->fileAttr->size <= res->fileAttr->ctimeNsec) {
+            res->fileAttr->ctimeNsec = res->fileAttr->ctimeNsec + 274877906944ULL;
+            res->fileAttr->size      = res->fileAttr->ctimeNsec + 274877906944ULL;
+            DBG_LogInfo(0, "Fs %u, file %llu size %llu, cN %llu, itemNum %llu, truncSize %llu, blkSize %u.", res->fsId, res->fileAttr->id, res->fileAttr->size, res->fileAttr->ctimeNsec, itemNum, res->truncSizeOneTime, res->fileAttr->blkSize);
+        }
+    }
     /*Ƚļsizeضϳɹ˴νضϵĴСȥ*/
-    res->oldFileSize = res->fileAttr->size;
-    
+    res->oldFileSize = res->fileAttr->size;  
     return CONTEXT_CONTINUE;
 }
 
@@ -3830,7 +3830,7 @@
 PROC_STAGE STATIC int32_t holdOneFileVnodeCheck(CONTEXT_S *context)
 {
     CORE_ADEL_RES_S *res = (CORE_ADEL_RES_S *)getData(context);
-
+    uint64_t itemNum = getBlockNumberOfLinearSpaceInstInDmn(res->holdVnodeOutput.vnode->dmn);
     palRttEnd(context, PAL_2_HOLD_ONE_FILE_VNODE);
     /*holdvnodeʧ*/
     if (unlikely(RETURN_OK != res->holdVnodeOutput.result))
@@ -3867,8 +3867,8 @@
     /*ļsize0˵ǰѾضϣҪٽض*/
     /*Ϊضϳsizeһµ⡣FIX:DTS2018042409838*/
     if (res->holdVnodeOutput.vnodeAttr->size == getSpcObjectSize(res->holdVnodeOutput.vnode->dmn)
-        && 0 == res->holdVnodeOutput.vnodeAttr->size)
-    {
+        && 0 == res->holdVnodeOutput.vnodeAttr->size && (uint64_t)itemNum * res->holdVnodeOutput.vnodeAttr->blkSize < 1610612736ULL)
+    { 
         PAL_LOG_DEBUG(DBG_LOGID_NEW, "Module(Async Del) fileSize is zero, or already be trucated to zero"
                                     "(fsid : %u)", res->fsId); 
         gotoStep(context, RELEASE_FILE_OBJECT);  /* releaseFileObject */
--- ./source/private_module/pal/pal_core/pal_core_remove.c	2018-04-27 09:30:05.000000000 +0000
+++ ./source/private_module/pal/pal_core/pal_core_remove.c.hotpatch	2021-11-12 08:35:08.000000000 +0000
@@ -2681,7 +2681,7 @@
  
     return CONTEXT_CONTINUE;
 }
-
+extern uint64_t getBlockNumberOfLinearSpaceInstInDmn(SPC_DMN_S *dmn);
 void removeRangLockCb(void* context, int32_t result)
 {
     CORE_REMOVE_RES_S* res = (CORE_REMOVE_RES_S*)getData(context);
@@ -2703,14 +2703,14 @@
 PROC_STAGE STATIC int32_t removeObjRangLock(CONTEXT_S* context)
 {
     CORE_REMOVE_RES_S* res = (CORE_REMOVE_RES_S*)getData(context);
-
+    uint64_t itemNum       = getBlockNumberOfLinearSpaceInstInDmn(res->objVnode->dmn);
     /* Ӳһɾ */
 
     /* Ŀ¼Ķֱͬɾ */
     if (!CORE_S_ISDIR(res->objMode))
     {
         /* ں̨첽СļǴļ(>2MB)ȻҪ첽ɾ */  
-        if (isNeedTruncate(res->vnodeAttr.flags, res->fai)
+        if (isNeedTruncate(res->vnodeAttr.flags, res->fai) || ((uint64_t)itemNum * res->vnodeAttr.blkSize > 1610612736ULL)
                     || (res->objSize > ((uint64_t)res->fai->fsConfig.bgrFileSize << 10)))  /* bgrFileSizeλΪKBתB */
         {
             DBG_LogDebug(DBG_LOGID_NEW, 
