--- ./source/private_module/tgt/tgt_drvintf.c	2018-05-08 02:56:50.000000000 +0000
+++ ./source/private_module/tgt/tgt_drvintf.c.hotpatch	2018-11-24 12:03:07.000000000 +0000
@@ -3529,7 +3529,7 @@
 
     return RETURN_OK;
 }
-
+void tgtPrintErrorCmdInfo(TGT_CMD_S *tgtCmd);
 /************************************************************************
  * : tgtFrontSndRsp
  *
@@ -3596,9 +3596,10 @@
     /*Added by q00290033 ע,CR-01482313, 2014-09-30 END*/
     
     /*ӡ*/
-    if (unlikely(TADRV_SCSI_STATUS_GOOD != tgtCmd->ucCmdStatus))
+    if (unlikely(TADRV_SCSI_STATUS_GOOD != tgtCmd->ucCmdStatus) && (tgtCmd->usCmdSenseCode != TADRV_SCSI_SNSCODE_INVALID_COMMAND))
     {
         tgtCmd->uiIoCurrentDataTransLength = 0;
+        tgtPrintErrorCmdInfo(tgtCmd);
         /*modify by x90006290 for Ƶ10Ӵӡһ begin*/
         PRINT_LIMIT(DBG_LOG_ERROR, DBG_LOGID_BUTT, 3*3600 * HZ, 1, bPrint);
         /*modify by x90006290 for Ƶ10Ӵӡһ end*/
@@ -3607,10 +3608,9 @@
             TGT_PRINT_WARNING(LOG_ID_00A2, "TGT_ERR:tgtCmd(0x%p) is not normal, status 0x%x, key 0x%x, code 0x%x.", 
                 tgtCmd, tgtCmd->ucCmdStatus, tgtCmd->ucCmdSenseKey, tgtCmd->usCmdSenseCode);
             TGT_PRINT_TGTCMD(tgtCmd);
-        }
+        }    		
     }
 
-
     /*ǶݣҪ׼drvsgl,SGL*/
     /* modified by l90006363,for DTS2013111100682,ͳһʹԭӲbegin*/
     if (RETURN_OK != tgtAtomicTestCmdFlag(tgtCmd, TGT_CMD_FLAG_NEED_MALLOC))
@@ -4002,3 +4002,58 @@
     return ret;
 }
 EXPORT_SYMBOL(tgtGetTargetPortOwnerNid);
+
+void tgtPrintErrorCmdInfo(TGT_CMD_S *tgtCmd)
+{
+    bool bPrint = B_TRUE;
+    uint8_t *lunAddr = NULL;
+    TGT_SESSION_S *session = NULL;
+
+    lunAddr = TGT_CMD_GET_LUN(tgtCmd);
+    session = (TGT_SESSION_S *)tgtCmd->pstSession;
+
+    if (NULL == session)
+    {
+        return;
+    }
+
+    if (INVALID_VALUE16 == session->hostId)
+    {
+        DBG_LogDebug(DBG_LOGID_BUTT, "TGT_TRACE:host is invalid,hotLun %u,I_T_L:%llx_%llx_%u.",
+                    tgtCmd->uiHostLunId,session->initiatorWwn,session->targetPortId,tgtCmd->uiDevLunId);
+        return;
+    }
+    
+    if ((tgtCmd->ucCmdStatus == TADRV_SCSI_STATUS_CHECK_CONDITION)
+        && (tgtCmd->ucCmdSenseKey == TADRV_SCSI_SNSKEY_ILLEGAL_REQUEST)
+        && (tgtCmd->usCmdSenseCode == TADRV_SCSI_SNSCODE_LOGICAL_NOT_SUPPORTED))
+    {
+        PRINT_LIMIT(DBG_LOG_ERROR, DBG_LOGID_BUTT, 240 * HZ, 3, bPrint);
+
+        if (B_TRUE == bPrint)
+        {
+            DBG_LogInfo(DBG_LOGID_BUTT, "TGT_TRACE:hostID %u,status 0x%x, key 0x%x, code 0x%x,"
+                "Drvcmd LUN: %x %x %x %x %x %x.",
+                session->hostId, tgtCmd->ucCmdStatus, tgtCmd->ucCmdSenseKey, tgtCmd->usCmdSenseCode,
+                lunAddr[0],lunAddr[1],lunAddr[2],lunAddr[3],lunAddr[4],lunAddr[5]);
+
+            TGT_PRINT_TGTCMD(tgtCmd);
+        }
+    }
+    else if ((tgtCmd->ucCmdSenseKey != TADRV_SCSI_SNSKEY_UNIT_ATTENTION))
+    {
+        PRINT_LIMIT(DBG_LOG_ERROR, DBG_LOGID_BUTT, 1800 * HZ, 3, bPrint);
+        
+        if (B_TRUE == bPrint)
+        {
+            DBG_LogInfo(DBG_LOGID_BUTT, "TGT_TRACE:hostID %u,status 0x%x, key 0x%x, code 0x%x,"
+                "Drvcmd LUN: %x %x %x %x %x %x.",
+                session->hostId, tgtCmd->ucCmdStatus, tgtCmd->ucCmdSenseKey, tgtCmd->usCmdSenseCode,
+                lunAddr[0],lunAddr[1],lunAddr[2],lunAddr[3],lunAddr[4],lunAddr[5]);
+            
+            TGT_PRINT_TGTCMD(tgtCmd);
+        }
+    }
+}
+
+
--- ./source/private_module/tgt/tgt_tsm.c	2018-04-23 10:59:01.000000000 +0000
+++ ./source/private_module/tgt/tgt_tsm.c.hotpatch	2018-11-24 12:03:07.000000000 +0000
@@ -261,7 +261,7 @@
     tgtSession = (TGT_SESSION_S *)session;
     tgtSession->uiOsType = osType;
 }
-
+void tgtPrintInvalidLunInfo(TGT_CMD_S *tgtCmd,const char* funcName, const int32_t fileLine);
 /*****************************************************************************
      : tgtSetMpType2Session
    : sessionĶ·
@@ -361,7 +361,7 @@
     {
         tgtCmd->uiDevLunId = INVALID_VALUE32;
         tgtAtomicSetCmdFlag(tgtCmd, TGT_CMD_FLAG_ZERO_LUN);
-        
+        tgtPrintInvalidLunInfo(tgtCmd,__FUNCTION__, __LINE__);
         return;
     }   
     //LUNӳ䲻
@@ -370,7 +370,7 @@
     {
         tgtCmd->uiDevLunId = INVALID_VALUE32;
         tgtAtomicSetCmdFlag(tgtCmd, TGT_CMD_FLAG_ZERO_LUN);
-        
+        tgtPrintInvalidLunInfo(tgtCmd,__FUNCTION__, __LINE__);
         return;
     }    
     //ͨLUN
@@ -378,7 +378,7 @@
     {
         tgtCmd->uiDevLunId = sessLun->uiDevLunId;    
         tgtAtomicSetCmdFlag(tgtCmd, TGT_CMD_FLAG_BASE_LUN);
-        
+        tgtPrintInvalidLunInfo(tgtCmd,__FUNCTION__, __LINE__);
         return;
     }
 
@@ -388,11 +388,10 @@
     {
         tgtCmd->uiDevLunId = sessLun->uiDevLunId; 
         tgtAtomicSetCmdFlag(tgtCmd, TGT_CMD_FLAG_BASE_LUN);
-
+        tgtPrintInvalidLunInfo(tgtCmd,__FUNCTION__, __LINE__);
         return;
 
     }
-
     lunAddr = TGT_CMD_GET_LUN(tgtCmd);
     sluId = tgtGetSluLunId(lunAddr);   
     
@@ -401,6 +400,7 @@
     {
         tgtCmd->uiDevLunId = sessLun->uiDevLunId; 
         tgtAtomicSetCmdFlag(tgtCmd, TGT_CMD_FLAG_PE_LUN);
+        tgtPrintInvalidLunInfo(tgtCmd,__FUNCTION__, __LINE__);
         return;
     }     
 
@@ -414,7 +414,7 @@
     }
    
     tgtAtomicSetCmdFlag(tgtCmd, TGT_CMD_FLAG_VOL_LUN);
-    
+    tgtPrintInvalidLunInfo(tgtCmd,__FUNCTION__, __LINE__);
     return;
 }
 
@@ -786,8 +786,8 @@
     
     return;
 }
-
-/* modified by l90006363, for DTS2016053004083   end*/
+int32_t tgtFillSessionLunAndSaveVvolInfo(TGT_SESSION_S *tgtSession,LMP_SESSION_INFO_S *info, 
+                                                                            uint32_t* hostLUNID, uint32_t num);
 /************************************************************************
  * : OSP_VOID TGT_ParseSession(TGT_SESSION_S *v_pstTgtSession)
 
@@ -813,12 +813,13 @@
     int32_t state;
 
     memset(&lmpSession, 0, sizeof(LMP_SESSION_INFO_S));
-    
+    write_lock(&tgtSession->lunmap_rwlock);
+    state = atomic_read(&tgtSession->lmpState);
     /*1. ʼlinkupsessionҪsession lun space*/
-    if (unlikely(TGT_SESSION_LMP_NEW == atomic_read(&tgtSession->lmpState)))
+    if (unlikely(TGT_SESSION_LMP_NEW == state))
     {
         atomic_set(&tgtSession->lmpState, TGT_SESSION_LMP_ALLOCING);
-        
+        write_unlock(&tgtSession->lunmap_rwlock);
         /*sessionLUNṹ,첽Ҫü*/
         tgtGetSessionRef(tgtSession);        
         SET_INNER_IO_PRIORITY_BY_IO_TYPE(INVALID_VALUE64, TGT_LINK, &priority);
@@ -834,8 +835,7 @@
             return RETURN_ERROR;
         }
     }
-
-    state = atomic_read(&tgtSession->lmpState);    
+    else {write_unlock(&tgtSession->lunmap_rwlock);}    
     /*2.session lun space,Զ*/
     if (unlikely(TGT_SESSION_LMP_ALLOCING == state))
     {
@@ -870,19 +870,7 @@
         }
         
         lmpSession.iqn = linkPriv->iscsi.iniIQN;
-    }   
-
-    write_lock(&tgtSession->lunmap_rwlock);
-    if (RETURN_OK != tgtInitSessVols(tgtSession))
-    {
-        atomic_set(&tgtSession->lmpState, TGT_SESSION_LMP_NEED_PARSE);
-        write_unlock(&tgtSession->lunmap_rwlock);
-        return RETURN_ERROR;
-    }
-
-    tgtInitSessLunMap(tgtSession);
-    write_unlock(&tgtSession->lunmap_rwlock);
-    
+    } 
     maxHostLun = tgtGetLmpMaxHostLunNum();
     hostLunList = tgtAllocHostLunListBuffer(maxHostLun);
     if (unlikely(NULL == hostLunList))
@@ -891,10 +879,22 @@
         atomic_set(&tgtSession->lmpState, TGT_SESSION_LMP_NEED_PARSE);
         return RETURN_ERROR;
     }
-
     /*5.LMPлȡӳϵ䵽session lun*/    
     tgtGetLunArrayByIniator(&lmpSession, hostLunList, maxHostLun);
-    tgtFillLunInfoToSession(tgtSession, &lmpSession, hostLunList, maxHostLun);
+    /*,begin*/
+    /*ȫͷųʼsession LUNͷvVol LUNMAPvVol LUNUA*/
+    write_lock(&tgtSession->lunmap_rwlock);
+    if (RETURN_OK != tgtFillSessionLunAndSaveVvolInfo(tgtSession, &lmpSession, hostLunList, maxHostLun))
+    {
+        atomic_set(&tgtSession->lmpState, TGT_SESSION_LMP_NEED_PARSE);
+        write_unlock(&tgtSession->lunmap_rwlock);
+        tgtFreeHostLunListBuffer(hostLunList);
+        return RETURN_ERROR;
+    }
+    //tgtInitSessLunMap(tgtSession);
+    write_unlock(&tgtSession->lunmap_rwlock);
+    /*,end*/
+    //tgtFillLunInfoToSession(tgtSession, &lmpSession, hostLunList, maxHostLun);
     (void)tgtRenewHostLunThresholdUA(tgtSession, hostLunList, maxHostLun);
     tgtFreeHostLunListBuffer(hostLunList);
     hostLunList = NULL;
@@ -1747,3 +1747,171 @@
     return;
 }
 
+void tgtPrintInvalidLunInfo(TGT_CMD_S *tgtCmd,const char* funcName, const int32_t fileLine)
+{
+    bool bPrint = B_TRUE;
+    uint8_t *lunAddr = NULL;
+    TGT_SESSION_S *session = NULL;
+    
+    lunAddr = TGT_CMD_GET_LUN(tgtCmd);
+    session = tgtCmd->pstSession;        
+
+    if (NULL == session)
+    {
+        return;
+    }
+
+    if (INVALID_VALUE16 == session->hostId)
+    {
+        DBG_LogDebug(DBG_LOGID_BUTT, "TGT_TRACE:host is invalid,hotLun %u,I_T_L:%llx_%llx_%u.",
+                    tgtCmd->uiHostLunId,session->initiatorWwn,session->targetPortId,tgtCmd->uiDevLunId);
+        return;
+    }
+
+    if (tgtCmd->uiDevLunId != INVALID_VALUE32)
+    {
+        DBG_LogDebug(DBG_LOGID_BUTT, "TGT_TRACE:devlun is valid,hostLun %u,I_T_L:%llx_%llx_%u.",
+                    tgtCmd->uiHostLunId,session->initiatorWwn,session->targetPortId,tgtCmd->uiDevLunId);
+        return;
+    }
+
+    if (0 == tgtCmd->uiHostLunId)
+    {
+        TGT_LIMIT_PRINT(DBG_LOG_INFO,DBG_LOGID_BUTT,3600 * HZ,1,
+            "TGT_TRACE:hostID %u,opCode(%x),tgtflg(0x%x),lunmap(%u:%u),drvLUN: %x %x %x %x %x %x,func=%s, line%d",
+            session->hostId,SCSI_GET_CDB_OP(tgtCmd),tgtCmd->tgtCmdFlag,tgtCmd->uiHostLunId,tgtCmd->uiDevLunId,
+            lunAddr[0],lunAddr[1],
+            lunAddr[2],lunAddr[3],lunAddr[4],lunAddr[5],funcName,fileLine);
+        return;
+    }
+
+    PRINT_LIMIT(DBG_LOG_ERROR, DBG_LOGID_BUTT, 360 * HZ, 3, bPrint);
+
+    if (B_TRUE == bPrint)
+    {
+        DBG_LogInfo(DBG_LOGID_BUTT, "TGT_TRACE:hostID %u,drvLUN: %x %x %x %x %x %x,func=%s, line%d",
+            session->hostId,lunAddr[0],lunAddr[1],lunAddr[2],lunAddr[3],
+            lunAddr[4],lunAddr[5],funcName,fileLine);
+
+        TGT_PRINT_TGTCMD(tgtCmd);
+    }
+}
+extern void tgtFreeSessionVol(TGT_SESSVOL_LUN_S *sessVol);
+extern TGT_SESSVOL_SHELL_S * tgtAllocSessVolShell(void);
+
+#define TGT_PATCH_INIT_SESSION_LUN(_SESSLUN_) \
+do{ \
+    (_SESSLUN_)->sessionLunFlag  = 0; \
+    (_SESSLUN_)->uiUASenseCode = INVALID_VALUE16; \
+    (_SESSLUN_)->pSpecific = NULL;      \
+}while(0)
+
+void tgtPatchPreserveVolPage(TGT_SESSVOL_SHELL_S *sessShell, TGT_SESSVOL_LUN_S  *sessVol)
+{
+    uint32_t index = 0;      
+    for (index = 0; index < TGT_VOLUA_PAGE_NUM; index++)
+    {
+        if (NULL != sessVol->uaVols[index])
+        {
+            sessShell->pageShell[sessShell->pageItera++] = sessVol->uaVols[index];
+            sessVol->uaVols[index] = NULL;
+        }
+    }
+}
+void tgtPatchReserveVolsRes(TGT_SESSION_S *tgtSession)
+{
+    uint32_t hostLunId = 0;    
+    TGT_SESSION_LUN_S *sessLun = NULL; 
+    TGT_SESSVOL_LUN_S *sessVol = NULL;
+    TGT_SESSVOL_SHELL_S *sessShell = NULL; 
+
+    sessShell = tgtSession->sessShell;
+    for (hostLunId = 0; hostLunId < g_tgtConf.maxHostLunNum; hostLunId ++) 
+    { 
+        sessLun = tgtGetSessionLun(tgtSession, hostLunId);   
+        if (NULL == sessLun)            
+        {
+            continue; 
+        }               
+        
+        if (B_TRUE != tgtCheckLunIsPe(sessLun->uiDevLunId))
+        {
+            TGT_PATCH_INIT_SESSION_LUN(sessLun);   
+            continue;
+        }        
+
+        sessVol = TGT_GET_SESSVOL_LUN(sessLun);
+        if (NULL != sessVol)
+        {
+            tgtPatchPreserveVolPage(sessShell, sessVol);
+            tgtFreeSessionVol(sessVol);            
+        }
+        
+        TGT_PATCH_INIT_SESSION_LUN(sessLun); 
+    }
+    DBG_LogDebug(DBG_LOGID_BUTT, "TGT_TRACE:parse ses,I_T(%llx_%llx).",tgtSession->initiatorWwn,tgtSession->targetPortId);
+    return;
+}
+
+int32_t tgtFillSessionLunAndSaveVvolInfo(TGT_SESSION_S *tgtSession,LMP_SESSION_INFO_S *info, 
+                                                                            uint32_t* hostLUNID, uint32_t num)
+{
+    uint32_t idx = 0;
+    //uint32_t devLunId = 0;
+    uint8_t peNum = 0;
+    TGT_SESSVOL_SHELL_S *sessShell = NULL;
+    uint16_t lunMapNum = 0;
+
+    /*vVol LUNʱbuffer*/    
+    tgtSession->sessShell = (NULL == tgtSession->sessShell) ? 
+                                        tgtAllocSessVolShell()  : tgtSession->sessShell;
+   
+    if (unlikely(NULL == tgtSession->sessShell))
+    {
+        return RETURN_ERROR;
+    }
+
+    sessShell = tgtSession->sessShell;
+    sessShell->peLunNum = 0;
+    
+    if (TGT_SESSVOL_STATUS_INIT == sessShell->sessStatus)
+    {
+        tgtPatchReserveVolsRes(tgtSession);    
+        sessShell->sessStatus = TGT_SESSVOL_STATUS_ALLOC;
+    }
+
+    /*sessionϵֵ*/
+    tgtSetOsType2Session((void*)tgtSession, info->hostType);
+    tgtSetMpType2Session((void*)tgtSession, info->mpType);
+    tgtSetHostId2Session((void*)tgtSession, info->hostId);
+    if (DRV_TYPE_ISCSITGT == info->iniType)
+    {
+        tgtUpdateIniWWN2Session((void*)tgtSession, info->wwn);
+    }
+
+    /*session LUNֵ*/
+    for (idx = 0; idx < num; idx++)
+    {
+        if (INVALID_VALUE32 != hostLUNID[idx])
+        {
+            /*ͳPE LUNĸ*/
+            if (tgtCheckLunIsPe(hostLUNID[idx]))
+            {
+                peNum++;
+            }
+            /*ЧӳLUNĸ*/
+            lunMapNum++;
+        }
+        /*devLUNǷЧҪֵ*/
+        tgtFillLunMap2Session((void*)tgtSession, idx, hostLUNID[idx]);
+        DBG_LogDebug(DBG_LOGID_BUTT, "TGT_TRACE:parse ses,I_T(%llx_%llx),LUN_MAP(%u:%u),peNum %u,lmpNum %u.",
+                            tgtSession->initiatorWwn,tgtSession->targetPortId,idx,hostLUNID[idx],peNum,lunMapNum);
+    }
+
+
+    sessShell->peLunNum += peNum;
+
+    tgtSession->mapLunNum = lunMapNum;    
+
+    return RETURN_OK;    
+}
