NFSv4: Label stateids with the type
In order to more easily distinguish what kind of stateid we are dealing with, introduce a type that can be used to label the stateid structure. The label will be useful both for debugging, but also when dealing with operations like SETATTR, READ and WRITE that can take several different types of stateid as arguments. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:

committed by
Anna Schumaker

parent
9a8f6b5ea2
commit
93b717fd81
@@ -4270,6 +4270,24 @@ static int decode_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
|
||||
return decode_opaque_fixed(xdr, stateid, NFS4_STATEID_SIZE);
|
||||
}
|
||||
|
||||
static int decode_open_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
|
||||
{
|
||||
stateid->type = NFS4_OPEN_STATEID_TYPE;
|
||||
return decode_stateid(xdr, stateid);
|
||||
}
|
||||
|
||||
static int decode_lock_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
|
||||
{
|
||||
stateid->type = NFS4_LOCK_STATEID_TYPE;
|
||||
return decode_stateid(xdr, stateid);
|
||||
}
|
||||
|
||||
static int decode_delegation_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
|
||||
{
|
||||
stateid->type = NFS4_DELEGATION_STATEID_TYPE;
|
||||
return decode_stateid(xdr, stateid);
|
||||
}
|
||||
|
||||
static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
|
||||
{
|
||||
int status;
|
||||
@@ -4278,7 +4296,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_stateid(xdr, &res->stateid);
|
||||
status = decode_open_stateid(xdr, &res->stateid);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -4937,7 +4955,7 @@ static int decode_lock(struct xdr_stream *xdr, struct nfs_lock_res *res)
|
||||
if (status == -EIO)
|
||||
goto out;
|
||||
if (status == 0) {
|
||||
status = decode_stateid(xdr, &res->stateid);
|
||||
status = decode_lock_stateid(xdr, &res->stateid);
|
||||
if (unlikely(status))
|
||||
goto out;
|
||||
} else if (status == -NFS4ERR_DENIED)
|
||||
@@ -4966,7 +4984,7 @@ static int decode_locku(struct xdr_stream *xdr, struct nfs_locku_res *res)
|
||||
if (status != -EIO)
|
||||
nfs_increment_lock_seqid(status, res->seqid);
|
||||
if (status == 0)
|
||||
status = decode_stateid(xdr, &res->stateid);
|
||||
status = decode_lock_stateid(xdr, &res->stateid);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -5016,7 +5034,7 @@ static int decode_rw_delegation(struct xdr_stream *xdr,
|
||||
__be32 *p;
|
||||
int status;
|
||||
|
||||
status = decode_stateid(xdr, &res->delegation);
|
||||
status = decode_delegation_stateid(xdr, &res->delegation);
|
||||
if (unlikely(status))
|
||||
return status;
|
||||
p = xdr_inline_decode(xdr, 4);
|
||||
@@ -5096,7 +5114,7 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
|
||||
nfs_increment_open_seqid(status, res->seqid);
|
||||
if (status)
|
||||
return status;
|
||||
status = decode_stateid(xdr, &res->stateid);
|
||||
status = decode_open_stateid(xdr, &res->stateid);
|
||||
if (unlikely(status))
|
||||
return status;
|
||||
|
||||
@@ -5136,7 +5154,7 @@ static int decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmre
|
||||
if (status != -EIO)
|
||||
nfs_increment_open_seqid(status, res->seqid);
|
||||
if (!status)
|
||||
status = decode_stateid(xdr, &res->stateid);
|
||||
status = decode_open_stateid(xdr, &res->stateid);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -5148,7 +5166,7 @@ static int decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *re
|
||||
if (status != -EIO)
|
||||
nfs_increment_open_seqid(status, res->seqid);
|
||||
if (!status)
|
||||
status = decode_stateid(xdr, &res->stateid);
|
||||
status = decode_open_stateid(xdr, &res->stateid);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -5838,6 +5856,12 @@ out_overflow:
|
||||
}
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
static int decode_layout_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
|
||||
{
|
||||
stateid->type = NFS4_LAYOUT_STATEID_TYPE;
|
||||
return decode_stateid(xdr, stateid);
|
||||
}
|
||||
|
||||
static int decode_getdeviceinfo(struct xdr_stream *xdr,
|
||||
struct nfs4_getdeviceinfo_res *res)
|
||||
{
|
||||
@@ -5919,7 +5943,7 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
|
||||
if (unlikely(!p))
|
||||
goto out_overflow;
|
||||
res->return_on_close = be32_to_cpup(p);
|
||||
decode_stateid(xdr, &res->stateid);
|
||||
decode_layout_stateid(xdr, &res->stateid);
|
||||
p = xdr_inline_decode(xdr, 4);
|
||||
if (unlikely(!p))
|
||||
goto out_overflow;
|
||||
@@ -5985,7 +6009,7 @@ static int decode_layoutreturn(struct xdr_stream *xdr,
|
||||
goto out_overflow;
|
||||
res->lrs_present = be32_to_cpup(p);
|
||||
if (res->lrs_present)
|
||||
status = decode_stateid(xdr, &res->stateid);
|
||||
status = decode_layout_stateid(xdr, &res->stateid);
|
||||
return status;
|
||||
out_overflow:
|
||||
print_overflow_msg(__func__, xdr);
|
||||
|
Reference in New Issue
Block a user