[Devel] [PATCH v2] nfs: abort delegation in dying VE
Stanislav Kinsburskiy
skinsbursky at virtuozzo.com
Wed Nov 15 20:00:58 MSK 2017
Don't queue delegation request, if ve init is exiting.
https://jira.sw.ru/browse/PSBM-77061
v2: check ve is dying under rcu_lock()
Inspired-by: Kirill Tkhai <ktkhai at virtuozzo.com>
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
fs/nfs/delegation.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index 66af497..1d1500c 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -189,15 +189,31 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
nfs_inode_set_delegation(inode, cred, res);
}
+static bool ve_abort_delegation(struct inode *inode)
+{
+ struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
+ struct rpc_xprt *xprt;
+ bool abort;
+
+ rcu_read_lock();
+ xprt = rcu_dereference(clp->cl_rpcclient->cl_xprt);
+ abort = xprt->xprt_net->owner_ve->ve_netns == NULL;
+ rcu_read_unlock();
+
+ return abort;
+}
+
static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)
{
int res = 0;
- if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
+ if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) &&
+ !ve_abort_delegation(inode)) {
res = nfs4_proc_delegreturn(inode,
delegation->cred,
&delegation->stateid,
issync);
+ }
nfs_free_delegation(delegation);
return res;
}
More information about the Devel
mailing list