On 2011-08-31 07:53, JiSheng Zhang wrote: > Hi List, > > I can only send email using webui now. so the patch is attached. I can > resend the patch in email body if necessary later. > > The bug can only be triggered under SMP and heavy stress test. > > What happen is that the list_for_each_entry() loop in yaffs flush inodes > routine can race with inodes deleting, so the inode can go away before > list_for_each_entry() get the next node. This leads to a endless loop > which will cause softlockup. We fix the problem by keeping reference to > it and putting the reference only after we have safely resumed the scan > of the inode list. > > Since __iget() and the inode lock are not exported, yaffs can not be selected > as M after this change > > Signed-off-by: Jisheng Zhang > --- > Kconfig_multi | 2 +- > Kconfig_single | 2 +- > yaffs_vfs_multi.c | 29 ++++++++++++++++++++++++++++- > yaffs_vfs_single.c | 24 +++++++++++++++++++++++- > 4 files changed, 53 insertions(+), 4 deletions(-) > Hi JiSheng, I encounter the same problem with you. There are some questions about your patch. 1. + yaffs_gross_unlock(dev); + iput(old_iptr); + yaffs_gross_lock(dev); Before iput(), the gross_lock is unlocked, then in the iput funcioin, it will be locked again. My question is, can you ensure it is safe between unlock and lock? 2. + spin_unlock(&inode_sb_list_lock); //here should yaffs_gross_unlock(dev) also + iput(old_iptr); //then yaffs_gross_lock(dev);