Why does d_splice_alias need to check IS_ROOT?

From: Lei Chen
Date: Sat May 26 2018 - 12:33:47 EST


Hello list,

I'm insteresting in how hard link and denry lookup work and their
implementation.

I know that this interface tries to connect an inode to a dentry, but
why does it need
to check whether the inode alias IS_ROOT if the inode represents a directory?
And the code process in different way according to check result. What
occasions
are they used for?

struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
{
if (S_ISDIR(inode->i_mode)) {
struct dentry *new = __d_find_any_alias(inode);
if (unlikely(new)) {
if (unlikely(d_ancestor(new, dentry))) {
/*the code here is to forbidden ancestor hard link*/
} else if (!IS_ROOT(new)) {
__d_unalias(inode, dentry, new);
} else {
__d_move(new, dentry, false);
}

}


}
}

Thanks in advance.

Regards,
Larry