weixiaoling888
驱动牛犊
驱动牛犊
  • 注册日期2009-09-27
  • 最后登录2012-12-18
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2661回复:1

关于tiamodisk的scsi 虚拟磁盘驱动的问题

楼主#
更多 发布于:2009-11-10 00:28
你们有用过tiamo的这个基于scsi的虚拟磁盘驱动程序吗?不知道你试过在虚拟磁盘中写一个大文件的时候,这个tiamoport会一直循环写下去,但是就是写不完,把系统都搞死了。我在write10函数中打印Offset,发现在打印中有很多相同的Offset,就是在写一个大文件的时候,一个相同的偏移位置写很多次数据。写小文件没问题。
    我想的话是不是文件太大导致SRB太多,在链表上不能及时处理,导致SRB超时。你们谁有能够通过测试的scsi vdisk驱动,给小弟一份非常感谢,邮箱地址lixuekui88@qq.com
weixiaoling888
驱动牛犊
驱动牛犊
  • 注册日期2009-09-27
  • 最后登录2012-12-18
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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);
}
游客

返回顶部