NFSv4: Replace closed stateids with the "invalid special stateid"
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>
This commit is contained in:
parent
e1fff5df6e
commit
fcd8843c40
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue