mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Return the delegation when deleting sillyrenamed files
Add a callback to return the delegation in order to allow generic NFS code to return the delegation when appropriate. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
		
							parent
							
								
									d79ed371d5
								
							
						
					
					
						commit
						adb4b42d19
					
				
					 5 changed files with 20 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -984,6 +984,13 @@ static int nfs3_have_delegation(struct inode *inode, fmode_t type, int flags)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int nfs3_return_delegation(struct inode *inode)
 | 
			
		||||
{
 | 
			
		||||
	if (S_ISREG(inode->i_mode))
 | 
			
		||||
		nfs_wb_all(inode);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct inode_operations nfs3_dir_inode_operations = {
 | 
			
		||||
	.create		= nfs_create,
 | 
			
		||||
	.atomic_open	= nfs_atomic_open_v23,
 | 
			
		||||
| 
						 | 
				
			
			@ -1062,6 +1069,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
 | 
			
		|||
	.clear_acl_cache = forget_all_cached_acls,
 | 
			
		||||
	.close_context	= nfs_close_context,
 | 
			
		||||
	.have_delegation = nfs3_have_delegation,
 | 
			
		||||
	.return_delegation = nfs3_return_delegation,
 | 
			
		||||
	.alloc_client	= nfs_alloc_client,
 | 
			
		||||
	.init_client	= nfs_init_client,
 | 
			
		||||
	.free_client	= nfs_free_client,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10871,6 +10871,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
 | 
			
		|||
	.close_context  = nfs4_close_context,
 | 
			
		||||
	.open_context	= nfs4_atomic_open,
 | 
			
		||||
	.have_delegation = nfs4_have_delegation,
 | 
			
		||||
	.return_delegation = nfs4_inode_return_delegation,
 | 
			
		||||
	.alloc_client	= nfs4_alloc_client,
 | 
			
		||||
	.init_client	= nfs4_init_client,
 | 
			
		||||
	.free_client	= nfs4_free_client,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -692,6 +692,13 @@ static int nfs_have_delegation(struct inode *inode, fmode_t type, int flags)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int nfs_return_delegation(struct inode *inode)
 | 
			
		||||
{
 | 
			
		||||
	if (S_ISREG(inode->i_mode))
 | 
			
		||||
		nfs_wb_all(inode);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct inode_operations nfs_dir_inode_operations = {
 | 
			
		||||
	.create		= nfs_create,
 | 
			
		||||
	.lookup		= nfs_lookup,
 | 
			
		||||
| 
						 | 
				
			
			@ -757,6 +764,7 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
 | 
			
		|||
	.lock_check_bounds = nfs_lock_check_bounds,
 | 
			
		||||
	.close_context	= nfs_close_context,
 | 
			
		||||
	.have_delegation = nfs_have_delegation,
 | 
			
		||||
	.return_delegation = nfs_return_delegation,
 | 
			
		||||
	.alloc_client	= nfs_alloc_client,
 | 
			
		||||
	.init_client	= nfs_init_client,
 | 
			
		||||
	.free_client	= nfs_free_client,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -232,6 +232,8 @@ nfs_complete_unlink(struct dentry *dentry, struct inode *inode)
 | 
			
		|||
	dentry->d_fsdata = NULL;
 | 
			
		||||
	spin_unlock(&dentry->d_lock);
 | 
			
		||||
 | 
			
		||||
	NFS_PROTO(inode)->return_delegation(inode);
 | 
			
		||||
 | 
			
		||||
	if (NFS_STALE(inode) || !nfs_call_unlink(dentry, inode, data))
 | 
			
		||||
		nfs_free_unlinkdata(data);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1840,6 +1840,7 @@ struct nfs_rpc_ops {
 | 
			
		|||
				struct iattr *iattr,
 | 
			
		||||
				int *);
 | 
			
		||||
	int (*have_delegation)(struct inode *, fmode_t, int);
 | 
			
		||||
	int (*return_delegation)(struct inode *);
 | 
			
		||||
	struct nfs_client *(*alloc_client) (const struct nfs_client_initdata *);
 | 
			
		||||
	struct nfs_client *(*init_client) (struct nfs_client *,
 | 
			
		||||
				const struct nfs_client_initdata *);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue