pnfs: Store return value of decode_layoutget for later processing
This will be needed to seperate return value of OPEN and LAYOUTGET when they are combined into a single RPC. Signed-off-by: Fred Isaman <fred.isaman@gmail.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
committed by
Trond Myklebust
parent
34ec9aac7d
commit
808ba32abe
@@ -6024,7 +6024,7 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
|
|||||||
|
|
||||||
status = decode_op_hdr(xdr, OP_LAYOUTGET);
|
status = decode_op_hdr(xdr, OP_LAYOUTGET);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
goto out;
|
||||||
p = xdr_inline_decode(xdr, 4);
|
p = xdr_inline_decode(xdr, 4);
|
||||||
if (unlikely(!p))
|
if (unlikely(!p))
|
||||||
goto out_overflow;
|
goto out_overflow;
|
||||||
@@ -6037,7 +6037,8 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
|
|||||||
if (!layout_count) {
|
if (!layout_count) {
|
||||||
dprintk("%s: server responded with empty layout array\n",
|
dprintk("%s: server responded with empty layout array\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -EINVAL;
|
status = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = xdr_inline_decode(xdr, 28);
|
p = xdr_inline_decode(xdr, 28);
|
||||||
@@ -6062,7 +6063,8 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
|
|||||||
dprintk("NFS: server cheating in layoutget reply: "
|
dprintk("NFS: server cheating in layoutget reply: "
|
||||||
"layout len %u > recvd %u\n",
|
"layout len %u > recvd %u\n",
|
||||||
res->layoutp->len, recvd);
|
res->layoutp->len, recvd);
|
||||||
return -EINVAL;
|
status = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layout_count > 1) {
|
if (layout_count > 1) {
|
||||||
@@ -6075,10 +6077,13 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
|
|||||||
__func__, layout_count);
|
__func__, layout_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
out:
|
||||||
|
res->status = status;
|
||||||
|
return status;
|
||||||
out_overflow:
|
out_overflow:
|
||||||
print_overflow_msg(__func__, xdr);
|
print_overflow_msg(__func__, xdr);
|
||||||
return -EIO;
|
status = -EIO;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int decode_layoutreturn(struct xdr_stream *xdr,
|
static int decode_layoutreturn(struct xdr_stream *xdr,
|
||||||
|
|||||||
@@ -259,6 +259,7 @@ struct nfs4_layoutget_args {
|
|||||||
|
|
||||||
struct nfs4_layoutget_res {
|
struct nfs4_layoutget_res {
|
||||||
struct nfs4_sequence_res seq_res;
|
struct nfs4_sequence_res seq_res;
|
||||||
|
int status;
|
||||||
__u32 return_on_close;
|
__u32 return_on_close;
|
||||||
struct pnfs_layout_range range;
|
struct pnfs_layout_range range;
|
||||||
__u32 type;
|
__u32 type;
|
||||||
|
|||||||
Reference in New Issue
Block a user