|
@@ -1523,6 +1523,28 @@ struct dentry * d_alloc_root(struct inode * root_inode)
|
|
|
}
|
|
|
EXPORT_SYMBOL(d_alloc_root);
|
|
|
|
|
|
+static struct dentry * __d_find_any_alias(struct inode *inode)
|
|
|
+{
|
|
|
+ struct dentry *alias;
|
|
|
+
|
|
|
+ if (list_empty(&inode->i_dentry))
|
|
|
+ return NULL;
|
|
|
+ alias = list_first_entry(&inode->i_dentry, struct dentry, d_alias);
|
|
|
+ __dget(alias);
|
|
|
+ return alias;
|
|
|
+}
|
|
|
+
|
|
|
+static struct dentry * d_find_any_alias(struct inode *inode)
|
|
|
+{
|
|
|
+ struct dentry *de;
|
|
|
+
|
|
|
+ spin_lock(&inode->i_lock);
|
|
|
+ de = __d_find_any_alias(inode);
|
|
|
+ spin_unlock(&inode->i_lock);
|
|
|
+ return de;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* d_obtain_alias - find or allocate a dentry for a given inode
|
|
|
* @inode: inode to allocate the dentry for
|
|
@@ -1552,7 +1574,7 @@ struct dentry *d_obtain_alias(struct inode *inode)
|
|
|
if (IS_ERR(inode))
|
|
|
return ERR_CAST(inode);
|
|
|
|
|
|
- res = d_find_alias(inode);
|
|
|
+ res = d_find_any_alias(inode);
|
|
|
if (res)
|
|
|
goto out_iput;
|
|
|
|
|
@@ -1565,7 +1587,7 @@ struct dentry *d_obtain_alias(struct inode *inode)
|
|
|
|
|
|
|
|
|
spin_lock(&inode->i_lock);
|
|
|
- res = __d_find_alias(inode, 0);
|
|
|
+ res = __d_find_any_alias(inode);
|
|
|
if (res) {
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
dput(tmp);
|