When a directory hierarchy is corrupted (e. g. due to a bit flip on the media), it can happen that it contains loops of directories. That creates possibilities for deadlock when locking directories. Fix the problem by checking in d_splice_alias() that when we splice a directory, it does not have any other connected alias. Reported-by: Sami Liedes <sami.liedes@xxxxxx> CC: "J. Bruce Fields" <bfields@xxxxxxxxxxxx> Signed-off-by: Jan Kara <jack@xxxxxxx> --- fs/dcache.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) Sorry guys, I'm resending this again because I messed up list address previously. diff --git a/fs/dcache.c b/fs/dcache.c index 4046904..afe81fe 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1658,6 +1658,11 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) d_move(new, dentry); iput(inode); } else { + if (unlikely(!list_empty(&inode->i_dentry))) { + spin_unlock(&inode->i_lock); + iput(inode); + return ERR_PTR(-EIO); + } /* already taking inode->i_lock, so d_add() by hand */ __d_instantiate(dentry, inode); spin_unlock(&inode->i_lock); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html