zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
阅读:1727回复:5

虚拟的scsi硬盘读文件错误(特别怪的问题)

楼主#
更多 发布于:2005-07-28 19:21
我虚拟的scsi硬盘读文件出现了一些问题,我通过文件系统读出来的文件和我直接读物理盘读出来的结果不一样,当然我已经知道这个文件在物理磁盘上的偏移量和所占扇区数量。这样的情况一般都是由于文件系统的cache引起的吧,这种问题一般怎么解决?有什么办法禁止文件系统cache吗?
这个问题困扰了我很久,请各位大侠帮忙解决一下,谢谢先!!!
  因为我这个scsi磁盘是虚拟的,对这个虚拟的scsi磁盘的读写可能会转发到其他好几个磁盘上去,所以可能文件系统cache有点乱了。
liuyan1
驱动老牛
驱动老牛
  • 注册日期2001-08-27
  • 最后登录2023-04-18
  • 粉丝0
  • 关注0
  • 积分1031分
  • 威望477点
  • 贡献值0点
  • 好评度187点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-07-29 10:27
应该不会乱把?文件系统的cache 机制在你下边的scsi卡驱动正常的情况下是一般不会出问题的,你应该检查一下你的scsi-miniport driver 的缓冲区,页边界.还有,传输字节的大小,是否有问题,
楼上的客,楼下的客,听我老坎说明白,要苛屎有草纸,不要扯我的麦席子,要苛尿有夜壶,不要在床上划地图。
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-29 16:26
我仔细检查了一下,分析结果是这样的:如果从文件系统传入一个读操作,如果这个读的数据比较大,那么发到我miniport上的scsi读指令为几个。比如我就跟踪到以下情况,文件系统读请求的大小为65536个字节,但是发送到我的miniport上的为两条scsi读指令,其中一条读的长度为61440,另外一条读的长度为4096。只要出现这种情况,读的文件就会乱,而且乱得还有规律,就是后面的字节内容到前面去了。我跟踪了scsi读指令读的内容并通过在内核中用文件记录下来,发现并没有读错,而且顺序是正确的,为什么返回到上层顺序就错了。如果从文件系统传下来的读操作没有分割成多个scsi读指令,就不会出错。真是怪事。
如果真的这样的话,我现在只是限制它的最大传输长度来限制它,但是这个值真的不知道设置多大比较合适,我觉得非常奇怪,我开始是报告miniport的最大传输长度为65536,文件系统发出的最大读请求长度也确实是65536,但是为什么我接收到的读请求成了两条scsi读指令,而不是一条呢。

我在驱动中是这样报告传输大小的
           adapterDescriptor->MaximumTransferLength = 0x10 PAGE_SIZE;
                adapterDescriptor->MaximumPhysicalPages = 0x10;
                adapterDescriptor->AlignmentMask = 1;
                adapterDescriptor->AdapterUsesPio = TRUE;
                adapterDescriptor->AdapterScansDown = FALSE;
                adapterDescriptor->CommandQueueing = FALSE;
                adapterDescriptor->AcceleratedTransfer = FALSE;
                adapterDescriptor->BusType = BusTypeUnknown;
                adapterDescriptor->BusMajorVersion = 1;
                adapterDescriptor->BusMinorVersion = 0;
下面是引用liuyan1于2005-07-29 10:27发表的:
应该不会乱把?文件系统的cache 机制在你下边的scsi卡驱动正常的情况下是一般不会出问题的,你应该检查一下你的scsi-miniport driver 的缓冲区,页边界.还有,传输字节的大小,是否有问题,
liuyan1
驱动老牛
驱动老牛
  • 注册日期2001-08-27
  • 最后登录2023-04-18
  • 粉丝0
  • 关注0
  • 积分1031分
  • 威望477点
  • 贡献值0点
  • 好评度187点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-07-31 14:22
我觉得非常奇怪,我开始是报告miniport的最大传输长度为65536,文件系统发出的最大读请求长度也确实是65536,但是为什么我接收到的读请求成了两条scsi读指令,而不是一条呢。
____________________________________________________________
这个传输大小还要受到类驱动程序的限制,不是说文件系统和微端口驱动就可以决定的,就你说的状况,我觉得你应该好好看一下classpnp中分割部分的代码,看了那里我想你的好多疑惑都可以解决。
楼上的客,楼下的客,听我老坎说明白,要苛屎有草纸,不要扯我的麦席子,要苛尿有夜壶,不要在床上划地图。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-31 17:23
估计是指针弄错了
如果可能把你的读代码帖出来
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
weixiaoling888
驱动牛犊
驱动牛犊
  • 注册日期2009-09-27
  • 最后登录2012-12-18
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-11-11 16:14
你这个问题是怎么解决的啊。我也是SCSI MINIPORT在处理SRB写操作的时候,处理完成后调用
ScsiPortNotification(RequestComplete,pDeviceExt,pSrb);
ScsiPortNotification(NextRequest,pDeviceExt,NULL);
返回给我SCSI PORT驱动。但是SCSI PORT驱动老是发送前面偏移量相同的SRB给我处理(也就是写同样位置上的数据很多次)。一直发SRB给我处理,总是处理不完。这是什么地方出问题了啊。我用的是tiamodisk的代码。
我自己总结了两点:
一是我处理完成SRB然后通知SCSI PORT去完成的时候返回值不正确,二是我处理完成返回的参数是正确的,但是我通知SCSI PORT的时候,SCSI PORT已经超时处理掉我的SRB了。
大虾给个解释
游客

返回顶部