QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1410|回复: 1

jffs2文件系统的fsync()是不是效率很低啊?

[复制链接]
发表于 2006-5-29 10:42:35 | 显示全部楼层 |阅读模式
我们做嵌入式产品的,对掉电保护都很重视,在nand flash上使用jffs2文件系统,经常在写入关键数据后要调用fsync()来保证把数据写入flash,但我看了下代码觉得对于jffs2来讲sys_fsync()效率太低了,应该修改一下,不知道大家有什么意见?
asmlinkage long sys_fsync(unsigned int fd)
{
。。。
        /* We need to protect against concurrent writers.. */
        down(&inode->i_sem);
        ret = filemap_fdatasync(inode->i_mapping);
//在上面这个函数里面,已经把该文件在内存里面的脏页面都刷新到flash上去了,而且是以4KB为单位刷新所有的脏页面,写flash操作很大。
//这个操作对于jffs2文件系统来说是多余的,因为jffs2是日志式文件系统,并没有原地改写flash内容

        err = file->f_op->fsync(file, dentry, 0);
//然后,这里又把jffs2的缓冲buffer写入flash。
        if (err && !ret)
                ret = err;
        err = filemap_fdatawait(inode->i_mapping);
        if (err && !ret)
                ret = err;
        up(&inode->i_sem);
。。。
}

我做了一些试验,大量的调用fsync()函数会导致jffs2效率非常低,对于jffs2文件系统应该屏蔽filemap_fdatasync(),不知道有没有人注意这个问题?
请讨论,谢谢!
 楼主| 发表于 2006-5-30 17:27:07 | 显示全部楼层
不好意思!
我说错了:)
filemap_fdatasync(inode->i_mapping); 并没有把脏页面刷新到flash上去,因为它最终是调用writepage()函数来写数据的,而jffs2文件系统没有定义writepage()函数,因此在这个函数里并没有写flash。
我做了试验,把分区映像传上来看了一下,确实没有因为fsync而多写脏页面。
但是fsync要把buffer中的数据都写到flash上去,并且是边界填充后整页写,因此还是要尽量少用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-23 09:32 , Processed in 0.038078 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表