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

怎么刷新文件系统的cache

楼主#
更多 发布于:2007-12-17 13:42
我有一个基于物理磁盘的快照系统,但是为了保持文件系统的完整性,我需要将相应物理磁盘上的卷的cache包括metadata都刷下去,但是我不知道什么函数可以实现?如果有api最好,没有的话我想修改一下sfilter,但是刷新文件系统的cache具体要用到那些函数没法入手阿?
请大家帮帮忙啊
lovehhy
驱动小牛
驱动小牛
  • 注册日期2007-09-17
  • 最后登录2010-09-17
  • 粉丝0
  • 关注0
  • 积分1028分
  • 威望244点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-17 14:29
一般的刷新刷不干净的吧,这个问题我也在论坛问过。后来我用了一个变态的办法做的,这是逆向微软的VSS之后想出来的。
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不行,能不能给个思路,十万分感谢
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-12-17 23:20
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
lovehhy
驱动小牛
驱动小牛
  • 注册日期2007-09-17
  • 最后登录2010-09-17
  • 粉丝0
  • 关注0
  • 积分1028分
  • 威望244点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-12-18 12:08
IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES用起来一直有点问题,不知道哪位有用成功的?分享一下。
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-12-18 15:39
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
-------------------------------------------------------------------------------------------------------------
看来还是要写驱动阿
lovehhy
驱动小牛
驱动小牛
  • 注册日期2007-09-17
  • 最后登录2010-09-17
  • 粉丝0
  • 关注0
  • 积分1028分
  • 威望244点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-12-19 15:16
肯定要写驱动啦?
newkey
驱动小牛
驱动小牛
  • 注册日期2002-10-03
  • 最后登录2013-10-13
  • 粉丝1
  • 关注0
  • 积分45分
  • 威望392点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-12-21 12:35
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
---------------------------------------------------------------------------------------------------------------------
什么意思,是否是说对文件系统发送一个 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES,然后在存储栈中的任何一个地方,收到这个IOCTL,就可以认为snapshot准备好了,然后进行数据copy???

3ks
www.xDrv.com
fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2007-12-22 16:32
不知道是不是你想要的
KeEnterCriticalRegion();
    
                if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource, FALSE))
                {
                    
                    //if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource, FALSE))
                    {

                        if(FileObject->SectionObjectPointer)
                        {
                          IoSetTopLevelIrp( (PIRP)FSRTL_FSP_TOP_LEVEL_IRP );

                          CcFlushCache( FileObject->SectionObjectPointer, NULL, 0, NULL );
                                                      
                          if(FileObject->SectionObjectPointer->ImageSectionObject)
                          {
                              MmFlushImageSection(
                                        FileObject->SectionObjectPointer,
                                        MmFlushForWrite//MmFlushForDelete//
                                        ) ;
                          }
                          
                                        
                          if(FileObject->SectionObjectPointer->DataSectionObject)
                          {
                            CcPurgeCacheSection( FileObject->SectionObjectPointer,
                                          NULL,
                                          0,
                                          FALSE ); //为TRUE,会强迫所有的FileObject重新初始化Cache                                                        
                          }
                          
                          if(FileObject->PrivateCacheMap)
                          {
                            CcUninitializeCacheMap(FileObject, NULL, NULL);;  
                          }
                          

                          if(FileObject->SectionObjectPointer->DataSectionObject)
                          {
                            //Interval.QuadPart = DELAY_ONE_MILLISECOND * 500;//500ms
                            //KeDelayExecutionThread(KernelMode, FALSE, &Interval);
                                                              
                            MmForceSectionClosed( FileObject->SectionObjectPointer,
                                          TRUE//改为TRUE,彻底刷新缓存!!!
                                          );
                          }                                      
                          IoSetTopLevelIrp(NULL);                                    
                        }
                        

                        //ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource );                      
                    }                    
                    ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource );                      
                }
                        
                KeLeaveCriticalRegion();
驱网无线,快乐无限
mikechen2003
驱动牛犊
驱动牛犊
  • 注册日期2006-02-18
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分142分
  • 威望69点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
11楼#
发布于: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都不会处理,不知道为什么???
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-03-08 10:51
CcflushCache是可以达到目的的
向前,向前,向前....
BITI_Ceasar
驱动牛犊
驱动牛犊
  • 注册日期2007-04-03
  • 最后登录2012-08-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-08-07 11:20
清缓存的技术活是什么时候清在哪清,至于用什么函数或方法大同小异
博观而约取、厚积而薄发
游客

返回顶部