| From 2914941e3178d84a216fc4eb85292dfef3b6d628 Mon Sep 17 00:00:00 2001 |
| From: Miklos Szeredi <mszeredi@suse.cz> |
| Date: Wed, 17 Jul 2013 14:53:53 +0200 |
| Subject: fuse: readdirplus: fix instantiate |
| |
| From: Miklos Szeredi <mszeredi@suse.cz> |
| |
| 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> |
| |
| --- |
| fs/fuse/dir.c | 17 +++++++++++++---- |
| 1 file changed, 13 insertions(+), 4 deletions(-) |
| |
| --- a/fs/fuse/dir.c |
| +++ b/fs/fuse/dir.c |
| @@ -1264,10 +1264,19 @@ static int fuse_direntplus_link(struct f |
| 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; |