diff options
author | Fabian Frederick <fabf@skynet.be> | 2017-03-28 14:16:46 -0400 |
---|---|---|
committer | Luis de Bethencourt <luisbg@osg.samsung.com> | 2017-05-05 06:35:35 -0400 |
commit | dcfd9b215b89d72c1053a717571d52bf96cc64f8 (patch) | |
tree | da00995740f9fb5c9a62cfff5e48e859cd2124b4 /fs/befs | |
parent | a351e9b9fc24e982ec2f0e76379a49826036da12 (diff) |
befs: make export work with cold dcache
based on commit b3b42c0deaa1
("fs/affs: make export work with cold dcache")
This adds get_parent function so that nfs client can still work after
cache drop (Tested on NFS v4 with echo 3 > /proc/sys/vm/drop_caches)
Signed-off-by: Fabian Frederick <fabf@skynet.be>
Signed-off-by: Luis de Bethencourt <luisbg@osg.samsung.com>
Diffstat (limited to 'fs/befs')
-rw-r--r-- | fs/befs/linuxvfs.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index c500e954debb..63e7c4760bfb 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -58,6 +58,7 @@ static struct dentry *befs_fh_to_dentry(struct super_block *sb, | |||
58 | struct fid *fid, int fh_len, int fh_type); | 58 | struct fid *fid, int fh_len, int fh_type); |
59 | static struct dentry *befs_fh_to_parent(struct super_block *sb, | 59 | static struct dentry *befs_fh_to_parent(struct super_block *sb, |
60 | struct fid *fid, int fh_len, int fh_type); | 60 | struct fid *fid, int fh_len, int fh_type); |
61 | static struct dentry *befs_get_parent(struct dentry *child); | ||
61 | 62 | ||
62 | static const struct super_operations befs_sops = { | 63 | static const struct super_operations befs_sops = { |
63 | .alloc_inode = befs_alloc_inode, /* allocate a new inode */ | 64 | .alloc_inode = befs_alloc_inode, /* allocate a new inode */ |
@@ -93,6 +94,7 @@ static const struct address_space_operations befs_symlink_aops = { | |||
93 | static const struct export_operations befs_export_operations = { | 94 | static const struct export_operations befs_export_operations = { |
94 | .fh_to_dentry = befs_fh_to_dentry, | 95 | .fh_to_dentry = befs_fh_to_dentry, |
95 | .fh_to_parent = befs_fh_to_parent, | 96 | .fh_to_parent = befs_fh_to_parent, |
97 | .get_parent = befs_get_parent, | ||
96 | }; | 98 | }; |
97 | 99 | ||
98 | /* | 100 | /* |
@@ -667,6 +669,19 @@ static struct dentry *befs_fh_to_parent(struct super_block *sb, | |||
667 | befs_nfs_get_inode); | 669 | befs_nfs_get_inode); |
668 | } | 670 | } |
669 | 671 | ||
672 | static struct dentry *befs_get_parent(struct dentry *child) | ||
673 | { | ||
674 | struct inode *parent; | ||
675 | struct befs_inode_info *befs_ino = BEFS_I(d_inode(child)); | ||
676 | |||
677 | parent = befs_iget(child->d_sb, | ||
678 | (unsigned long)befs_ino->i_parent.start); | ||
679 | if (IS_ERR(parent)) | ||
680 | return ERR_CAST(parent); | ||
681 | |||
682 | return d_obtain_alias(parent); | ||
683 | } | ||
684 | |||
670 | enum { | 685 | enum { |
671 | Opt_uid, Opt_gid, Opt_charset, Opt_debug, Opt_err, | 686 | Opt_uid, Opt_gid, Opt_charset, Opt_debug, Opt_err, |
672 | }; | 687 | }; |