--- ./source/private_module/ramcache/algorithm/evict/evict_lru.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/ramcache/algorithm/evict/evict_lru.c.hotpatch	2018-12-24 09:35:14.000000000 +0000
@@ -911,7 +911,7 @@
     *evictAlg = &g_evictLru;
     return;
 }
-
+bool islogzoneChunkCanEvict(void);uint64_t g_logzoneEvictNum = 0;
 /**************************************************************************
      :  
  :  
@@ -927,8 +927,7 @@
     struct list_head * firstNode = NULL;
     uint32_t errCount = 0;
     uint32_t writeLinkCount = 0;
-    int32_t ret = RETURN_ERROR;
-
+	int32_t ret = RETURN_ERROR;
     while(getListParam->getChunkNum < getListParam->needChunkNum)    
     {
         /* ΪʣҪ̭chunk4 */
@@ -936,35 +935,38 @@
         {
             break;
         }
-
         curNode = spinLockListCutFirstNodeNoLock(list);
         if (NULL == curNode)
         {
             break;
         }
-
         spinLockListAddTailNoLock(curNode, list);
         if (firstNode == curNode)
         {
             break;
         }
-
         if (NULL == firstNode)
         {
             firstNode = curNode;
         }
-
         readChunk = getReadChunkFromEvictNode(curNode);
         cacheBase = GET_CACHE_BASE_FROM_READ_CHUNK(readChunk);
-        if (RETURN_ERROR == testAndIncBaseEvictCnt(cacheBase))
-        {
-            errCount ++;
-            continue;
-        }
-
+		if (RETURN_ERROR == testAndIncBaseEvictCnt(cacheBase))
+		{
+			errCount ++;
+			continue;
+		}
+		if(IS_LOG_VOLUME_ID(cacheBase->volumeId))
+		{
+			if( !islogzoneChunkCanEvict() )
+			{
+				(void)decBaseEvictCnt(cacheBase);
+				errCount++;
+				continue;
+			}
+		}
         /* readChunk, ԤжreadChunkܷ̭ */
         lockReadChunk(readChunk);
-
         /* ݵreadChunk, ݻ̭ */
         if ((NULL != readChunk->writeChunk) && (writeLinkCount < 5))
         {
@@ -974,7 +976,6 @@
             writeLinkCount ++;
             continue;
         }
-        
         atomic_inc(&readChunk->ref);
         ret = getListParam->checkEvictConditonFunc(getListParam, readChunk);
         if (RETURN_OK != ret)
@@ -990,7 +991,6 @@
             getListParam->readChunkList[getListParam->getChunkNum ++] = readChunk;
         }
     }
-
     return;
 }
 
@@ -1305,3 +1305,58 @@
 
 
 
+void getControllerVolQuotaUsed(int *usedCnt, PARTITION_QUOTA_TYPE_E quotaType)
+{
+    uint16_t i;
+    int32_t usedQuotaCnt = 0;
+    int32_t usedTmp = 0;
+    for (i = 0; i < INNER_CACHE_PTT_NUM_IN_PAIR; i++)
+    {
+        if (B_FALSE == isPartitonCreatedInCache((uint16_t)i))
+        {
+            continue;
+        }
+        GET_PARTITION_QUOTA_USED_CNT(i, quotaType, &usedTmp);
+        usedQuotaCnt += usedTmp;
+        usedTmp = 0;
+    }
+    *usedCnt = usedQuotaCnt;
+    return;
+}
+
+void getControllerStpQuotaUsed(int *usedCnt, PARTITION_QUOTA_TYPE_E quotaType)
+{
+    int32_t usedQuotaCnt = 0;
+    GET_PARTITION_QUOTA_USED_CNT(0, quotaType, &usedQuotaCnt);
+    *usedCnt = usedQuotaCnt;
+    return;
+}
+
+extern bool g_isPowerOnOver;
+extern uint32_t getPageUsage(void);
+bool islogzoneChunkCanEvict(void)
+{
+    int32_t volDirtyCnt = 0;
+    int32_t stpDataDirtyCnt = 0;
+	bool isDirtyPageUsed = TRUE;
+	uint32_t pageUsage = 0;
+	
+	if( g_isPowerOnOver != TRUE )
+	{
+	    return TRUE;
+	}
+	
+	getControllerVolQuotaUsed(&volDirtyCnt, QUOTA_TYPE_VOL_DIRTY);
+	getControllerStpQuotaUsed(&stpDataDirtyCnt, QUOTA_TYPE_STP_HDD_DIRTY);
+	isDirtyPageUsed = (volDirtyCnt != 0 || stpDataDirtyCnt != 0 );
+	
+	pageUsage = getPageUsage();
+	
+	if( !isDirtyPageUsed && pageUsage >= 94 )
+	{
+		g_logzoneEvictNum++;
+		return TRUE;
+	}
+	
+    return FALSE;
+}
--- ./source/private_module/ramcache/debug/diagnose/diagnose_cache_obj.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/ramcache/debug/diagnose/diagnose_cache_obj.c.hotpatch	2018-12-24 09:35:14.000000000 +0000
@@ -5134,7 +5134,7 @@
     return RETURN_OK;
 }
 
-
+extern uint64_t g_logzoneEvictNum;
 /**************************************************************************
      :  ʾcache globalϢ
  :  argc: argvԪظ
@@ -5179,11 +5179,11 @@
     DBG_Print("Async Prefetch Cur Req Concur   : %d\n", atomic_read(&g_asyncPrefetchReqConcurrent));
     DBG_Print("Cache update state              : %d\n", getUpdateState());
     DBG_Print("Cache force write back type     : %d\n", g_forceWriteBackType);
-
     DBG_Print("VNode 0 mirror nid              : %d\n", getVNodeMirrorCtrl(0));
     DBG_Print("VNode 1 mirror nid              : %d\n", getVNodeMirrorCtrl(1));
     DBG_Print("VNode 2 mirror nid              : %d\n", getVNodeMirrorCtrl(2));
     DBG_Print("VNode 3 mirror nid              : %d\n", getVNodeMirrorCtrl(3));
+	DBG_Print("g_logzoneEvictNum               : %llu.\n", g_logzoneEvictNum);
     return RETURN_OK;
 }
 int32_t diagShowCacheLimitIo(int32_t argc, char *argv[])
