在Xen设置中,来自来宾VM的IO访问通过名为dom0的特权域,该域只是一个经过修改的Linux内核,它具有来自XEN管理程序的调用。对于块IO,它们具有分离驱动程序模型,其前端位于来宾VM中,后端位于domain0中的驱动程序后端。后端只是创建一个'bio'结构,并像传统的linux块驱动程序代码一样调用submit_bio()。
我的目标是检查写入磁盘的数据是否有任何问题(丢失数据,静默损坏的写入,错误的写入等)。所以我需要读取写入磁盘的数据并将其与缓存的数据副本进行比较(这是一种常见的磁盘函数,称为“写后读”)。我的问题是,是不是可以从我的后端驱动程序级别调用__bread()?调用__bread时内核崩溃..有人能理解这个的原因吗?另外,如果无法做到这一点,还有哪些其他方法可以在驱动程序的下半部分从磁盘读取特定的数据块?
我可以截取并克隆写入的生物结构,并将操作更改为我的新bio中的读取并再次调用submit_bio()吗?我这样做了,但是生成结构中由submit_bio()的完成回调返回的扇区号是一些随机值而不是我发送的那些..
感谢。
答案 0 :(得分:1)
如果这是我的任务,我会先尝试编写一个新的调度算法。首先复制cfq
或deadline
或noop
或as
调度代码,然后从那里开始处理,以便在接受写入请求后自行提交读取命令。 noop
可能是最容易修改,在写入后立即读取 并向上传播错误,但我无法想象性能会非常好。但是,如果你使用其他调度程序之一作为基础,那么在写入之后立即发出错误可能要困难得多 - 可能在读取再次安排之前已经过了几秒钟 - 所以它实际上只是事后可用作诊断,而不是直接有益于应用程序的东西。