Commit 95ba293c authored by Jan Kara's avatar Jan Kara Committed by james toy

In theory it could happen that on one CPU we initialize a new inode but

clearing of I_NEW | I_LOCK gets reordered before some of the
initialization.  Thus on another CPU we return not fully uptodate inode
from iget_locked().

This seems to fix a corruption issue on ext3 mounted over NFS.
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 015970e8
...@@ -702,6 +702,7 @@ void unlock_new_inode(struct inode *inode) ...@@ -702,6 +702,7 @@ void unlock_new_inode(struct inode *inode)
* just created it (so there can be no old holders * just created it (so there can be no old holders
* that haven't tested I_LOCK). * that haven't tested I_LOCK).
*/ */
smp_mb();
WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW)); WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));
inode->i_state &= ~(I_LOCK|I_NEW); inode->i_state &= ~(I_LOCK|I_NEW);
wake_up_inode(inode); wake_up_inode(inode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment