mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
阅读:4061回复:13

怎么刷新文件系统的cache

楼主#
更多 发布于:2007-12-17 13:42
我有一个基于物理磁盘的快照系统,但是为了保持文件系统的完整性,我需要将相应物理磁盘上的卷的cache包括metadata都刷下去,但是我不知道什么函数可以实现?如果有api最好,没有的话我想修改一下sfilter,但是刷新文件系统的cache具体要用到那些函数没法入手阿?
请大家帮帮忙啊
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-17 16:35
呵呵,在论坛找到了这个IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES
但是我看了帮助,说的是好像是在一个命令返回执行的时候会刷新缓存并且block住io,但是如果返回了或者取消了就不block了,不知道我的理解对不对?
如果理解对了,那么我想在io block的时候干些事情,那我应该怎么做?
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-12-17 16:37
lovehhy,我看了你的帖子,我想用这个IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES刷新,block io,但是他说在ioctl返回之后就不block了,那我怎么找到那个block点啊,我想在io block的时候做些事情
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-17 17:56
lovehhy,你说要变态的方法,是不是IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES不行,能不能给个思路,十万分感谢
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-12-18 15:39
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
-------------------------------------------------------------------------------------------------------------
看来还是要写驱动阿
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-12-27 15:58
谢谢楼上诸位
我用了fatmouse527的方法,不过好像CcFlushCache起作用了,其他的都是空的没有执行。
我的fileobject是用zwcreatefile(volumename,..然后ObReferenceObjectByHandle获取的,不知道对不对?CcFlushCache能把metadata刷下去吗?
ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource, FALSE))是不是已经确保了在他的范围内对该卷没有别的操作?我现在还在刷下去的时候对写block了一下,不知道好不好使。
还有我发现一个现象,如果对一个卷的有某个irp不返回的话,那么针对该卷的其他irp都不会处理,不知道为什么???
游客

返回顶部