On 15.11.2017 19:50, Stanislav Kinsburskiy wrote: > Don't queue delegation request, if ve init is exiting. > > https://jira.sw.ru/browse/PSBM-77061 > > Inspired-by: Kirill Tkhai <ktk...@virtuozzo.com> > Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> > --- > fs/nfs/delegation.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c > index 66af497..2422754 100644 > --- a/fs/nfs/delegation.c > +++ b/fs/nfs/delegation.c > @@ -189,15 +189,29 @@ 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; > + > + rcu_read_lock(); > + xprt = rcu_dereference(clp->cl_rpcclient->cl_xprt); > + rcu_read_unlock(); > + > + return xprt->xprt_net->owner_ve->ve_netns == NULL;
Usually, memory pointed by a pointer, which was obtained via rcu, has to be used in rcu_read_* brackets: rcu_read_lock(); xprt = rcu_dereference(clp->cl_rpcclient->cl_xprt); ret = (xprt->xprt_net->owner_ve->ve_netns == NULL); rcu_read_unlock(); return ret; If there is no an exception, we have to do something like above. > +} > + > 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; > } > _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel