阅读:1727回复:5
虚拟的scsi硬盘读文件错误(特别怪的问题)
我虚拟的scsi硬盘读文件出现了一些问题,我通过文件系统读出来的文件和我直接读物理盘读出来的结果不一样,当然我已经知道这个文件在物理磁盘上的偏移量和所占扇区数量。这样的情况一般都是由于文件系统的cache引起的吧,这种问题一般怎么解决?有什么办法禁止文件系统cache吗?
这个问题困扰了我很久,请各位大侠帮忙解决一下,谢谢先!!! 因为我这个scsi磁盘是虚拟的,对这个虚拟的scsi磁盘的读写可能会转发到其他好几个磁盘上去,所以可能文件系统cache有点乱了。 |
|
沙发#
发布于:2005-07-29 10:27
应该不会乱把?文件系统的cache 机制在你下边的scsi卡驱动正常的情况下是一般不会出问题的,你应该检查一下你的scsi-miniport driver 的缓冲区,页边界.还有,传输字节的大小,是否有问题,
|
|
|
板凳#
发布于: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发表的: |
|
地板#
发布于:2005-07-31 14:22
我觉得非常奇怪,我开始是报告miniport的最大传输长度为65536,文件系统发出的最大读请求长度也确实是65536,但是为什么我接收到的读请求成了两条scsi读指令,而不是一条呢。
____________________________________________________________ 这个传输大小还要受到类驱动程序的限制,不是说文件系统和微端口驱动就可以决定的,就你说的状况,我觉得你应该好好看一下classpnp中分割部分的代码,看了那里我想你的好多疑惑都可以解决。 |
|
|
地下室#
发布于:2005-07-31 17:23
估计是指针弄错了
如果可能把你的读代码帖出来 |
|
|
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了。 大虾给个解释 |
|