定位了一个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);
yaffs_flush_file(obj, 1, 0, 0);
}
}
}
原因分析:
通过kdb查看寄存器分析反汇编代码,发现当前正在使用的inode的i_sb_list链表指向了自己,很明显是已经释放掉了。由于链表节点指向自己,因此造成死