yaffs2 文件系统挂载使用出错

panbo6510 2010-09-27 11:18:09
我的根文件系统是jffs2,内核版本是2.6.26。修改了内核代码让其支持yaffs2。结果在挂载使用yaffs2文件系统的时候出错了。

(nand flash 是硬件ecc,修改后proc 下已经出现了yaffs2相关信息)
1.我先 执行flash_eraseall /dev/mtd3
2.接着挂在第3个分区 mount -t yaffs2 /dev/mtblock3 /mnt/yaffs2 出现下面的信息
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
block 2714 is bad
block 3589 is bad
block 3590 is bad
block 3591 is bad
block 3592 is bad
yaffs_read_super: isCheckpointed 0
并且 /mnt/yaffs2中只有lost+found文件夹
3.之后再/mnt/yaffs2文件下 创建了一些文件和文件夹
4.解除挂载后 umount /mnt/yaffs2下列信息出现
save exit: isCheckpointed 1
save exit: isCheckpointed 1
5.再次挂在mount -t yaffs2 /dev/mtblock3 /mnt/yaffs2 出现下面的错误信息,并且/mnt/yaffs2文件夹下只有lost+found文件夹,创建的文件和文件夹都不见了。

yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
block 2714 is bad
block 3589 is bad
block 3590 is bad
block 3591 is bad
block 3592 is bad
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
Partially written block 2 detected
yaffs_read_super: isCheckpointed 0

谁能提点意见阿?
...全文
852 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yunfly163 2012-03-17
lz能不能做个博客,发表下你怎么解决的呀??
回复
ab421701136 2011-04-29
[Quote=引用 16 楼 panbo6510 的回复:]
问题解决了,umount->mount后创建的文件消失是因为我强制设成ECC_NONE后,ecc.read_oob函数采用的MTD默认的操作函数,此函数的无法正确读取OOB区域,yaffs2系统挂载的时候,检测到不正确的OOB区域文件就会消失。
将对应MCU的NFC的oob操作函数赋给 ecc.read_oob函数,这个问题就解决了。
[/Quote]


你好,我现在也遇到和你一样的问题,能不能更具体的介绍一下你的操作,最好能具体到某一个文件。
回复
panbo6510 2010-10-08
问题解决了,umount->mount后创建的文件消失是因为我强制设成ECC_NONE后,ecc.read_oob函数采用的MTD默认的操作函数,此函数的无法正确读取OOB区域,yaffs2系统挂载的时候,检测到不正确的OOB区域文件就会消失。
将对应MCU的NFC的oob操作函数赋给 ecc.read_oob函数,这个问题就解决了。
回复
panbo6510 2010-09-29
[Quote=引用 10 楼 panbo6510 的回复:]
我还有一点很疑惑,nandmtd2_WriteChunkWithTagsToNAND()函数中用到了 mtd->write_ecc()
可是我察看6.26内核linux/mtd/mtd.h中struct mtd_info,struct mtd_info中根本没有write_ecc这成员函数。可是为啥内核还能编译通过呢?
[/Quote]
失误了,看错了。
没注意到2.6.17的预编译控制
回复
panbo6510 2010-09-29
我还有一点很疑惑,nandmtd2_WriteChunkWithTagsToNAND()函数中用到了 mtd->write_ecc()
可是我察看6.26内核linux/mtd/mtd.h中struct mtd_info,struct mtd_info中根本没有write_ecc这成员函数。可是为啥内核还能编译通过呢?
回复
panbo6510 2010-09-29
[Quote=引用 8 楼 pottichu 的回复:]
不完全是软件的行为, 因为还有 ecc 校验是跟 oob 的布局相关的。
你可以先关闭 ECC 选项再试试。
[/Quote]
我的这个系统里把mtd的ecc mode设成NONE的时候,系统挂载的时候就会死掉

不过我把板子的Nand Flash换成2KB,64byte的,现象是一样的,看来跟4k,2k没有关系
回复
panbo6510 2010-09-29
最新情况:
现在Partially written block 2 detected的问题已经解决了
原因是:上层yaffs2的oob区要写入28byte的tag,但是由于我的mtd驱动中的ecc layout中可读写的长度只有4,所以在写入oob区时,只写入了28byte的头4byte,将ecc layout 中的可读写的长度改为>28,即解决此问题。

不过umount->mount之后创建的文件还是没有
回复
pottichu 2010-09-28
[Quote=引用 5 楼 panbo6510 的回复:]

2.26的内核和yaffs2支持 128byte的oob操作吗?
[/Quote]

目前应该不支持吧, 你需要查看 你的 flash 的芯片资料,
看他对应的 oob 信息中,第几位是用来标记坏快的。
回复
panbo6510 2010-09-28
2.26的内核和yaffs2支持 128byte的oob操作吗?
回复
panbo6510 2010-09-28
[Quote=引用 2 楼 pottichu 的回复:]
问题的重点在于你的 flash 是多大的, 或者说每个 page 是 512 Byte or 2048 Byte ?
两者的 oob 信息存放方式是不同的。

http://blog.csdn.net/pottichu/archive/2009/07/23/4372593.aspx
[/Quote]

我的flash是三星的,每个Page 4KByte,oob是128byte
回复
pottichu 2010-09-28
不完全是软件的行为, 因为还有 ecc 校验是跟 oob 的布局相关的。
你可以先关闭 ECC 选项再试试。
回复
panbo6510 2010-09-28
[Quote=引用 6 楼 pottichu 的回复:]
引用 5 楼 panbo6510 的回复:

2.26的内核和yaffs2支持 128byte的oob操作吗?


目前应该不支持吧, 你需要查看 你的 flash 的芯片资料,
看他对应的 oob 信息中,第几位是用来标记坏快的。
[/Quote]

datasheet中好像没有这方面的信息。不过从代码上来看oob的使用方式是软件实现的吧。
回复
Jerry_Lee01 2010-09-27
我感觉你没有创建设备节点,用:mknod /dev/xxx b 8 1试试
回复
pottichu 2010-09-27
问题的重点在于你的 flash 是多大的, 或者说每个 page 是 512 Byte or 2048 Byte ?
两者的 oob 信息存放方式是不同的。

http://blog.csdn.net/pottichu/archive/2009/07/23/4372593.aspx
回复
pottichu 2010-09-27
你的问题基本可以确定是 mtd 层 oob 信息和 yaffs 的配合问题。
参考我的 blog 修改吧。

http://blog.csdn.net/pottichu/archive/2009/07/21/4367918.aspx
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4152

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2010-09-27 11:18
社区公告
暂无公告