如何清除 block device 到buffer cache

yanghuajia 2011-05-10 08:11:11
正在开发一个特殊系统,已经mount起来的硬盘上的FAT32分区会被底层增加删除文件,而linux系统不知道。这样的话,目前只有先umount,再mount才能让系统知道文件系统已经发生变化。

目前发现修改过后通过 dd命令获取分区内容,得到到镜像文件里面还没有修改。这样似乎可以判断 系统应该有block io cache.
文件系统被悄悄修改过后,执行这些命令

ls /security
看不到增加的文件

dd if=/dev/sda5 of=sda5_img
mount -o loop sda5_img /mnt
检查/mnt发现还没有被修改, 看不到增加的文件

umount /security
mount /dev/sda5 /security
这时候显示已经被修改了。

...全文
200 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanghuajia 2011-05-23
  • 打赏
  • 举报
回复
看来只能先采用我到方法了
yanghuajia 2011-05-16
  • 打赏
  • 举报
回复
研究过了,似乎 media_changed 不知道如何应用到分区上,在磁盘可以,但是我又不需要修改全部磁盘。
nkcelling 2011-05-13
  • 打赏
  • 举报
回复
可以参考drivers/block/floppy.c,

在相应的块设备驱动的block_device_operations结构中实现media_changed回调函数,永远返回1。

实现FDFLUSH ioctl,调用check_disk_change来回写。

loop driver没有实现这个功能,要改写驱动,比较麻烦了。

yanghuajia 2011-05-12
  • 打赏
  • 举报
回复
因为lock,不能直接调用直接 __invalidate_device。 同步问题会出现在同时改写一个文件或者目录上面,好在每次只会有一个改写文件系统。
nkcelling 2011-05-12
  • 打赏
  • 举报
回复
确实有问题,__invalidate_device能够实现你的需求吗?

那就每个block device导出一个属性来调用这个函数。

不过这种同步方法终归不能够实用,如果两边一起修改文件系统的话没有同步机制,

很容易损坏文件系统,最好一个可写mount,其他都只读mount,应该就没问题了。
yanghuajia 2011-05-12
  • 打赏
  • 举报
回复
全部情况实验了过了,不是全部情况都正确。

首先是 分区根目录到文件和文件夹不能更新。 其次, 底层文件夹下也不一定能更新。 最后一点就是偶尔文件内容也不回修改。

看起来相对驱动的3行函数,做的事情还是不够多。
yanghuajia 2011-05-12
  • 打赏
  • 举报
回复
谢谢2楼,就是需要这样的方法,不然就要写驱动了。
yanghuajia 2011-05-12
  • 打赏
  • 举报
回复
我试验一下2楼到方法。

目前我是参考 __invalidate_device , 执行下列函数

shrink_dcache_sb(sb);

invalidate_inodes(sb, 0);

invalidate_bdev(sb->s_bdev);
nkcelling 2011-05-11
  • 打赏
  • 举报
回复
drop_caches
-----------

Writing to this will cause the kernel to drop clean caches, dentries and
inodes from memory, causing that memory to become free.

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

As this is a non-destructive operation and dirty objects are not freeable, the
user should run `sync' first.


写的一方写完以后需要sync,

读的一方读之前用echo 3 > /proc/sys/vm/drop_caches清一下cache即可
voice_shen 2011-05-10
  • 打赏
  • 举报
回复
After you finish writing data, please execute sync command.
for example:
$sync

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧