]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
NFSv4: Replace closed stateids with the "invalid special stateid"
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 7 Nov 2017 17:39:44 +0000 (12:39 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 17 Nov 2017 21:43:49 +0000 (16:43 -0500)
When decoding a CLOSE, replace the stateid returned by the server
with the "invalid special stateid" described in RFC5661, Section 8.2.3.

In nfs_set_open_stateid_locked, ignore stateids from closed state.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4_fs.h
fs/nfs/nfs4state.c
fs/nfs/nfs4xdr.c

index 9721b74786d116d0bf4dc805832425e170dca9f7..dcfd1afc8d1f577d6fcf7ef55d31c1621669175b 100644 (file)
@@ -481,6 +481,7 @@ extern int nfs4_sequence_done(struct rpc_task *task,
 extern void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp);
 
 extern const nfs4_stateid zero_stateid;
+extern const nfs4_stateid invalid_stateid;
 
 /* nfs4super.c */
 struct nfs_mount_info;
index ff2794412e6f6b1d483a188c5d6ff1224c1cb382..54fd56d715a8c34a20e0dae0054bfee16eb830bf 100644 (file)
@@ -69,6 +69,14 @@ const nfs4_stateid zero_stateid = {
        { .data = { 0 } },
        .type = NFS4_SPECIAL_STATEID_TYPE,
 };
+const nfs4_stateid invalid_stateid = {
+       {
+               .seqid = cpu_to_be32(0xffffffffU),
+               .other = { 0 },
+       },
+       .type = NFS4_INVALID_STATEID_TYPE,
+};
+
 static DEFINE_MUTEX(nfs_clid_init_mutex);
 
 int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
index 14ed9791ec9cf156905a3e686042c325173582c0..77c6729e57f0ebfcfa1082c6a399704ea742d22f 100644 (file)
@@ -4385,6 +4385,14 @@ static int decode_delegation_stateid(struct xdr_stream *xdr, nfs4_stateid *state
        return decode_stateid(xdr, stateid);
 }
 
+static int decode_invalid_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
+{
+       nfs4_stateid dummy;
+
+       nfs4_stateid_copy(stateid, &invalid_stateid);
+       return decode_stateid(xdr, &dummy);
+}
+
 static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
 {
        int status;
@@ -4393,7 +4401,7 @@ static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
        if (status != -EIO)
                nfs_increment_open_seqid(status, res->seqid);
        if (!status)
-               status = decode_open_stateid(xdr, &res->stateid);
+               status = decode_invalid_stateid(xdr, &res->stateid);
        return status;
 }
 
@@ -6108,6 +6116,8 @@ static int decode_layoutreturn(struct xdr_stream *xdr,
        res->lrs_present = be32_to_cpup(p);
        if (res->lrs_present)
                status = decode_layout_stateid(xdr, &res->stateid);
+       else
+               nfs4_stateid_copy(&res->stateid, &invalid_stateid);
        return status;
 out_overflow:
        print_overflow_msg(__func__, xdr);