Patch "nfsd: deal with revoked delegations appropriately" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
nfsd: deal with revoked delegations appropriately
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nfsd-deal-with-revoked-delegations-appropriately.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
95da1b3a5aded124dd1bda1e3cdb876184813140Mon Sep 17 00:00:00 2001
From: Andrew Elble <[email protected]>
Date: Fri, 3 Nov 2017 14:06:31 -0400
Subject: nfsd: deal with revoked delegations appropriately
From: Andrew Elble <[email protected]>
commit 95da1b3a5aded124dd1bda1e3cdb876184813140 upstream.
If a delegation has been revoked by the server, operations using that delegation should error out with NFS4ERR_DELEG_REVOKED in the >4.1 case, and NFS4ERR_BAD_STATEID otherwise.
The server needs NFSv4.1 clients to explicitly free revoked delegations. If the server returns NFS4ERR_DELEG_REVOKED, the client will do that; otherwise it may just forget about the delegation and be unable to recover when it later sees SEQ4_STATUS_RECALLABLE_STATE_REVOKED set on a SEQUENCE reply. That can cause the Linux 4.1 client to loop in its stage manager.
--- fs/nfsd/nfs4state.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
fs/nfsd/nfs4state.c +24 -1
@@ -3966,7 +3966,8 @@ static struct nfs4_delegation *find_dele {struct nfs4_stid *ret; - ret =find_stateid_by_type (cl, s,NFS4_DELEG_STID ); + ret =find_stateid_by_type (cl, s, +NFS4_DELEG_STID |NFS4_REVOKED_DELEG_STID );if (!ret)return NULL ;return delegstateid (ret);
@@ -3989,6 +3990,12 @@ nfs4_check_deleg(struct nfs4_client *cl, deleg =find_deleg_stateid (cl, &open->op_delegate_stateid);if (deleg ==NULL ) goto out; +if (deleg->dl_stid.sc_type ==NFS4_REVOKED_DELEG_STID ) { +nfs4_put_stid (&deleg->dl_stid); +if (cl->cl_minorversion) + status = nfserr_deleg_revoked; + goto out; + } flags =share_access_to_flags (open->op_share_access); status =nfs4_check_delegmode (deleg, flags);if (status) {
@@ -4858,6 +4865,16 @@ nfsd4_lookup_stateid(struct nfsd4_compou struct nfs4_stid **s, struct nfsd_net *nn) { __be32 status; +bool return_revoked = false; + +/* +* only return revoked delegations if explicitly asked. +* otherwise we report revoked or bad_stateid status. +*/ +if (typemask &NFS4_REVOKED_DELEG_STID ) + return_revoked = true; +else if (typemask &NFS4_DELEG_STID ) + typemask |=NFS4_REVOKED_DELEG_STID ;if (ZERO_STATEID (stateid) ||ONE_STATEID (stateid))return nfserr_bad_stateid;
@@ -4872,6 +4889,12 @@ nfsd4_lookup_stateid(struct nfsd4_compou *s =find_stateid_by_type (cstate->clp, stateid, typemask);if (!*s)return nfserr_bad_stateid; +if (((*s)->sc_type ==NFS4_REVOKED_DELEG_STID ) && !return_revoked) { +nfs4_put_stid (*s); +if (cstate->minorversion) +return nfserr_deleg_revoked; +return nfserr_bad_stateid; + }return nfs_ok; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/nfsd-deal-with-revoked-delegations-appropriately.patch