发现不深入了解jffs2完全无法理解错误的根源。更别说找出错误了。还是脚踏实地慢慢来吧。
根据5的一些输出信息。我来一步步分析吧
输入mkdir命令后。会调用 jffs2_mknod函数,目录也是一个node
1:首先分配一个jffs2_raw_inode类型
2:进入jffs2_reserve_space函数,保留空间,如果需要保留的空间不够,会触发jffs2_garbage_collect_pass函数,暂时不考虑gc部分。
3:如果需要保留的空间够,那么直接调用jffs2_do_reserve_space函数去保留空间。因此c->nextblock这时候还没有值,那么需要从free_list中找到一个挂接到上面使用。拿出来的节点在free_list中删除。这个时候c->nextblock指向一个有足够空间的区域。
4:调用jffs2_mark_node_obsolete函数,标记node是过时的,也就是用过的意思吧,因为之前擦除的块里面写了12个字节的mark,所以当被使用的时候这12个byte可以被用来储存数据。所以成为过时的吧obsolete
flash地址的最低位用来表示过时标志,bit1用来表示未使用。
ref->flash_offset = ref_offset(ref) | REF_OBSOLETE;
5:读取mark。然后更改类型再写入。称之为消除过时node,这时候就给出有多少空间可以用。
6:创建一个新的node,类型是_inode,然后填写它的各种属性,然后调用jffs2_write_dnode
这里面有另一个结构体
/*
Larger representation of a raw no