阅读:2661回复:1
关于tiamodisk的scsi 虚拟磁盘驱动的问题
你们有用过tiamo的这个基于scsi的虚拟磁盘驱动程序吗?不知道你试过在虚拟磁盘中写一个大文件的时候,这个tiamoport会一直循环写下去,但是就是写不完,把系统都搞死了。我在write10函数中打印Offset,发现在打印中有很多相同的Offset,就是在写一个大文件的时候,一个相同的偏移位置写很多次数据。写小文件没问题。
我想的话是不是文件太大导致SRB太多,在链表上不能及时处理,导致SRB超时。你们谁有能够通过测试的scsi vdisk驱动,给小弟一份非常感谢,邮箱地址lixuekui88@qq.com |
|
沙发#
发布于:2009-11-10 09:50
继续测试结果说明:tiamodisk根本不能写数据,其实再小的文件写完了,其实是表面上写完了,也算是真正的写完了,在pal.iso中已经写成功了。但是返回给系统的完成SRB还是错误的,因为tiamominiport还是会收到来自scsiport的SRB包,这些SRB中的逻辑地址块的偏移量和前面写过的SRB中的相同。这证明了写这个文件的SRB一直没有完成。为什么会这样?难道你们的没有这个问题吗?非常急迫想解决这个问题。
相关代码: #define MINIPORT_TIMER_PERIOD 100000 // start io BOOLEAN MiniportStartIo(PVOID pDeviceExt,PSCSI_REQUEST_BLOCK pSrb) { pSrb->SrbStatus = SRB_STATUS_PENDING; PMiniportExt pExt = static_cast<PMiniportExt>(pDeviceExt); if(KeGetCurrentIrql() > DISPATCH_LEVEL) { devDebugPrint(DRIVER_NAME"*******MiniportStartIo...this should not happen.\n"); SetSrbSenseCode(pSrb,DEVICE_NOT_READY); } else { PSrbExt pSrbExt = static_cast<PSrbExt>(pSrb->SrbExtension); pSrbExt->m_pSrb = pSrb; pSrbExt->m_ulType = Normal; ExInterlockedInsertTailList(&g_ltRequestHead,&pSrbExt->m_ltEntry,&g_ltRequestLock); // devDebugPrint(DRIVER_NAME"*******MiniportStartIo...pSrb->TimeOutValue:%d\n", pSrb->TimeOutValue); KeSetEvent(&g_evRequestArrival,IO_NO_INCREMENT,FALSE); } return TRUE; } // miniport initialize BOOLEAN MiniportInitialize(PVOID pDeviceExt) { devDebugPrint(DRIVER_NAME"*******MiniportInitialize...just set mount event,and wait for 5 seconds to let work thread do all the thing.\n"); PMiniportExt pExt = static_cast<PMiniportExt>(pDeviceExt); LARGE_INTEGER timeout; timeout.QuadPart = -50000000; KEVENT evFinish; KeInitializeEvent(&evFinish,NotificationEvent,FALSE); ThreadContext context; context.m_pFinishEvent = &evFinish; context.m_pMiniportExt = static_cast<PMiniportExt>(pDeviceExt); context.m_ulType = Mount; ExInterlockedInsertTailList(&g_ltRequestHead,&context.m_ltEntry,&g_ltRequestLock); KeSetEvent(&g_evRequestArrival,IO_NO_INCREMENT,FALSE); NTSTATUS status = KeWaitForSingleObject(&evFinish,Executive,KernelMode,FALSE,&timeout); if(status == STATUS_SUCCESS && context.m_retStatus == STATUS_SUCCESS) { devDebugPrint(DRIVER_NAME"*******MiniportInitialize...work thread finished successfully,then set timer,and return true.\n"); ScsiPortNotification(RequestTimerCall,pDeviceExt,MiniportCheckFinishTimer,MINIPORT_TIMER_PERIOD); return TRUE; } devDebugPrint(DRIVER_NAME"*******MiniportInitialize...work thread met an error %d,so return true.\n",status); return FALSE; } // check finish timer VOID MiniportCheckFinishTimer(PVOID pDeviceExt) { if(DoCheckFinish(pDeviceExt)) { ScsiPortNotification(RequestTimerCall,pDeviceExt,MiniportCheckFinishTimer,MINIPORT_TIMER_PERIOD); } else { devDebugPrint(DRIVER_NAME"*******MiniportCheckFinishTimer...DoCheckFinish return false,do not request another timer call\n"); } } // check finish timer call BOOLEAN DoCheckFinish(PVOID pDeviceExt) { PMiniportExt pExt = static_cast<PMiniportExt>(pDeviceExt); // remove entry PLIST_ENTRY pltEntry = ExInterlockedRemoveHeadList(&g_ltFinishHead,&g_ltFinishLock); BOOLEAN bRet = TRUE; while(pltEntry) { PThreadContext pContext = CONTAINING_RECORD(pltEntry,ThreadContext,m_ltEntry); switch(pContext->m_ulType) { case Normal: FinishRequest(pExt,pContext->m_pSrb); break; case Shutdown: devDebugPrint(DRIVER_NAME"*******DoCheckFinish meets a shutdown request,then return false.this will end the timer call.\n"); bRet = FALSE; break; } // next entry pltEntry = ExInterlockedRemoveHeadList(&g_ltFinishHead,&g_ltFinishLock); } return bRet; } // complete the request VOID FinishRequest(PVOID pDeviceExt,PSCSI_REQUEST_BLOCK pSrb) { ScsiPortNotification(RequestComplete,pDeviceExt,pSrb); ScsiPortNotification(NextRequest,pDeviceExt,NULL); } |
|