mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08: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
@ -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 New Issue
Block a user