定位了一个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) {
&n

本文分享了在Linux内核2.6.32版本中,yaffs2文件系统在`yaffs_flush_inodes`函数出现的死循环问题。问题源于在并发条件下,inode的`i_sb_list`链表指向自身导致的。分析指出,VFS层和YAFFS文件系统之间的锁保护不足是问题关键。建议文件系统应减少与VFS层的直接交互,特别是避免操作VFS的数据结构,以实现更好的解耦。
订阅专栏 解锁全文
8131





