阅读:4060回复:13
怎么刷新文件系统的cache
我有一个基于物理磁盘的快照系统,但是为了保持文件系统的完整性,我需要将相应物理磁盘上的卷的cache包括metadata都刷下去,但是我不知道什么函数可以实现?如果有api最好,没有的话我想修改一下sfilter,但是刷新文件系统的cache具体要用到那些函数没法入手阿?
请大家帮帮忙啊 |
|
沙发#
发布于:2008-08-07 11:20
清缓存的技术活是什么时候清在哪清,至于用什么函数或方法大同小异
|
|
|
板凳#
发布于:2008-03-08 10:51
CcflushCache是可以达到目的的
|
|
|
地板#
发布于: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都不会处理,不知道为什么??? |
|
地下室#
发布于: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(); |
|
|
5楼#
发布于:2007-12-21 12:35
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
--------------------------------------------------------------------------------------------------------------------- 什么意思,是否是说对文件系统发送一个 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES,然后在存储栈中的任何一个地方,收到这个IOCTL,就可以认为snapshot准备好了,然后进行数据copy??? 3ks |
|
|
6楼#
发布于:2007-12-19 15:16
肯定要写驱动啦?
|
|
7楼#
发布于:2007-12-18 15:39
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
------------------------------------------------------------------------------------------------------------- 看来还是要写驱动阿 |
|
8楼#
发布于:2007-12-18 12:08
IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES用起来一直有点问题,不知道哪位有用成功的?分享一下。
|
|
9楼#
发布于:2007-12-17 23:20
看看fastfat的代码,文件系统在刷缓存完后会把该irp下发给存储栈,存储栈处理完后返回文件系统,此时文件系统才会释放锁。所以存储栈上的驱动在接受到此irp时,可以保证该卷上的文件系统数据是一致的。
|
|
10楼#
发布于:2007-12-17 17:56
lovehhy,你说要变态的方法,是不是IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES不行,能不能给个思路,十万分感谢
|
|
11楼#
发布于:2007-12-17 16:37
lovehhy,我看了你的帖子,我想用这个IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES刷新,block io,但是他说在ioctl返回之后就不block了,那我怎么找到那个block点啊,我想在io block的时候做些事情
|
|
12楼#
发布于:2007-12-17 16:35
呵呵,在论坛找到了这个IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES
但是我看了帮助,说的是好像是在一个命令返回执行的时候会刷新缓存并且block住io,但是如果返回了或者取消了就不block了,不知道我的理解对不对? 如果理解对了,那么我想在io block的时候干些事情,那我应该怎么做? |
|
13楼#
发布于:2007-12-17 14:29
一般的刷新刷不干净的吧,这个问题我也在论坛问过。后来我用了一个变态的办法做的,这是逆向微软的VSS之后想出来的。
|
|