|
@@ -1272,10 +1272,19 @@ static int fuse_direntplus_link(struct file *file,
|
|
|
if (!inode)
|
|
|
goto out;
|
|
|
|
|
|
- alias = d_materialise_unique(dentry, inode);
|
|
|
- err = PTR_ERR(alias);
|
|
|
- if (IS_ERR(alias))
|
|
|
- goto out;
|
|
|
+ if (S_ISDIR(inode->i_mode)) {
|
|
|
+ mutex_lock(&fc->inst_mutex);
|
|
|
+ alias = fuse_d_add_directory(dentry, inode);
|
|
|
+ mutex_unlock(&fc->inst_mutex);
|
|
|
+ err = PTR_ERR(alias);
|
|
|
+ if (IS_ERR(alias)) {
|
|
|
+ iput(inode);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ alias = d_splice_alias(inode, dentry);
|
|
|
+ }
|
|
|
+
|
|
|
if (alias) {
|
|
|
dput(dentry);
|
|
|
dentry = alias;
|