一、问题
板子上用的nand Flash,加上yaffs2文件系统,使用一段时间后,每次开机出现类似如下错误:
Partially written block 176 detected
......
二、解决办法
1、后来去看代码搞懂了,是yaffs2文件系统,在关闭之前,要将dirty数据写入nand flash,否则下一次开机yaffs2 scan的时候,就会发现这些block是Partially written 部分写入的,所以就会提示。
解决办法就是,每次要关机之前,要去做一次:
sync
让yaffs2将dirty的数据写入到nand flash里面。同理地,每次关机之前要通过系统去关机,这样会调用到poweroff等工具,其底层实现也是会调用到sync,去写数据。不过这个办法也存在缺陷,那就是,如果是意外断电,那就还是会遇到同样问题。
2、一般情况下,自己断电之前去sync一下,是可以避免那个警告的,但是,后来经过长时间使用发现,sync只能表面地去解决数据写回,而不能清除那些Partially written 的块,这种错误,是累积性的,也就是,比如第一次意外断电是提示:
Partially written block 176 detected
....
而第二次又意外断电了,那么可能破外到别的block了,比如是175,那么下次警告的信息又会多很多:
Partially written block 175 detected
所以,随着不能正常sync而关机,会导致这些yaffs2的警告累积性地增加。
此刻就遇到从175到104(中间部分block没有这些提示),一直打印这些警告,很是烦人。而实际上,rootfs是可以正常使用的。去看了下代码,是在fs/yaffs2/yaffs_guts.c中:
static int yaffs_ScanBackwards(yaffs_Device *dev)
{
..
} else {
/* This is a partially written block that is not
* the current allocation block.
*/
T(YAFFS_TRACE_ALWAYS,
(TSTR("Partially written block %d detected" TENDSTR),
blk));
}
}
...
}
而虽然rootfs可以使用,但是为何还会有这个属性为YAFFS_TRACE_ALWAYS,即无论如何都始终提示的警告,没有详细去研究yaffs2,无从得知,既然作者加了,就有其道理。所以,直接注释掉,肯定不是好办法,当然如果只是为了开发调试,只能自己去手动注释掉,也是可以的。
3、如果想彻底解决这个问题,那只有有空去研究一下yaffs2了。或者哪位高手已经搞懂了,找到解决办法了,麻烦告诉偶一下。
4、修改 yaffs_fs.c 中 yaffs_auto_checkpoint 改成 值 2
5、修改fs/yaffs2/yaffs_guts.cstatic int yaffs_ScanBackwards(yaffs_Device * dev) 函数中
**********
T(YAFFS_TRACE_ALWAYS, /*YAFFS_TRACE_SCAN*/
(TSTR("Partially written block %d detected" TENDSTR),
blk));
**********
报错是由于YAFFS_TRACE_ALWAYS造成的。只要把它改成YAFFS_TRACE_SCAN 就OK了
阅读(2458) | 评论(0) | 转发(0) |