--- ./source/private_module/grain/control/allocctrl/gangallocalg/grain_gangio.c	2018-02-09 21:47:03.000000000 +0800
+++ ./source/private_module/grain/control/allocctrl/gangallocalg/grain_gangio.c.hotpatch	2018-07-11 15:53:15.000000000 +0800
@@ -1665,7 +1665,7 @@
         return;
     }
 }
-
+int32_t checkMgtGangLength(GANG_META_S *gangMgtNode, uint32_t srcLen);
 static void readMgtChildDone(REQ_S *selfReq, REQ_S *childReq)
 {
     GANG_MGT_REQ_PRIVATE_INFO_S *gangMgtPriInfo = NULL;
@@ -1710,17 +1710,14 @@
         return;
     }
 
-    /*
-     * ڴ,У鼰涼õ
-     */
+
+    /* ڴ,У鼰涼õ*/
     gangMgtNode = (GANG_META_S *)allocGangMeta();
     if (unlikely(NULL == gangMgtNode))
     {
         GRAIN_LIMIT_PRINT_ERROR(DBG_LOGID_GRAIN, "Alloc memory failed.volumeId(0x%llx).", selfReq->volumeId);
 
-        /*
-         * ͷŶmgt
-         */
+        /*  ͷŶmgt  */
         freeGangSgl(volId, volId, readedSgl, PAGE_USAGE_FS_GRAIN_READ_RELEASE);
 
         selfReq->sgl    = NULL;
@@ -1734,37 +1731,40 @@
         GRAIN_LIMIT_PRINT_WARNING(DBG_LOGID_GRAIN, "The read mgt data (offset %u) must be zero.", offset);
     }
 
-    /*
-     * mgtcopybuf
-     */
+    /*mgtcopybuf*/
     ret = copyDataFromSglToBufferIgnoreDif(readedSgl, offset, (char *)gangMgtNode, (OSP_U32)sizeof(GANG_META_S));
     if (unlikely(RETURN_OK != ret))
     {
         GRAIN_LIMIT_PRINT_ERROR(DBG_LOGID_GRAIN, "Gang log io Copy data from sgl to buffer failed, volumeId(0x%llx), ret(0x%x).",
                                                   selfReq->volumeId, ret);
-
         freeGangSgl(volId, volId, readedSgl, PAGE_USAGE_FS_GRAIN_READ_RELEASE);
         freeGangMeta(gangMgtNode);
-
         selfReq->sgl    = NULL;
         selfReq->result = ret;
         IOD_ADD_DONEQ(selfReq);
         return;
     }
-
-    /*
-     * gang mgtϢ
-     */
+    /* ݳ */   
+    ret = checkMgtGangLength(gangMgtNode, gangMgtPriInfo->srcbpLen);
+	LVOS_TP_START(LOAD_2_GRAIN_3, &ret);
+	LVOS_TP_END;   
+    if (unlikely(RETURN_OK != ret))
+    {
+    
+        GRAIN_LIMIT_PRINT_ERROR(DBG_LOGID_GRAIN, "Gang num does not match, volumeId(0x%llx), srcGangLen(%u).",
+                                               selfReq->volumeId, gangMgtPriInfo->srcbpLen);             
+        freeGangSgl(volId, volId, readedSgl, PAGE_USAGE_FS_GRAIN_READ_RELEASE);       
+        freeGangMeta(gangMgtNode);    
+        selfReq->sgl    = NULL;
+        selfReq->result = RETURN_SPACE_ECKSUM;
+        IOD_ADD_DONEQ(selfReq);
+        return;   
+    }
+    /*gang mgtϢ*/
     gangMgtPriInfo->gangMgt = gangMgtNode;
-
-    /*
-     * Ѿmgtݱ, ͷŶgangMgtsgl
-     */
+    /*Ѿmgtݱ, ͷŶgangMgtsgl*/
     freeGangSgl(volId, volId, readedSgl, PAGE_USAGE_FS_GRAIN_READ_RELEASE);
-
-    /*
-     * µsgl׼նgang, 첽,, callbackµ
-     */
+    /*µsgl׼նgang, 첽,, callbackµ*/
     GRAIN_IO_COUNTER_START(GRAIN_IO_ALLOC_GANG_DATA_PAGE, selfReq->opCode);
 
     allocGangSglAsyn(selfReq, gangMgtNode, grmdAllocPageCB, selfReq);
@@ -2058,7 +2058,10 @@
     ckSwitch = getCheckGangBlockSwitch(grainCkFlg, gangMgtPriInfo->ioType, cksmFlag, gangMgtPriInfo->grainObj->gangSubBlockCrcSwitch);
     if (ckSwitch)
     {
-        if (RETURN_OK == testBlockBitMap(0, gangMgtPriInfo->srcbpLen, support2KB, &gangMgtPriInfo->blockBitMap))
+        ret = testBlockBitMap(0, gangMgtPriInfo->srcbpLen, support2KB, &gangMgtPriInfo->blockBitMap);
+		LVOS_TP_START(LOAD_2_GRAIN_4, &ret);
+    	LVOS_TP_END;
+		if (RETURN_OK == ret)
         {
             /* gangУʧܹע */
             LVOS_TP_START(GRAIN_GANGBIGBLOCK_CRC_FAIL, &ret)
@@ -2066,7 +2069,6 @@
                                       req, gangMgtPriInfo->srcbpLen, 
                                       (SPACE_CRC_TYPE_E)gangMgtPriInfo->crcType);
             LVOS_TP_END
-
             /* У */
             if (unlikely(RETURN_OK != ret))
             {
@@ -2102,13 +2104,16 @@
             GRAIN_LIMIT_PRINT_ERROR(DBG_LOGID_GRAIN,"read gang faild. need cksum.");
             freeGangSgl(req->volumeId, req->volumeId, req->sgl, PAGE_USAGE_FS_GRAIN_WRITE);
             req->sgl    = NULL;
-            ret         = req->result;
+            ret         = (RETURN_OK != req->result) ? req->result : RETURN_SPACE_ECKSUM;
         }
     }
     /*У鿪û,Ƿȡɹ*/
     else
     {
-        if (RETURN_OK == testBlockBitMap(off, len, support2KB, &gangMgtPriInfo->blockBitMap))
+        ret = testBlockBitMap(off, len, support2KB, &gangMgtPriInfo->blockBitMap);
+		LVOS_TP_START(LOAD_2_GRAIN_4, &ret);
+    	LVOS_TP_END;
+		if (RETURN_OK == ret)
         {
             /* ǲС,ֻʵʴС*/
             if (len != gangMgtPriInfo->srcbpLen)
@@ -2117,8 +2122,7 @@
                 GRAIN_DBG_LOG_PRT(GRAIN_DBG_IO_FLOW, "ReadBlockGang: read ok,don't cksum, real_len:%u, "
                                                      "real_off:%u, bp_len:%u.",
                                                      len, off, gangMgtPriInfo->srcbpLen);
-#endif
-                
+#endif               
                 allocGangBlocksSglAsyn(req, allocGangBlocksSglCB, req);
                 return RETURN_OK;
             }
@@ -2128,16 +2132,12 @@
             GRAIN_LIMIT_PRINT_ERROR(DBG_LOGID_GRAIN,"read gang faild. no need cksum.");
             freeGangSgl(req->volumeId, req->volumeId, req->sgl, PAGE_USAGE_FS_GRAIN_WRITE);
             req->sgl    = NULL;
-            ret         = req->result;
+            ret         = (RETURN_OK != req->result) ? req->result : RETURN_SPACE_ECKSUM;
         }
     }
-
     GRAIN_IO_COUNTER_BACK(GRAIN_IO_COUNTER_GANG_IO, req->opCode, req->result);
-
     req->result = getResultToSpace(ret);
-
     GRAIN_RETURN_REQ(req->parent, req);
-
     return ret;
 }
 
@@ -2866,3 +2866,16 @@
     return gangReq;    
 }
 
+int32_t checkMgtGangLength(GANG_META_S *gangMgtNode, uint32_t srcLen)
+{
+    uint32_t    index       = 0;
+    uint32_t    mgtGangLen  = 0;
+    for (index = 0; index < gangMgtNode->gangNum; index++)
+    {
+        mgtGangLen += gangMgtNode->grains[index].length;  //λΪֽ
+    }
+	
+	
+    return ((mgtGangLen == srcLen) ? RETURN_OK : RETURN_ERROR);
+}
+
