diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2013-07-17 08:53:53 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-07-28 19:30:07 -0400 |
commit | dc2a6c2d3e9a2529b3ffc70c165cbb10c85768f5 (patch) | |
tree | 26132a7ba4d824a5d4bbbee435db9f646ee1ab7a /fs/fuse | |
parent | 05ac7b3a7db7823aecde55df6a5f8d6bb45693f4 (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.c | 17 |
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; |