提交 c780dc42 编写于 作者: T Trond Myklebust 提交者: Yang Yingliang

NFSv4.1: Only reap expired delegations

mainline inclusion
from mainline-v5.3-rc4
commit ad114089
category: bugfix
bugzilla: NA
CVE: NA

--------------------------------

Fix nfs_reap_expired_delegations() to ensure that we only reap delegations
that are actually expired, rather than triggering on random errors.

Fixes: 45870d69 ("NFSv4.1: Test delegation stateids when server...")
Signed-off-by: NTrond Myklebust <trond.myklebust@hammerspace.com>

Conflicts:
	fs/nfs/delegation.c
Signed-off-by: NZhang Xiaoxu <zhangxiaoxu5@huawei.com>
Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 bf691155
......@@ -1044,6 +1044,21 @@ void nfs_mark_test_expired_all_delegations(struct nfs_client *clp)
rcu_read_unlock();
}
static void
nfs_delegation_test_free_expired(struct inode *inode,
nfs4_stateid *stateid, struct rpc_cred *cred)
{
struct nfs_server *server = NFS_SERVER(inode);
const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
int status;
if (!cred)
return;
status = ops->test_and_free_expired(server, stateid, cred);
if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
nfs_remove_bad_delegation(inode, stateid);
}
/**
* nfs_reap_expired_delegations - reap expired delegations
* @clp: nfs_client to process
......@@ -1055,7 +1070,6 @@ void nfs_mark_test_expired_all_delegations(struct nfs_client *clp)
*/
void nfs_reap_expired_delegations(struct nfs_client *clp)
{
const struct nfs4_minor_version_ops *ops = clp->cl_mvops;
struct nfs_delegation *delegation;
struct nfs_server *server;
struct inode *inode;
......@@ -1086,11 +1100,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp)
nfs4_stateid_copy(&stateid, &delegation->stateid);
clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags);
rcu_read_unlock();
if (cred != NULL &&
ops->test_and_free_expired(server, &stateid, cred) < 0) {
nfs_revoke_delegation(inode, &stateid);
nfs_inode_find_state_and_recover(inode, &stateid);
}
nfs_delegation_test_free_expired(inode, &stateid, cred);
put_rpccred(cred);
if (nfs4_server_rebooted(clp)) {
nfs_inode_mark_test_expired_delegation(server,inode);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册