嵌入式linux-Jffs2根文件系统jffs2_scan_eraseblock()错误

JammyWei 2008-07-23 11:02:17
开发板自己做的,u-boot启动对flash的操作完全没问题;
内核用ramdisk启动后挂载jffs2文件系统的话,操作都正常(创建,删除,复制文件等),
但是把jffs2作为根文件系统启动的话在里面的部分文件操作会出错。

创建根文件系统的命令及参数:
/sbin/mkfs.jffs2 --eraseblock=0x10000 -l -n -d ramdisk -o rootfs.jffs2 --pad=0x400000
我对过eraseblock是正确的

1.创建空文件夹或空文件,如果文件名超过6位就不能创建

mkdir test111
MTD do_write_buffer(): WRITE 0x006eef90(0x00001985)
MTD do_write_buffer(): WRITE 0x006eefa0(0x00000001)
MTD do_write_buffer(): WRITE 0x006eefc0(0x00000000)
MTD do_write_buffer(): WRITE 0x006eefd4(0x00001985)
MTD do_write_buffer(): WRITE 0x006eefe0(0x0000000f)
MTD do_write_buffer(): WRITE 0x006eeffc(0x00006577)
MTD do_write_oneword(): WRITE 0x006eeffc(0x00006169)
Write of 47 bytes at 0x002eefd4 failed. returned -5, retlen 44

并且会造成一个文件节点的CRC错误,以后每次启动都会显示。

jffs2_scan_dirent_node(): Name CRC failed on node at 0x002eec94: Read 0x4c902bff, calculated 0x9d3f3ac1
Empty flash at 0x002eecc4 ends at 0x002eece0
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eece0: 0x0805 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eece4: 0x6a68 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eece8: 0x2bff instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eecec: 0x6530 instead
MTD do_write_buffer(): WRITE 0x006eec50(0x00001985)

2.复制文件 只要文件名小于8位就正常,多于8位同上面的错误一样。

3.编辑文件 用vi编辑文件,不知道是不是超级终端还是busybox编译vi的时候就有错误,

vi中不能删除字符,退格符被定义为ascii码^H(具体不记得是不是这个字符);

修改文件:wq退出后,有时候会出现问题,具体没搞清楚什么情况会有问题什么情况正常。

下面是修改退出后用ls出现的问题(再cat文件可以看出其实是修改了的)

Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000044)
jffs2_do_read_inode(): No data nodes found for ino #317

4 再用ramdisk启动挂载上面的jffs2文件系统,挂载时出现:

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0034225c: 0x0006 in
stead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00342260: 0x73ec in
stead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00342264: 0xb951 in
stead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00342268: 0x5e78 in
stead
Further such events for this erase block will not be printed
Empty flash at 0x003425c8 ends at 0x003425e0
Empty flash at 0x003426c8 ends at 0x003426e0
Empty flash at 0x00342fdc ends at 0x00342fe0
Empty flash at 0x00343360 ends at 0x00343380
Empty flash at 0x003433e0 ends at 0x00343400
Eep. Child "makefile~" (ino #310) of dir ino #15 doesn't exist!

/ # cd tets
cd: 5: can't cd to tets
jffs2_get_inode_nodes(): Data CRC failed on node at 0x003427f0: Read 0x0a276
581, calculated 0xeb863f74
/ # cd test
/test # ls
i2c_test.c makefile~ test_gpio.c test_i2c
makefile test_gpio test_gpio.c~
/test #
后面的操作一切又正常了,视乎系统对改flash分区就行了修补



上面的打印信息不是在一次的试验中得到的所以其中的文件名和flash地址不是对应的

我把真个测试jffs2根文件系统的串口信息用附件贴在下面,希望大家帮忙看下问题可能出现在哪里



2008.07.016
JFFS2根文件系统

boot > flinfo

Bank # 1: CFI conformant FLASH (16 x 16) Size: 8 MB in 135 Sectors

AMD Standard command set, Manufacturer ID: 0x01, Device ID: 0x7E1000

Erase timeout: 16384 ms, write timeout: 2 ms

Buffer write timeout: 5 ms, buffer size: 32 bytes



Sector Start Addresses:

02000000 RO 02002000 RO 02004000 RO 02006000 RO 02008000 RO

0200A000 RO 0200C000 RO 0200E000 RO 02010000 RO 02020000 RO

02030000 02040000 02050000 02060000 02070000

02080000 02090000 020A0000 020B0000 020C0000

020D0000 020E0000 020F0000 02100000 02110000

02120000 02130000 02140000 02150000 02160000

02170000 02180000 02190000 021A0000 021B0000

021C0000 021D0000 021E0000 021F0000 02200000

02210000 02220000 02230000 02240000 02250000

02260000 02270000 02280000 02290000 022A0000

022B0000 022C0000 022D0000 022E0000 022F0000

02300000 02310000 02320000 02330000 02340000

02350000 02360000 02370000 02380000 02390000

023A0000 023B0000 023C0000 023D0000 023E0000

023F0000 02400000 02410000 02420000 02430000

02440000 02450000 02460000 02470000 02480000

02490000 024A0000 024B0000 024C0000 024D0000

024E0000 024F0000 02500000 02510000 02520000

02530000 02540000 02550000 02560000 02570000

02580000 02590000 025A0000 025B0000 025C0000

025D0000 025E0000 025F0000 02600000 02610000

02620000 02630000 02640000 02650000 02660000

02670000 02680000 02690000 026A0000 026B0000

026C0000 026D0000 026E0000 026F0000 02700000

02710000 02720000 02730000 02740000 02750000

02760000 02770000 02780000 02790000 027A0000

027B0000 027C0000 027D0000 027E0000 027F0000


Using physmap partition definition
Creating 4 MTD partitions on "phys_mapped_flash":
0x00000000-0x00030000 : "Boot Loader"
mtd: Giving out device 0 to Boot Loader
0x00030000-0x00110000 : "OS Kernel"
mtd: Giving out device 1 to OS Kernel
0x00110000-0x00400000 : "Ramdisk"
mtd: Giving out device 2 to Ramdisk
0x00400000-0x00800000 : "Jffs2"
mtd: Giving out device 3 to Jffs2

VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 76K


BusyBox v1.00 (2008.07.14-09:41+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ # MTD do_erase_oneblock(): ERASE 0x00740000
MTD do_write_buffer(): WRITE 0x00740000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00730000
MTD do_write_buffer(): WRITE 0x00730000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00720000
MTD do_write_buffer(): WRITE 0x00720000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00710000
MTD do_write_buffer(): WRITE 0x00710000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00700000
MTD do_write_buffer(): WRITE 0x00700000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x006f0000
MTD do_write_buffer(): WRITE 0x006f0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007f0000
MTD do_write_buffer(): WRITE 0x007f0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007e0000
MTD do_write_buffer(): WRITE 0x007e0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007d0000
MTD do_write_buffer(): WRITE 0x007d0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007c0000
MTD do_write_buffer(): WRITE 0x007c0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007b0000
MTD do_write_buffer(): WRITE 0x007b0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007a0000
MTD do_write_buffer(): WRITE 0x007a0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00790000
MTD do_write_buffer(): WRITE 0x00790000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00780000
Newly-erased block contained word 0xa000a at offset 0x00380000
MTD do_erase_oneblock(): ERASE 0x00770000
MTD do_write_buffer(): WRITE 0x00770000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00760000
MTD do_write_buffer(): WRITE 0x00760000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00750000
Newly-erased block contained word 0xa000a at offset 0x00350000

/ # ls
betc etc linuxrc root syscfg usr
bin home module sbin test var
dev lib proc sys tmp web
...全文
6133 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JammyWei 2008-07-23
  • 打赏
  • 举报
回复
上传不了这个附件只能这么贴了。

个人觉得这个问题十分诡异,因为以前没做过Norflash的jffs2根文件系统,

所以也没有可对比的,做的过程基本都是参照网上的资料和方法。

下面主要要解决下面的几个问题:

1.对于新建多于6位的文件和文件夹出错,对日志式jffs2文件系统不是很了解,

准备看一些资料,看看它对文件节点的大小是否有限制等。

2.在u-boot下我看了下(jffs2区)flash每个块的头部都有0x1985这个数,

不知道这个是不是jffs2文件系统的标志或是校验。

3.系统启动时对flash有一个初始化的检测,

MTD do_write_buffer(): WRITE 0x00790000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00780000
Newly-erased block contained word 0xa000a at offset 0x00380000
MTD do_erase_oneblock(): ERASE 0x00770000
MTD do_write_buffer(): WRITE 0x00770000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00760000
MTD do_write_buffer(): WRITE 0x00760000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00750000
Newly-erased block contained word 0xa000a at offset 0x00350000


用ramdisk启动系统并挂载这个文件系统时,对于检验不对的块系统由一个自动修正的过程,

修正后这块数据又可以正常使用,而在jffs2做为根文件系统时为什么没有了这个过程。
JammyWei 2008-07-23
  • 打赏
  • 举报
回复
重启。。。。

/ # cd test
/test # ls
i2c_test.c test test_gpio.c test_i2c
makefile~ test_gpio test_gpio.c~
/test # cat test
it is a test file
/test # ls
i2c_test.c test test_gpio.c test_i2c
makefile~ test_gpio test_gpio.c~
/test # cp test test1
MTD do_write_buffer(): WRITE 0x006eecf0(0x00001985)
MTD do_write_buffer(): WRITE 0x006eed00(0x00000001)
MTD do_write_buffer(): WRITE 0x006eed20(0x00000000)
MTD do_write_buffer(): WRITE 0x006eed34(0x00001985)
MTD do_write_buffer(): WRITE 0x006eed40(0x0000000f)
MTD do_write_buffer(): WRITE 0x006eed5c(0x00006574)
MTD do_write_oneword(): WRITE 0x006eed5c(0x00006531)
Write of 45 bytes at 0x002eed34 failed. returned -5, retlen 44
MTD do_write_buffer(): WRITE 0x006eed64(0x00001985)
MTD do_write_buffer(): WRITE 0x006eed80(0x00000805)
MTD do_write_buffer(): WRITE 0x006eed8c(0x00006574)
MTD do_write_oneword(): WRITE 0x006eed8c(0x00006531)
Write of 45 bytes at 0x002eed64 failed. returned -5, retlen 44
cp: unable to open `test1': Input/output error
/test # ls
Node CRC ffe4ffe4 != calculated CRC 2ed50aab for node at 00035c74
Node header CRC failed at 002504f0. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x0000003c)
Node header CRC failed at 0024fc14. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000034)
Node header CRC failed at 0024e754. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000030)
Node header CRC failed at 00235a50. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x0000002c)
Node header CRC failed at 002326d8. But it must have been OK earlier.
Node was: { ffe4, ffe4, ffe4ffe4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x00000034)
Node header CRC failed at 00232650. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x00000030)
Node header CRC failed at 0022fd38. But it must have been OK earlier.
Node was: { ffe4, ffe4, ffe4ffe4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x0000002c)
Node header CRC failed at 001cfac8. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000044)
jffs2_do_read_inode(): No data nodes found for ino #316
/bin/sh: ls: Input/output error
/test # mkdir weijia
Node header CRC failed at 0003a18c. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x0000004c)
jffs2_do_read_inode(): No data nodes found for ino #89
/bin/sh: mkdir: Input/output error
/test # ls
Node CRC ffa4ffa4 != calculated CRC e694f64d for node at 00035c74
/bin/sh: ls: Input/output error
/test #


/test # mkdir weijia
MTD do_write_buffer(): WRITE 0x006eed90(0x00001985)
MTD do_write_buffer(): WRITE 0x006eeda0(0x00000001)
MTD do_write_buffer(): WRITE 0x006eedc0(0x00000000)
MTD do_write_buffer(): WRITE 0x006eedd4(0x00001985)
MTD do_write_buffer(): WRITE 0x006eede0(0x0000000f)
MTD do_write_buffer(): WRITE 0x006eedfc(0x00006577)
MTD do_write_oneword(): WRITE 0x006eedfc(0x00006169)
Write of 46 bytes at 0x002eedd4 failed. returned -5, retlen 44
MTD do_write_buffer(): WRITE 0x006eee04(0x00001985)
MTD do_write_buffer(): WRITE 0x006eee20(0x00000406)
MTD do_write_buffer(): WRITE 0x006eee2c(0x00006577)
MTD do_write_buffer(): WRITE 0x006eee34(0x00001985)
MTD do_write_buffer(): WRITE 0x006eee40(0x000001a4)
MTD do_write_buffer(): WRITE 0x006eee60(0x00000000)
MTD do_write_buffer(): WRITE 0x006eed90(0x00001985)
/test # ls
i2c_test.c test test_gpio.c test_i2c
makefile~ test_gpio test_gpio.c~ weijia
/test # rm -r weijia
MTD do_write_buffer(): WRITE 0x006eee78(0x00001985)
MTD do_write_buffer(): WRITE 0x006eee80(0x00009ed4)
MTD do_write_buffer(): WRITE 0x006eeea0(0x00006577)
MTD do_write_buffer(): WRITE 0x006eee04(0x00001985)
MTD do_write_buffer(): WRITE 0x006eee34(0x00001985)
/test # ls
i2c_test.c test test_gpio.c test_i2c
makefile~ test_gpio test_gpio.c~

/test # mkdir weijian
MTD do_write_buffer(): WRITE 0x006eef90(0x00001985)
MTD do_write_buffer(): WRITE 0x006eefa0(0x00000001)
MTD do_write_buffer(): WRITE 0x006eefc0(0x00000000)
MTD do_write_buffer(): WRITE 0x006eefd4(0x00001985)
MTD do_write_buffer(): WRITE 0x006eefe0(0x0000000f)
MTD do_write_buffer(): WRITE 0x006eeffc(0x00006577)
MTD do_write_oneword(): WRITE 0x006eeffc(0x00006169)
Write of 47 bytes at 0x002eefd4 failed. returned -5, retlen 44
MTD do_write_buffer(): WRITE 0x006ef004(0x00001985)
MTD do_write_buffer(): WRITE 0x006ef020(0x00000407)
MTD do_write_buffer(): WRITE 0x006ef02c(0x00006577)
MTD do_write_oneword(): WRITE 0x006ef02c(0x0000656e)
Write of 47 bytes at 0x002ef004 failed. returned -5, retlen 46
mkdir: Cannot create directory `weijian': Input/output error
/test # ls
i2c_test.c test test_gpio.c test_i2c
makefile~ test_gpio test_gpio.c~
/test #
JammyWei 2008-07-23
  • 打赏
  • 举报
回复

/proc # cat mtd

dev: size erasesize name

mtd0: 00030000 00010000 "Boot Loader"

mtd1: 000e0000 00010000 "OS Kernel"

mtd2: 002f0000 00010000 "Ramdisk"

mtd3: 00400000 00010000 "Jffs2"


/proc # cat cmdline
console=ttyAM0 115200 root=/dev/mtdblock3 rootfstype=jffs2 rw mem=32M
/proc # cd ../test
/test # ls
i2c_test.c makefile~ test_gpio.c test_i2c
makefile test_gpio test_gpio.c~
/test # rm makefile
MTD do_write_buffer(): WRITE 0x006eeb58(0x00001985)
MTD do_write_buffer(): WRITE 0x006eeb60(0x0000be78)
MTD do_write_buffer(): WRITE 0x006eeb80(0x0000616d)
MTD do_write_buffer(): WRITE 0x005cd5cc(0x00001985)
MTD do_write_buffer(): WRITE 0x005cd5fc(0x00001985)
MTD do_write_buffer(): WRITE 0x005cd600(0x000000dc)
/test # ls
i2c_test.c test_gpio test_gpio.c~
makefile~ test_gpio.c test_i2c
/test # vi test
[1;1H[0J[2;1H~
~
~
~
~[1;1H[24;1H"test" line 1 of 1 --100%--[0K[1;1H
[1;1Hi
i[24;1H"test" [modified] line 1 of 1 --100%--[0K[1;2H[1;2Ht
it
it [1;4Hi
it i[1;5Hs[1;6H[1;7H[1;7Ha[1;8H[1;9H[1;9Ht[1;10H[1;10He[1;11H[1;11Hs[1;12H[1;12Ht[1;13H[1;14H[1;14Hf[1;15H[1;15Hi[1;16H[1;16Hl[1;17H[1;17He[1;18H[1;17H[24;1H[0K:wqMTD do_write_buffer(): WRITE 0x006eeb88(0x00001985)
MTD do_write_buffer(): WRITE 0x006eeba0(0x00000000)
MTD do_write_buffer(): WRITE 0x006eebc0(0x00000000)
MTD do_write_buffer(): WRITE 0x006eebcc(0x00001985)
MTD do_write_buffer(): WRITE 0x006eebe0(0x000001a1)
MTD do_write_buffer(): WRITE 0x006eebf4(0x00006574)
MTD do_write_buffer(): WRITE 0x006eebf8(0x00001985)
MTD do_write_buffer(): WRITE 0x006eec00(0x00006409)
MTD do_write_buffer(): WRITE 0x006eec20(0x00000108)
MTD do_write_buffer(): WRITE 0x006eec3c(0x00007469)
MTD do_write_buffer(): WRITE 0x006eec40(0x00002073)
MTD do_write_buffer(): WRITE 0x006eeb88(0x00001985)
[1;17H[1;17H[24;1H"test" line 1 of 1 --100%--[0K[1;17H[24;1H[0K/test # ls
i2c_test.c test test_gpio.c test_i2c
makefile~ test_gpio test_gpio.c~
/test # cat test
it is a test file
/test # cp test test1
MTD do_write_buffer(): WRITE 0x006eec50(0x00001985)
MTD do_write_buffer(): WRITE 0x006eec60(0x00000001)
MTD do_write_buffer(): WRITE 0x006eec80(0x00000000)
MTD do_write_buffer(): WRITE 0x006eec94(0x00001985)
MTD do_write_buffer(): WRITE 0x006eeca0(0x0000000f)
MTD do_write_buffer(): WRITE 0x006eecbc(0x00006574)
MTD do_write_oneword(): WRITE 0x006eecbc(0x00006531)
Write of 45 bytes at 0x002eec94 failed. returned -5, retlen 44
MTD do_write_buffer(): WRITE 0x006eecc4(0x00001985)
MTD do_write_buffer(): WRITE 0x006eece0(0x00000805)
MTD do_write_buffer(): WRITE 0x006eecec(0x00006574)
MTD do_write_oneword(): WRITE 0x006eecec(0x00006531)
Write of 45 bytes at 0x002eecc4 failed. returned -5, retlen 44
cp: unable to open `test1': Input/output error
/test # ls
Node CRC ffe4ffe4 != calculated CRC 2ed50aab for node at 00035c74
Node header CRC failed at 002504f0. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x0000003c)
Node header CRC failed at 0024fc14. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000034)
Node header CRC failed at 0024e754. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000030)
Node header CRC failed at 00235a50. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x0000002c)
Node header CRC failed at 002326d8. But it must have been OK earlier.
Node was: { ffe4, ffe4, ffe4ffe4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x00000034)
Node header CRC failed at 00232650. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x00000030)
Node header CRC failed at 0022fd38. But it must have been OK earlier.
Node was: { ffe4, ffe4, ffe4ffe4, ffa4ffa4 }
Node totlen on flash (0xffa4ffa4) != totlen from node ref (0x0000002c)
Node header CRC failed at 001cfac8. But it must have been OK earlier.
Node was: { ffa4, ffa4, ffa4ffa4, ffa4ffa4 }
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000044)
jffs2_do_read_inode(): No data nodes found for ino #316
/bin/sh: ls: Input/output error
/test #

21,615

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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