定位了一个yaffs文件系统的bug,分享出来,如果有遇到相同的问题,少走弯路。
linux内核版本为2.6.32,yaffs版本为最新版本。
问题现象:
yaffs代码在yaffs_flush_inodes函数中出现死循环:
首先这个函数是在sync操作时调用的。
调用栈为:sys_sync-->sync_filesystems-->yaffs_sync_fs->yaffs_do_sync_fs-->yaffs_flush_super-->yaffs_flush_inodes
static void yaffs_flush_inodes(struct super_block *sb)
{
struct inode *iptr;
struct yaffs_obj *obj;
list_for_each_entry(iptr, &sb->s_inodes, i_sb_list) { --------这里要遍历yaffs分区超级块的所有inodes,这里出现了死循环。
obj = yaffs_inode_to_obj(iptr);
if (obj) {
yaffs_trace(YAFFS_TRACE_OS,
"flushing obj %d", obj->obj_id);