diff options
| author | Fabian Frederick <fabf@skynet.be> | 2017-03-28 20:16:46 +0200 | 
|---|---|---|
| committer | Luis de Bethencourt <luisbg@osg.samsung.com> | 2017-05-05 11:35:35 +0100 | 
| commit | dcfd9b215b89d72c1053a717571d52bf96cc64f8 (patch) | |
| tree | da00995740f9fb5c9a62cfff5e48e859cd2124b4 /fs/befs | |
| parent | a351e9b9fc24e982ec2f0e76379a49826036da12 (diff) | |
| download | linux-dcfd9b215b89d72c1053a717571d52bf96cc64f8.tar.bz2 | |
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,  				struct fid *fid, int fh_len, int fh_type);  static struct dentry *befs_fh_to_parent(struct super_block *sb,  				struct fid *fid, int fh_len, int fh_type); +static struct dentry *befs_get_parent(struct dentry *child);  static const struct super_operations befs_sops = {  	.alloc_inode	= befs_alloc_inode,	/* allocate a new inode */ @@ -93,6 +94,7 @@ static const struct address_space_operations befs_symlink_aops = {  static const struct export_operations befs_export_operations = {  	.fh_to_dentry	= befs_fh_to_dentry,  	.fh_to_parent	= befs_fh_to_parent, +	.get_parent	= befs_get_parent,  };  /* @@ -667,6 +669,19 @@ static struct dentry *befs_fh_to_parent(struct super_block *sb,  				    befs_nfs_get_inode);  } +static struct dentry *befs_get_parent(struct dentry *child) +{ +	struct inode *parent; +	struct befs_inode_info *befs_ino = BEFS_I(d_inode(child)); + +	parent = befs_iget(child->d_sb, +			   (unsigned long)befs_ino->i_parent.start); +	if (IS_ERR(parent)) +		return ERR_CAST(parent); + +	return d_obtain_alias(parent); +} +  enum {  	Opt_uid, Opt_gid, Opt_charset, Opt_debug, Opt_err,  };  |