Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cae7a073 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Return delegation upon rename or removal of file.

parent cdce5d6b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ static void nfs_msync_inode(struct inode *inode)
/*
 * Basic procedure for returning a delegation to the server
 */
int nfs_inode_return_delegation(struct inode *inode)
int __nfs_inode_return_delegation(struct inode *inode)
{
	struct nfs4_client *clp = NFS_SERVER(inode)->nfs4_state;
	struct nfs_inode *nfsi = NFS_I(inode);
+15 −1
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ struct nfs_delegation {

int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res);
void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res);
int nfs_inode_return_delegation(struct inode *inode);
int __nfs_inode_return_delegation(struct inode *inode);
int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid);

struct inode *nfs_delegation_find_inode(struct nfs4_client *clp, const struct nfs_fh *fhandle);
@@ -47,11 +47,25 @@ static inline int nfs_have_delegation(struct inode *inode, int flags)
		return 1;
	return 0;
}

static inline int nfs_inode_return_delegation(struct inode *inode)
{
	int err = 0;

	if (NFS_I(inode)->delegation != NULL)
		err = __nfs_inode_return_delegation(inode);
	return err;
}
#else
static inline int nfs_have_delegation(struct inode *inode, int flags)
{
	return 0;
}

static inline int nfs_inode_return_delegation(struct inode *inode)
{
	return 0;
}
#endif

#endif
+3 −0
Original line number Diff line number Diff line
@@ -801,6 +801,7 @@ static int nfs_dentry_delete(struct dentry *dentry)
 */
static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
{
	nfs_inode_return_delegation(inode);
	if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
		lock_kernel();
		inode->i_nlink--;
@@ -1329,6 +1330,7 @@ static int nfs_safe_remove(struct dentry *dentry)

	nfs_begin_data_update(dir);
	if (inode != NULL) {
		nfs_inode_return_delegation(inode);
		nfs_begin_data_update(inode);
		error = NFS_PROTO(dir)->remove(dir, &dentry->d_name);
		/* The VFS may want to delete this inode */
@@ -1547,6 +1549,7 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
		nfs_wb_all(old_inode);
		shrink_dcache_parent(old_dentry);
	}
	nfs_inode_return_delegation(old_inode);

	if (new_inode)
		d_delete(new_dentry);
+1 −2
Original line number Diff line number Diff line
@@ -1671,7 +1671,6 @@ static void nfs4_clear_inode(struct inode *inode)
	struct nfs_inode *nfsi = NFS_I(inode);

	/* If we are holding a delegation, return it! */
	if (nfsi->delegation != NULL)
	nfs_inode_return_delegation(inode);
	/* First call standard NFS clear_inode() code */
	nfs_clear_inode(inode);