Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1377847
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类: LINUX

2012-04-28 14:27:09

一、问题

板子上用的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) |
给主人留下些什么吧!~~