--- ./source/private_module/tgt/tgt_vols.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/tgt/tgt_vols.c.hotpatch	2021-02-23 04:03:56.000000000 +0000
@@ -4387,23 +4387,23 @@
     uint8_t *pageAddr = 0;   
     unsigned long lmpLockFlag = 0;
     TGT_SESSVOL_LUN_S *sessVol = NULL;   
-    
     sessVol = TGT_GET_SESSVOL_LUN(sessLun);
-    if (unlikely(NULL == sessVol))
-    {
+    spin_lock_irqsave(&g_stVolUALock, lmpLockFlag);
+    if (unlikely(NULL == sessVol)) {
+        spin_unlock_irqrestore(&g_stVolUALock, lmpLockFlag);
         DBG_LogError(DBG_LOGID_BUTT, "Session Vols is NULL");
         return 0;
     }
 
-    if (unlikely(NULL == sessVol->uaVols))
-    {
+    if (unlikely(NULL == sessVol->uaVols)) {
+        spin_unlock_irqrestore(&g_stVolUALock, lmpLockFlag);
         DBG_LogError(DBG_LOGID_BUTT, "Session VVol Ua Page is NULL");        
         return 0;
     }
 
     tgtGetSessVolUaIdx(lunId, &pageIdx, &byteIdx, &bitIdx);
     
-    spin_lock_irqsave(&g_stVolUALock, lmpLockFlag);
+
     if (unlikely(NULL == sessVol->uaVols[pageIdx]))
     {
         spin_unlock_irqrestore(&g_stVolUALock, lmpLockFlag);
@@ -5047,7 +5047,7 @@
     TGT_SESSION_LUN_S *sessLun = NULL; 
     TGT_SESSVOL_LUN_S *sessVol = NULL;
     TGT_SESSVOL_SHELL_S *sessShell = NULL; 
-
+    unsigned long lmpLockFlag = 0;
     sessShell = tgtSession->sessShell;
     for (hostLunId = 0; hostLunId < g_tgtConf.maxHostLunNum; hostLunId ++) 
     { 
@@ -5062,16 +5062,16 @@
             TGT_INIT_SESSION_LUN(sessLun);   
             continue;
         }        
-
+        spin_lock_irqsave(&g_stVolUALock, lmpLockFlag);
         sessVol = TGT_GET_SESSVOL_LUN(sessLun);
         if (NULL != sessVol)
         {
             tgtPreserveVolPage(sessShell, sessVol);
             tgtFreeSessionVol(sessVol);            
         }
-        
         TGT_INIT_SESSION_LUN(sessLun);   
-
+        spin_unlock_irqrestore(&g_stVolUALock, lmpLockFlag);
+        DBG_LogDebug(DBG_LOGID_NEW, "SCSI_PATCH: Free sess vvol , I_T(0x%llx,0x%llx).", tgtSession->initiatorWwn, tgtSession->targetPortId);
     }
 }
 /************************************************************************
@@ -5143,28 +5143,28 @@
  * : 
  *
  * : 
- *
  *   ֵ: 
- *
  * б: 
  *************************************************************************/
+extern uint32_t g_sessVolPageId;
+void TgtPatchNewFreePageShell(TGT_SESSION_S *tgtSession, void **tmpPageShell, uint32_t pageNum);
 void tgtFreeSurVolPage(TGT_SESSION_S *tgtSession, uint32_t pageNum)
 {
     uint32_t index = 0;
-    TGT_SESSVOL_SHELL_S *sessShell = NULL;
-
-    sessShell = (TGT_SESSVOL_SHELL_S *)tgtSession->sessShell;
+    void **tmpPageShell = NULL;
     
-    for (index = 0; index < pageNum; index++)
-    {       
-        FREE_ONE_PAGE(INVALID_VOLUME_ID, INVALID_VOLUME_ID, sessShell->pageShell[sessShell->pageItera - 1], PAGE_USAGE_TGT_COMMON);
-        sessShell->pageShell[sessShell->pageItera - 1] = NULL;
-        sessShell->pageItera --;  
+    ALLOCATE_STRUCTURE(PID_TGT_MIDDLE, g_sessVolPageId, (void **)&tmpPageShell);
+    if (tmpPageShell == NULL) {
+        DBG_LogError(DBG_LOGID_NEW, "Alloc session LUN page shell node error.");
+        return;
+    }
+    for (index = 0; index < pageNum; index++) {
+        tmpPageShell[index] = NULL;
     }
+    TgtPatchNewFreePageShell(tgtSession, tmpPageShell, pageNum);
+    FREE_STRUCTURE(tmpPageShell, g_sessVolPageId);
 
-    write_lock(&tgtSession->lunmap_rwlock);        
-    sessShell->sessStatus = TGT_SESSVOL_STATUS_PARSE;
-    write_unlock(&tgtSession->lunmap_rwlock);      
+    return;
 }
 
 int32_t tgtAllocSessVols(TGT_SESSION_S *tgtSession)
@@ -8752,3 +8752,28 @@
 EXPORT_SYMBOL(tgtGetSessVolNum);
 EXPORT_SYMBOL(tgtGetQueueVolUaCode);
 
+void TgtPatchNewFreePageShell(TGT_SESSION_S *tgtSession, void **tmpPageShell, uint32_t pageNum)
+{
+    TGT_SESSVOL_SHELL_S *sessShell = (TGT_SESSVOL_SHELL_S *)tgtSession->sessShell;
+    uint32_t index = 0;
+    
+    write_lock(&tgtSession->lunmap_rwlock);
+    for (; index < pageNum; index++) {
+        tmpPageShell[index] = sessShell->pageShell[sessShell->pageItera - 1];
+        sessShell->pageShell[sessShell->pageItera - 1] = NULL;
+        sessShell->pageItera--;
+    }
+    sessShell->sessStatus = TGT_SESSVOL_STATUS_PARSE;
+    write_unlock(&tgtSession->lunmap_rwlock);
+    
+    DBG_LogInfo(DBG_LOGID_NEW, "SCSI_PATCH: Free vvol page shell, I_T(0x%llx,0x%llx).", 
+        tgtSession->initiatorWwn, tgtSession->targetPortId);
+    
+    for (index = 0; index < pageNum; index++) {
+        if (tmpPageShell[index] != NULL) {
+            FREE_ONE_PAGE(INVALID_VOLUME_ID, INVALID_VOLUME_ID, tmpPageShell[index], PAGE_USAGE_TGT_COMMON);
+        }
+    }
+    return;
+}
+
