|
@@ -2191,6 +2191,12 @@ static int ext3_link (struct dentry * old_dentry,
|
|
|
|
|
|
if (inode->i_nlink >= EXT3_LINK_MAX)
|
|
if (inode->i_nlink >= EXT3_LINK_MAX)
|
|
return -EMLINK;
|
|
return -EMLINK;
|
|
|
|
+ /*
|
|
|
|
+ * Return -ENOENT if we've raced with unlink and i_nlink is 0. Doing
|
|
|
|
+ * otherwise has the potential to corrupt the orphan inode list.
|
|
|
|
+ */
|
|
|
|
+ if (inode->i_nlink == 0)
|
|
|
|
+ return -ENOENT;
|
|
|
|
|
|
retry:
|
|
retry:
|
|
handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
|
|
handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
|