定位的一个yaffs2文件系统的bug

定位了一个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链表指向了自己,很明显是已经释放掉了。由于链表节点指向自己,因此造成死

你可能感兴趣的:(Linux/Unix,文件系统,文件系统,linux,内核,栈)