--- ./source/private_module/ld/stub_v3/stub_ld.c	2018-04-11 12:46:26.000000000 +0000
+++ ./source/private_module/ld/stub_v3/stub_ld.c.hotpatch	2020-04-24 13:23:32.000000000 +0000
@@ -2185,7 +2185,8 @@
     return;
 }
 /*End Modified by t00352166 DTS2017020406805  20170204*/
-
+void ldModifyProductIdWhenMediumError(LD_S* logicDisk, REQ_S *req);
+bool ldCheckSsdTrimIoQuickBack(REQ_S *req);
 /* Begin Modified by m00385535 DTS2018030300770 DTS2018032813024 DTS2018032614240 20180307 */
 /**************************************************************************
    : ldCheckPwrLostCcdbQuickback
@@ -2194,16 +2195,12 @@
  : REQ_S* req : req
  : 
    ֵ: 
-     : 
 **************************************************************************/
 bool ldCheckPwrLostCcdbQuickback(LD_S* logicDisk, REQ_S *req)
 {
     LD_REQ_PRIVATE_INFO* private = (LD_REQ_PRIVATE_INFO*)(void*)req->producerPrivate;
 
     /* Begin Modified by m00385535 DTS2018032614240 20180327 */
-    //ֻIOǳʱŻֱӷأִв
-    //ͨprivate->errInfo.bdmByteжϳʱ룬nvme3ϸִ
-    //ȷIOصʱ㲻ٳsglַ˫дݲһ
     if (unlikely(g_ldEventNodePowerLost) && 
             DISK_PARTITION_SYSPOOL == logicDisk->partitionType
             && BDM_TEST_BIT(IS_DB_DISK_PATIONTION_MASK, (void *)&logicDisk->flag)
@@ -2218,7 +2215,10 @@
         return TRUE;
     }    
     /* End Modified by m00385535 DTS2018032614240 20180327 */
-
+    ldModifyProductIdWhenMediumError(logicDisk, req);
+    if (ldCheckSsdTrimIoQuickBack(req)) {
+        return TRUE;
+    }
     return FALSE;
 }
 /* End Modified by m00385535 DTS2018030300770 DTS2018032813024 DTS2018032614240 20180307 */
@@ -3084,7 +3084,7 @@
     private->newErrorInfo.bdmByte = bdmByte;
 }
 /*End Modified by j00285232 SR_F455BAFE-388F-4cf9-BA56-0F2A7551ADEE 20170602*/
-
+void ldProcTrimIoWhenMediumError(REQ_S *req);
 /*Begin Modified by w90005722 PCIE_ROOT_DISK*/
 void ldCopyDiagErrorInfo(LD_S* logicDisk, REQ_S *req)
 {
@@ -3103,7 +3103,7 @@
             memcpy(&private->diagErrorInfo, &private->newErrorInfo, sizeof(CFG_ERR_INFO_S));
         }
     }
-
+    ldProcTrimIoWhenMediumError(req);
     return;
 }
 /*End Modified by w90005722 PCIE_ROOT_DISK*/
@@ -3690,7 +3690,7 @@
 EXPORT_SYMBOL(ldIoGenWithRet);
 /*End Modified by c00230409 DTS2018011712939 20180119*/
 
-
+void ldProcFwdTrimIoWhenMediumError(REQ_S *req);
 void stub_ldFwReqResult(REQ_S *req)
 {
     LD_REQ_PRIVATE_INFO *private = NULL;
@@ -3700,26 +3700,22 @@
 
     private = (LD_REQ_PRIVATE_INFO*)(void*)req->producerPrivate;
     /* תдIO DIFҪ½DIFУ飬УʧֱӷأҪһ */
-    if (BDM_INNER_ERROR_FWD_DIF == private->newErrorInfo.bdmByte)
-    {
+    if (BDM_INNER_ERROR_FWD_DIF == private->newErrorInfo.bdmByte) {
         ret = LD_REQ_DIF_VERIFY(req, OP_WRITE, DIF_VERIFY_LEVEL_CRITICAL);

         /* Dorado 5000 modified begin */
         ANY_TRACE_CALL(LD_DIF_HANDLE_TRACE, 3, "[LD_DIF_H]Req(0x%p) op(%u) from LDID(%llu) forword io back error, dif verify result(%d).", req,req->opCode, req->objectId, ret);
         /* Dorado 5000 modified end */
-        if (RETURN_OK != ret)
-        {
+        if (RETURN_OK != ret) {
             memset(&private->newErrorInfo, 0, sizeof(CFG_ERR_INFO_S));
             private->newErrorInfo.bdmByte = BDM_INNER_ERROR_DIF;
         }
+        return ;
     }
-    /*ؽڵPCIEۿϣbad io*/
-    if (BDM_INNER_ERROR_XNET == private->newErrorInfo.bdmByte)
-    {
+    if (BDM_INNER_ERROR_XNET == private->newErrorInfo.bdmByte) {
         ldGetPcieFaultNodesBitMap(&faultBitmap);
         localNid = GET_LOCAL_NID();
         if ((BDM_TEST_BIT(localNid, (void*)&faultBitmap)||BDM_TEST_BIT(private->lastExeNid, (void*)&faultBitmap))
-               || (g_ldLocalNodeIsPowerLost))
-        {
+               || (g_ldLocalNodeIsPowerLost)) {
             /*Begin Modified by h00405124 DTS2017092506105 20170925*/ 
             BDM_LOG_ERR_CAN_PRINT(LOG_ID_LD_0065,
                 (60*HZ),
@@ -3731,7 +3727,11 @@
             private->newErrorInfo.bdmByte = BDM_INNER_ERROR_NODE_NOT_ALIVE;
             /*End Modified by h00405124 DTS2017092506105 20170925*/ 
         }
+        return;        
     }
+    
+    ldProcFwdTrimIoWhenMediumError(req);
+    return;
 }
 
 /**************************************************************************
@@ -5195,3 +5195,180 @@
 /* PC-Lint */
 LD_USE_TRACE_POINT
 
+/*****************************************************************************
+     : ǼSSDproductId޸Ϊ7SSDproductId޸Ϊ8
+ : logicId:disk߼id
+ : 
+ ֵ  : 
+     : 
+*****************************************************************************/
+void ldModifyProductId(LD_S* logicDisk)
+{
+    if (logicDisk->diskType == DISK_TYPE_SSD
+        || logicDisk->diskType == DISK_TYPE_SLC_SSD
+        || logicDisk->diskType == DISK_TYPE_MLC_SSD
+        || logicDisk->diskType == DISK_TYPE_NVME_SSD) {
+        logicDisk->productId = 7;
+        return;
+    }
+
+    if (logicDisk->diskType == DISK_TYPE_SSD_SED
+        || logicDisk->diskType == DISK_TYPE_SLC_SSD_SED
+        || logicDisk->diskType == DISK_TYPE_MLC_SSD_SED) {
+        logicDisk->productId = 8;
+        return;
+    }
+
+    return;
+}
+
+/*****************************************************************************
+     : SSDдIO󣬽productId޸Ϊ78
+ : logicId:disk߼id
+                         REQ_S *req
+ : 
+ ֵ  : 
+     : 
+*****************************************************************************/
+void ldModifyProductIdWhenMediumError(LD_S* logicDisk, REQ_S *req)
+{
+    LD_REQ_PRIVATE_INFO* private = NULL;
+    
+    if (req->opCode != OP_WRITE) {
+        return;
+    }
+    
+    private = (LD_REQ_PRIVATE_INFO*)(void*)req->producerPrivate;
+    
+    if (private->newErrorInfo.hostByte == 0
+        && private->newErrorInfo.msgByte == 0
+        && private->newErrorInfo.bdmByte == 0
+        && private->newErrorInfo.statusByte == 2
+        && private->newErrorInfo.sk == 3) {
+        ldModifyProductId(logicDisk);
+        BDM_PRINT_LIMIT_PERIOD(LD_LOG_INTERVAL_FIVE_MIN, 1, DBG_LOG_ERROR, LOG_ID_LD_05EE,
+                 "BDM_SPH019:req 0x%p,opCode %u,objectId %llu,objectLba %llu,productId %u,error(%x,%x,%x,%x,%x,%x,%x,%x).",
+                 req, req->opCode, req->objectId, req->objectLba, logicDisk->productId,
+                 private->newErrorInfo.hostByte,
+                 private->newErrorInfo.msgByte,
+                 private->newErrorInfo.bdmByte,
+                 private->newErrorInfo.statusByte,
+                 private->newErrorInfo.sk,
+                 private->newErrorInfo.asc,
+                 private->newErrorInfo.ascq,
+                 private->newErrorInfo.fru);
+        return;
+    }
+    
+    return;
+}
+
+/*****************************************************************************
+     : TRIMIO󣬷IO_ERR_SECTOR_FAULTϲ
+ : logicId:disk߼id
+                         REQ_S *req
+ : 
+ ֵ  : 
+     : 
+*****************************************************************************/
+bool ldCheckSsdTrimIoQuickBack(REQ_S *req)
+{
+    LD_REQ_PRIVATE_INFO* private = NULL;
+    
+    if (req->opCode != OP_TRIM) {
+        return FALSE;
+    }
+
+    private = (LD_REQ_PRIVATE_INFO*)(void*)req->producerPrivate;
+
+    if (private->newErrorInfo.hostByte == 0
+        && private->newErrorInfo.msgByte == 0
+        && private->newErrorInfo.bdmByte == BDM_INNER_ERROR_NO_RES
+        && private->newErrorInfo.statusByte == 2
+        && private->newErrorInfo.sk == 3) {
+        req->result = IO_ERR_SECTOR_FAULT;
+        BDM_PRINT_LIMIT_PERIOD(LD_LOG_INTERVAL_ONE_MIN, 1, DBG_LOG_ERROR, LOG_ID_LD_05EE,
+                 "BDM_SPH019:req 0x%p,opCode %u,objectId %llu,objectLba %llu,ret %u,error(%x,%x,%x,%x,%x,%x,%x,%x).",
+                 req, req->opCode, req->objectId, req->objectLba, req->result,
+                 private->newErrorInfo.hostByte,
+                 private->newErrorInfo.msgByte,
+                 private->newErrorInfo.bdmByte,
+                 private->newErrorInfo.statusByte,
+                 private->newErrorInfo.sk,
+                 private->newErrorInfo.asc,
+                 private->newErrorInfo.ascq,
+                 private->newErrorInfo.fru);
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+void ldProcTrimIoWhenMediumError(REQ_S *req)
+{
+    LD_REQ_PRIVATE_INFO* private = NULL;
+    
+    if (req->opCode != OP_TRIM) {
+        return;
+    }
+
+    private = (LD_REQ_PRIVATE_INFO*)(void*)req->producerPrivate;
+
+    if (BDM_TEST_BIT(LD_REQ_FWD_MASK, (void*)&private->flag)) {
+        return;
+    }
+
+    if (private->newErrorInfo.hostByte == 0
+        && private->newErrorInfo.msgByte == 0
+        && private->newErrorInfo.bdmByte == 0
+        && private->newErrorInfo.statusByte == 2
+        && private->newErrorInfo.sk == 3) {
+        private->newErrorInfo.bdmByte = BDM_INNER_ERROR_NO_RES;
+        BDM_PRINT_LIMIT_PERIOD(LD_LOG_INTERVAL_ONE_MIN, 1, DBG_LOG_ERROR, LOG_ID_LD_05EE,
+                 "BDM_SPH019:req 0x%p,opCode %u,objectId %llu,objectLba %llu,ret %u,error(%x,%x,%x,%x,%x,%x,%x,%x).",
+                 req, req->opCode, req->objectId, req->objectLba, req->result,
+                 private->newErrorInfo.hostByte,
+                 private->newErrorInfo.msgByte,
+                 private->newErrorInfo.bdmByte,
+                 private->newErrorInfo.statusByte,
+                 private->newErrorInfo.sk,
+                 private->newErrorInfo.asc,
+                 private->newErrorInfo.ascq,
+                 private->newErrorInfo.fru);
+    }
+
+    return;
+}
+
+void ldProcFwdTrimIoWhenMediumError(REQ_S *req) 
+{
+    LD_REQ_PRIVATE_INFO* private = NULL;
+    
+    if (req->opCode != OP_TRIM) {
+        return;
+    }
+
+    private = (LD_REQ_PRIVATE_INFO*)(void*)req->producerPrivate;
+
+    if (private->newErrorInfo.hostByte == 0
+        && private->newErrorInfo.msgByte == 0
+        && private->newErrorInfo.bdmByte == 0
+        && private->newErrorInfo.statusByte == 2
+        && private->newErrorInfo.sk == 3) {
+        private->newErrorInfo.bdmByte = BDM_INNER_ERROR_NO_RES;
+        BDM_PRINT_LIMIT_PERIOD(LD_LOG_INTERVAL_ONE_MIN, 1, DBG_LOG_ERROR, LOG_ID_LD_05EE,
+                 "BDM_SPH019:req 0x%p,opCode %u,objectId %llu,objectLba %llu,ret %u,error(%x,%x,%x,%x,%x,%x,%x,%x).",
+                 req, req->opCode, req->objectId, req->objectLba, req->result,
+                 private->newErrorInfo.hostByte,
+                 private->newErrorInfo.msgByte,
+                 private->newErrorInfo.bdmByte,
+                 private->newErrorInfo.statusByte,
+                 private->newErrorInfo.sk,
+                 private->newErrorInfo.asc,
+                 private->newErrorInfo.ascq,
+                 private->newErrorInfo.fru);
+    }
+
+    return;
+}
+
