aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2013-07-17 08:53:53 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-07-28 19:30:07 -0400
commitdc2a6c2d3e9a2529b3ffc70c165cbb10c85768f5 (patch)
tree26132a7ba4d824a5d4bbbee435db9f646ee1ab7a /fs/fuse
parent05ac7b3a7db7823aecde55df6a5f8d6bb45693f4 (diff)
fuse: readdirplus: fix instantiate
commit 2914941e3178d84a216fc4eb85292dfef3b6d628 upstream. Fuse does instantiation slightly differently from NFS/CIFS which use d_materialise_unique(). Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/fuse')
-rw-r--r--fs/fuse/dir.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 5532bf416f9b..a71df0206f6f 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -1264,10 +1264,19 @@ static int fuse_direntplus_link(struct file *file,
1264 if (!inode) 1264 if (!inode)
1265 goto out; 1265 goto out;
1266 1266
1267 alias = d_materialise_unique(dentry, inode); 1267 if (S_ISDIR(inode->i_mode)) {
1268 err = PTR_ERR(alias); 1268 mutex_lock(&fc->inst_mutex);
1269 if (IS_ERR(alias)) 1269 alias = fuse_d_add_directory(dentry, inode);
1270 goto out; 1270 mutex_unlock(&fc->inst_mutex);
1271 err = PTR_ERR(alias);
1272 if (IS_ERR(alias)) {
1273 iput(inode);
1274 goto out;
1275 }
1276 } else {
1277 alias = d_splice_alias(inode, dentry);
1278 }
1279
1271 if (alias) { 1280 if (alias) {
1272 dput(dentry); 1281 dput(dentry);
1273 dentry = alias; 1282 dentry = alias;