pnfs: Store return value of decode_layoutget for later processing
authorFred Isaman <fred.isaman@gmail.com>
Tue, 4 Oct 2016 19:02:21 +0000 (15:02 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 31 May 2018 19:03:10 +0000 (15:03 -0400)
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>
fs/nfs/nfs4xdr.c
include/linux/nfs_xdr.h

index 9b73920323211351f14752f3d6c92e627c6fa9ed..6024980dfc9e0d7c61d63b996025b78a5d75e92a 100644 (file)
@@ -6024,7 +6024,7 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
 
        status = decode_op_hdr(xdr, OP_LAYOUTGET);
        if (status)
-               return status;
+               goto out;
        p = xdr_inline_decode(xdr, 4);
        if (unlikely(!p))
                goto out_overflow;
@@ -6037,7 +6037,8 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
        if (!layout_count) {
                dprintk("%s: server responded with empty layout array\n",
                        __func__);
-               return -EINVAL;
+               status = -EINVAL;
+               goto out;
        }
 
        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: "
                                "layout len %u > recvd %u\n",
                                res->layoutp->len, recvd);
-               return -EINVAL;
+               status = -EINVAL;
+               goto out;
        }
 
        if (layout_count > 1) {
@@ -6075,10 +6077,13 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
                        __func__, layout_count);
        }
 
-       return 0;
+out:
+       res->status = status;
+       return status;
 out_overflow:
        print_overflow_msg(__func__, xdr);
-       return -EIO;
+       status = -EIO;
+       goto out;
 }
 
 static int decode_layoutreturn(struct xdr_stream *xdr,
index d3cefe57c2a302567edc977c64c6bd0031013429..d3aa5eaf99a7e78d1f3e67e215c46464f7668470 100644 (file)
@@ -259,6 +259,7 @@ struct nfs4_layoutget_args {
 
 struct nfs4_layoutget_res {
        struct nfs4_sequence_res seq_res;
+       int status;
        __u32 return_on_close;
        struct pnfs_layout_range range;
        __u32 type;