--- ./source/private_module/bdm/sdm/sd/stub_v3/stub_sd_generic.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/bdm/sdm/sd/stub_v3/stub_sd_generic.c.hotpatch	2019-05-06 21:31:10.000000000 +0000
@@ -783,7 +783,7 @@
             req->result,req->parent, parentName);
 }
 /*End Modified by c00271321 DTS2016030809331 20160310*/
-
+void sdStartReBuildDisk(SD_SCSI_DEVICE_S *dev, REQ_S *req);
 /**************************************************************************
 *     : sdصϲģǰdif󣬲ӡdifϢ
 * : req ·req
@@ -805,16 +805,16 @@
     SCSI_DISK_DEVICE_S *sdDisk = SD_GENERIC_TO_DISK(dev);
     SIO_ERR_PRIV_S *errPriv = SIO_REQ_TO_ERR(req);
     char *parentName = (NULL != req->parent) ? req->parent->ops->name : "NULL";
-
+    sdStartReBuildDisk(dev, req);
     /* dif */
     if (BDM_IO_DIF_ERROR != req->result)
     {        
-		/* ӡSIOصĴIO */
-		/*Begin Modified by c00271321 DTS2016030809331 20160310*/
-		/*Begin Modified by w90004841 DTS2014042504264 20140507*/
+        /* ӡSIOصĴIO */
+        /*Begin Modified by c00271321 DTS2016030809331 20160310*/
+        /*Begin Modified by w90004841 DTS2014042504264 20140507*/
         sdPrintNotDifErrorInfo(dev, req);
-		/*End Modified by w90004841 DTS2014042504264 20140507*/
-		/*End Modified by c00271321 DTS2016030809331 20160310*/
+        /*End Modified by w90004841 DTS2014042504264 20140507*/
+        /*End Modified by c00271321 DTS2016030809331 20160310*/
         return;
     }
    
@@ -1332,6 +1332,124 @@
     return; 
 } 
 /*End Modified by j90006936 DTS2014060500714 2014.6.5*/ 
-/* PC-Lint */
+#define SIO_QUEUE_FLAG_REBUILD_PATCH    (21)   /*:SIO_QUEUE_FLAG_Eö٣ѡδʹõbit21*/
 SD_USE_TRACE_POINT
 
+/*Begin: V5R7C10SPH015DTS2019050506835*/
+extern void sdSasReBuildDiskPatch(uint32_t sdevId);
+
+/*******************************************************************************
+      : sdIsNvmeDevPatch            
+        : жdevǷΪNVME豸            
+    : SD_SCSI_DEVICE_S* dev 豸           
+    :            
+  ֵ    : TRUE/FALSE            
+        :     οsdIsNvmeDev
+*******************************************************************************/
+bool sdIsNvmeDevPatch(SD_SCSI_DEVICE_S* dev)
+{
+    SCSI_DISK_DEVICE_S* disk = NULL;
+    SCSI_RAW_DEVICE_S* raw = NULL;
+
+    if (SCSI_DEVICE_TYPE_DISK == dev->type)
+    {
+        disk = SD_GENERIC_TO_DISK(dev);
+
+        if (DISK_TYPE_NVME_SSD == disk->type)
+        {
+            return TRUE;
+        }
+    }
+    else if (SCSI_DEVICE_TYPE_RAW == dev->type)
+    {
+        raw = SD_GENERIC_TO_RAW_DEV(dev);
+
+        if (SD_RAW_NVME_PROTOCOL == raw->prcType)
+        {
+            return TRUE;
+        }
+    }
+    
+    return FALSE;
+}
+
+/************************************************************************** 
+*     : ׼ؽ 
+* : SD_SCSI_DEVICE_S *dev, REQ_S *req
+* :  
+*   ֵ:  
+*     : ԭке
+**************************************************************************/
+void sdStartReBuildDisk(SD_SCSI_DEVICE_S *dev, REQ_S *req)
+{
+    SCSI_DISK_DEVICE_S *disk = NULL;
+    SIO_QUEUE_S *queue = NULL;
+    
+    if (NULL == dev)
+    {
+        return;
+    }
+    disk = SD_GENERIC_TO_DISK(dev);
+    queue = SIO_DEV_TO_QUEUE(dev);
+
+    /*Ϣ*/
+    DBG_LogDebug(DBG_LOGID_BUTT, "REBUILD:sdid %u,dev(t:%d,s:%d),disk(m:%s,t:%d),qflag 0x%x,req(f:0x%llx,p:0x%p,o:0x%x).", 
+                dev->sdevId,
+                dev->type,
+                dev->state,
+                disk->model,
+                disk->type,
+                queue->queueFlag,
+                req->ctrlFlag,
+                req,
+                req->opCode);
+
+    /*Ӳֱͣӷ*/
+    if (SCSI_DEVICE_TYPE_DISK != dev->type)
+    {
+        return;
+    }
+    /*NVMEų*/
+    if (sdIsNvmeDevPatch(dev))
+    {
+        return;
+    }
+    /*ϵͳų*/
+    if (disk->isRootDisk)
+    {
+        return;
+    }
+    
+    /*ǹ״ֱ̬ӷ*/
+    if (SCSI_DEVICE_STATE_FAULT_STATE != dev->state)
+    {
+        return;
+    }
+    
+    /*IOֱӷ,㺯жREQ˴ж*/
+    if (!(SD_IO_OPCODE_READ == req->opCode && BDM_TEST_BIT(BDM_REQ_CTRL_FLAG_FAULT_DISK_IO, (void*)&req->ctrlFlag)))
+    {
+        return;
+    }
+    /*  HSSD 1812Ժ֧ؽֱӷ*/
+    
+    if (!sdIsHssdDiskType(disk))
+    {
+        return;
+    }
+    if (!sdIsHssd1812Type(disk))
+    {
+        return;
+    }
+
+    /*δؽǣϱǲؽһ̵ֻһ*/ 
+    if (RETURN_OK == sioTestAndSetQueueFlag(queue, SIO_QUEUE_FLAG_REBUILD_PATCH))
+    {
+        DBG_LogInfo(DBG_LOGID_BUTT, "REBUILD: start rebuild disk, sdid %u.", dev->sdevId);
+        sdSasReBuildDiskPatch(dev->sdevId);
+    }
+    return;
+}
+/*End: V5R7C10SPH015DTS2019050506835*/
+
+
--- ./source/private_module/bdm/sdm/sd/stub_v3/stub_sd_scsi.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/bdm/sdm/sd/stub_v3/stub_sd_scsi.c.hotpatch	2019-05-06 21:31:10.000000000 +0000
@@ -321,4 +321,80 @@
 /* PC-Lint */
 SD_USE_TRACE_POINT
 
+/*Begin: V5R7C10SPH015DTS2019050506835*/
+/************************************************************************** 
+*     : ·ؽ 
+* : uint32_t sdevId, uint8_t *cdb, int32_t direction
+* :  
+*   ֵ:  
+*     : οsdSendScsiCommand
+**************************************************************************/
+int32_t sdSendReBuildDiskCmdPatch(uint32_t sdevId, uint8_t *cdb, int32_t direction)
+{
+    REQ_S *req = NULL;
+    REQ_S *childReq = NULL;
+    GENIO_S genIo;
+
+    memset(&genIo, 0, sizeof(GENIO_S));
+    
+    BDM_ALLOCATE_REQ(req, genIo.ctrlFlag, genIo.opCode);
+    if ( NULL == req )
+    {
+        return RETURN_ERROR;
+    }
+
+    req->objectId = sdevId;
+    req->opCode = SD_IO_OPCODE_PC;
+    req->ctrlFlag = 0;
+    req->sgl = NULL;
+    /*в첽òжط*/
+    req->ops = &s_ScsiCommandOps;
+    /*NULLs_ScsiCommandOpschildDoneʹ*/
+    req->producerPrivate[0] = (uint64_t)(ptrdiff_t)NULL;
+    req->producerPrivate[1] = (uint64_t)(ptrdiff_t)NULL;
+    sioSetReqFlag(req, BDM_REQ_FLAG_SINGLE_CTRL);
+    
+    copyReq2Genio(&genIo, req);
+    childReq = sdIoGen(&genIo);
+    if ( NULL == childReq )
+    {
+        BDM_FREE_REQ(req);
+        return RETURN_ERROR;
+    }
+
+    /*ؽʱΪ40s*/
+    sioFillCmd2Req(childReq, cdb, direction, 0, 0, SD_SCSI_TIMEOUT, SD_SCSI_FLAG);
+    BDM_IOD_ADD_STARTQ(childReq);
+
+    return RETURN_OK;
+}
+
+
+/************************************************************************** 
+*     : װؽ 
+* : uint32_t sdevId
+* :  
+*   ֵ:  
+*     : οsdAtaFlushCache
+**************************************************************************/
+void sdSasReBuildDiskPatch(uint32_t sdevId)
+{
+    uint8_t cdb[SD_MAX_CDB_LEN];
+
+    memset(cdb, 0, SD_MAX_CDB_LEN);
+
+    /*Ӳ̲ṩʽ:c1 4f 0 0 0 0 0*/
+    cdb[0] = 0xc1;      /* ATA PASS-THROUGH  0xc1, ֵͬSET_DATA_DESTORY_SWITCH_ON*/  
+    cdb[1] = 0x4f;      /* protocol:non-data */
+
+    if (RETURN_OK != sdSendReBuildDiskCmdPatch(sdevId, cdb, DMA_NONE))
+    {
+        DBG_LogError(DBG_LOGID_BUTT, "Send rebuid cmd failed, sdid %u.", sdevId);
+    }
+    DBG_LogInfo(DBG_LOGID_BUTT, "Send rebuid cmd successfully, sdid %u.", sdevId);
+    return;
+}
+EXPORT_SYMBOL(sdSasReBuildDiskPatch);
+/*End: V5R7C10SPH015DTS2019050506835*/
+
 
