aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2018-02-15 15:16:18 -0500
committerJ. Bruce Fields <bfields@redhat.com>2018-03-19 16:38:12 -0400
commitbd2decac5e8ab7b326f54b40e3ac8b3b1ac935ed (patch)
treeda654fb589e3c0ae0c48c479b89f886754730092
parent3b68e6ee3cbd4a474bcc7d2ac26812f86cdf333d (diff)
nfsd4: send the special close_stateid in v4.0 replies as well
We already send it for v4.1, but RFC7530 also notes that the stateid in the close reply is bogus. Always send the special close stateid, even in v4.0 responses. No client should put any meaning on it whatsoever. For now, we continue to increment the stateid value, though that might not be necessary either. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--fs/nfsd/nfs4state.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 61b770e39809..34e6915831d8 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -5521,15 +5521,26 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
5521 goto out; 5521 goto out;
5522 5522
5523 stp->st_stid.sc_type = NFS4_CLOSED_STID; 5523 stp->st_stid.sc_type = NFS4_CLOSED_STID;
5524
5525 /*
5526 * Technically we don't _really_ have to increment or copy it, since
5527 * it should just be gone after this operation and we clobber the
5528 * copied value below, but we continue to do so here just to ensure
5529 * that racing ops see that there was a state change.
5530 */
5524 nfs4_inc_and_copy_stateid(&close->cl_stateid, &stp->st_stid); 5531 nfs4_inc_and_copy_stateid(&close->cl_stateid, &stp->st_stid);
5525 5532
5526 nfsd4_close_open_stateid(stp); 5533 nfsd4_close_open_stateid(stp);
5527 mutex_unlock(&stp->st_mutex); 5534 mutex_unlock(&stp->st_mutex);
5528 5535
5529 /* See RFC5661 sectionm 18.2.4 */ 5536 /* v4.1+ suggests that we send a special stateid in here, since the
5530 if (stp->st_stid.sc_client->cl_minorversion) 5537 * clients should just ignore this anyway. Since this is not useful
5531 memcpy(&close->cl_stateid, &close_stateid, 5538 * for v4.0 clients either, we set it to the special close_stateid
5532 sizeof(close->cl_stateid)); 5539 * universally.
5540 *
5541 * See RFC5661 section 18.2.4, and RFC7530 section 16.2.5
5542 */
5543 memcpy(&close->cl_stateid, &close_stateid, sizeof(close->cl_stateid));
5533 5544
5534 /* put reference from nfs4_preprocess_seqid_op */ 5545 /* put reference from nfs4_preprocess_seqid_op */
5535 nfs4_put_stid(&stp->st_stid); 5546 nfs4_put_stid(&stp->st_stid);