mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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) [weiyongjun1@huawei.com: fix return value check in affs_get_parent()] Link: http://lkml.kernel.org/r/20170123141018.2331-1-weiyj.lk@gmail.com Link: http://lkml.kernel.org/r/20170109191208.6085-8-fabf@skynet.be Signed-off-by: Fabian Frederick <fabf@skynet.be> Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com> Suggested-by: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									f567accb3f
								
							
						
					
					
						commit
						b3b42c0dea
					
				
					 1 changed files with 19 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -447,6 +447,24 @@ affs_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
			
		|||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct dentry *affs_get_parent(struct dentry *child)
 | 
			
		||||
{
 | 
			
		||||
	struct inode *parent;
 | 
			
		||||
	struct buffer_head *bh;
 | 
			
		||||
 | 
			
		||||
	bh = affs_bread(child->d_sb, d_inode(child)->i_ino);
 | 
			
		||||
	if (!bh)
 | 
			
		||||
		return ERR_PTR(-EIO);
 | 
			
		||||
 | 
			
		||||
	parent = affs_iget(child->d_sb,
 | 
			
		||||
			   be32_to_cpu(AFFS_TAIL(child->d_sb, bh)->parent));
 | 
			
		||||
	brelse(bh);
 | 
			
		||||
	if (IS_ERR(parent))
 | 
			
		||||
		return ERR_CAST(parent);
 | 
			
		||||
 | 
			
		||||
	return d_obtain_alias(parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct inode *affs_nfs_get_inode(struct super_block *sb, u64 ino,
 | 
			
		||||
					u32 generation)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -484,6 +502,7 @@ static struct dentry *affs_fh_to_parent(struct super_block *sb, struct fid *fid,
 | 
			
		|||
const struct export_operations affs_export_ops = {
 | 
			
		||||
	.fh_to_dentry = affs_fh_to_dentry,
 | 
			
		||||
	.fh_to_parent = affs_fh_to_parent,
 | 
			
		||||
	.get_parent = affs_get_parent,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const struct dentry_operations affs_dentry_operations = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue