--- ./source/private_module/framework/core/lock_resource.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/framework/core/lock_resource.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -300,7 +300,6 @@
 
 }
 */
-
 /**
 \brief  master ȨлȴвΪ
 \param[in] masterData: masterԴ
@@ -320,14 +319,15 @@
         return;
     }
     master = DLM_MASTER_HDR(masterData);
+    spin_lock(&master->lock);
     dlmStaticMasterRef(master, pFunc, B_TRUE);
+    atomic_inc(&master->ref);
+    spin_unlock(&master->lock);
     DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_CORE(1), "Zone(0x%x): master ref add:%016llX ref:%d func:%s.", 
             ZONE_NAME((DLM_ZONE_S*)(master->zone)), *(uint64_t*)(master->uuid.data), atomic_read(&master->ref), pFunc);    
-    atomic_inc(&master->ref);
 }
 
 
-
 /**
 \brief  master idleлĵԭǴ˺zone->hentry->lockе
 \param[in] masterData: masterԴ
--- ./source/private_module/framework/core/lock_zone.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/framework/core/lock_zone.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -2132,6 +2132,7 @@
             
             /*üСڵ0˵idleڼûٱʹãɾ
                 С0ԭǿmasterputListʱԿܱǿһ*/
+            spin_lock(&master->lock);
             if((0 >= atomic_read(&master->ref))  ||
                 /*  ǿ,activeĴmasterüʱûɾ*/
                 ((master->forcePut) && (dlmGetPluginRef(master) >= atomic_read(&master->ref))))
@@ -2146,8 +2147,7 @@
                 /*hentry->lockremoveΪremoveҪzone->lock*/
                 list_add(&master->nodeInHash, &tmpMasterList);
             }
-            
-
+            spin_unlock(&master->lock);
             /*  ǿ٣masterûбɾ¹ͷһж*/
             /*ΪǿʱdlmZonePutMasterDoûмüֱӹҵputmaster*/
             /*reaptimerժ󲻹Ļûлٹ*/
--- ./source/private_module/framework/directory/migration_cht.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/framework/directory/migration_cht.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -322,8 +322,7 @@
         DLM_LOG(DBG_LOG_ERROR, DLM_LOG_ID_DIR(0), "Plugin(type:%d) get_base is NULL, migration lock fail.", DLM_MASTER_TYPE(master));
         //dlmPluginPut(pPlugin);
         return RETURN_OK;
-    }
-    
+    }    
     len = dlmGetMemChainLen(&migMsg->memInfo);
     //ֻжϳǷ񻹹дһͷ,ʵͷPBѹһЩ,򻯴
     if (len < (uint32_t)sizeof(DLM_DIR_MIG_LOCK_INFO_S))
@@ -331,11 +330,8 @@
         DLM_LOG(DBG_LOG_WARNING, DLM_LOG_ID_RECOV(0), 
             "The remaining memory(%u) is insufficient, DLM_DIR_MIG_LOCK_INFO_S len: %u", len, (uint32_t)sizeof(DLM_DIR_MIG_LOCK_INFO_S));
         return RETURN_ERROR;
-    }
-
-    
+    }    
     lockData = DLM_MASTER_DATA(master);
-
 	/*ΪȷǨƵĹУmaster٣Ӷ
 	   Ǩƻݺʱmasterĸƥ
 	   openʱorȨй¶⡣ｫmaster
@@ -343,12 +339,16 @@
     if(0 == DLM_GET_DIRPRIV(master))
     {
         atomic_inc(&master->ref); 
-    }
-	
-    
+    }  
     /*ȡ*/   
     (void)pPlugin->ops->master_mig_get_base(lockData, NULL, &needLen);
-
+    if (len <= (uint32_t)sizeof(DLM_DIR_MIG_LOCK_INFO_S) + needLen)
+    {
+        dlmZonePutMaster(master->zone, master);
+        DLM_LOG(DBG_LOG_WARNING, DLM_LOG_ID_RECOV(0), 
+            "The remaining memory(%u) is insufficient, DLM_DIR_MIG_LOCK_INFO_S len: %u, needLen %u", len, (uint32_t)sizeof(DLM_DIR_MIG_LOCK_INFO_S), needLen);
+        return RETURN_ERROR;
+    }
     /*tpǨƵԴ*/
     //DLM_LOG(DBG_LOG_INFO, DLM_LOG_ID_DIR(0), "*********Migration pause*********");
 #ifndef _DLM_DT_
@@ -492,7 +492,7 @@
         dlmZonePutMaster(master->zone, master);
         return RETURN_OK;
     }
-
+    if (len <= ((uint32_t)sizeof(DLM_DIR_MIG_LOCK_INFO_S) + needLen)) {DLM_LOG(DBG_LOG_ERROR, DLM_LOG_ID_DIR(0), "memchain length is not enough, memchain_len: %u, need_len: %u.", len, needLen); return RETURN_ERROR;}
     /*طпԴ˵masterûмʱٵһΪbase dataȥ,base dataɺ,,ҲֻmasterͷϢĿĶ,ĿĶ˵masterѾ
     base data4sϻ,ͻᷢʧ,ҲطҲʧ,޷ָ,Ϊ˽,inc dataҲǿƴ*/
     dlmPackMasterArgsByMaster(&migLock, master, B_TRUE);
--- ./source/private_module/framework/directory/recovery_master.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/framework/directory/recovery_master.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -467,9 +467,9 @@
 
     lockData = DLM_PROXY_DATA(proxy);
     (void)pPlugin->ops->proxy_recovery(lockData, NULL, &needLen);
+    if (len <= (uint32_t)sizeof(DLM_REC_LOCK_INFO_S) + needLen) { DLM_LOG(DBG_LOG_WARNING, DLM_LOG_ID_RECOV(0), "The remaining memory(%u) is insufficient, DLM_REC_LOCK_INFO_S len: %u, needLen: %u", len, (uint32_t)sizeof(DLM_REC_LOCK_INFO_S), needLen); return RETURN_ERROR; }
     dlmPackMasterArgsByProxy(&lockInfo, proxy);
     lockInfo.plugLen = needLen;
-
     if (DLM_RES_TYPE_OBJECT == proxy->type)
     {
         if ((uint32_t)DLM_LOCK_SIZE_NO_NEED_RECOVER == needLen)
@@ -540,7 +540,7 @@
     recMsg->dataLen += needLen;
     recMsg->lockNum++;
 
-    DLM_LOG(DBG_LOG_INFO, DLM_LOG_ID_RECOV(0), "Master pack task((%d, %d) to (%d, %d)) "
+    DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_RECOV(0), "Master pack task((%d, %d) to (%d, %d)) "
             "lock(uuid:0x%016llx, len:%d) from proxyNid(%d), cur locknum(%d) datalen(%d).", 
             recMsg->srcNid.nid, recMsg->srcNid.vnid, recMsg->dstNid.nid, recMsg->dstNid.vnid,
             *(uint64_t*)(lockInfo.masterArgs.uuid.data), lockInfo.plugLen, 
@@ -575,8 +575,8 @@
     memset(&visitor, 0, sizeof(DLM_ZONE_VISITOR_S));
     visitor.visit.visitProxy = dlmRecPackOneLockData;
     visitor.ctx = recMsg;
-    
     ret = dlmZoneTraverseProxy(zone, recMsg->startUuid, recMsg->endUuid, &visitor);
+    DLM_LOG(DBG_LOG_INFO, DLM_LOG_ID_RECOV(0), "Master pack task((%d, %d) to (%d, %d)) from proxyNid(%d), cur locknum(%d) datalen(%d).", recMsg->srcNid.nid, recMsg->srcNid.vnid, recMsg->dstNid.nid, recMsg->dstNid.vnid, recMsg->proxyNid, recMsg->lockNum, recMsg->dataLen);
     return ret;
 }
 
