LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1182|回复: 0

[求教]2.6.10内核,自己做的module用generic_file_write写大数据的问题

[复制链接]
发表于 2007-5-22 15:45:07 | 显示全部楼层 |阅读模式
背景需求是这样的:

    在自己做的module里,把物理硬盘的某个分区虚拟成一个scsi硬盘,
然后对这个scsi硬盘(/dev/sda)进行数据读写的操作(用generic_file_write写入,
用generic_file_read读取)。我已经成功地将这个scsi硬盘进行fdisk分区、
mkfs.ext3格式化,甚至把整个linux复制到了/dev/sda1里,而且Linux可以成功地
从/dev/sda1启动(这一步是通过自己制作initrd,加入自己的module支持实现的),
并且运行也很正常。此时 df -h显示 /dev/sda1有1.1G的可用空间(共4.5G)。

    可现在的问题是,如果我做这样的测试(/dev/sda1已经挂载到/mnt上,/为/dev/hdc1):
//在/dev/sda1上生成400M文件
dd of=/mnt/test if=/dev/zero bs=1048576 count=400
则会导致 /dev/sda1 device reset,Linux输出信息为:
SCSI error : <0 0 0 0> return code = 0x6000000
end_request: I/O error, dev sda, sector 838319
Buffer I/O error on device sda1, logical block 104783
lost page write due to I/O error on sda1

    但是,进行从/dev/sda读取400M数据的操作又是正常的:
dd of=/test if=/dev/sda bs=1048576 count=400

(又,更晕的是,如果从/dev/hdc读入800M到/dev/sda,却又是正常的:
dd of=/mnt/test if=/dev/hdc bs=1048576 count=800
此时确定/dev/sda1是挂在/mnt上的。
)

    请问,我使用generic_file_write/read的方式操作物理硬盘,是否错误了呢?
以前也试过vfs_write/read和do_sync_write/read,但是这两个函数最终也是调用了
generic_file_write/read的啊。_filp->f_op->write这样进行写操作也是一样的错误。
还有人建议通过KERNEL发submit_bio, kblockd/0(/1)完成BIO,
请问这个应该如何实现呢?谢谢指点一二了,不胜感激:-)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表