nfs: save server READ/WRITE/COMMIT status
authorPeng Tao <tao.peng@primarydata.com>
Wed, 27 Aug 2014 02:47:14 +0000 (10:47 +0800)
committerTom Haynes <loghyr@primarydata.com>
Tue, 3 Feb 2015 19:06:40 +0000 (11:06 -0800)
Flexfiles layout would want to use them to report DS IO status.

Signed-off-by: Peng Tao <tao.peng@primarydata.com>
Signed-off-by: Tom Haynes <Thomas.Haynes@primarydata.com>
fs/nfs/nfs2xdr.c
fs/nfs/nfs3xdr.c
fs/nfs/nfs4xdr.c
include/linux/nfs_xdr.h

index 5f61b83f4a1ce20593350c6a541aeba16528d7d6..b4e03ed8599de5da394f2ae8eed8bbc78a7ed82a 100644 (file)
@@ -481,7 +481,8 @@ out_overflow:
  *             void;
  *     };
  */
-static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result)
+static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result,
+                          __u32 *op_status)
 {
        enum nfs_stat status;
        int error;
@@ -489,6 +490,8 @@ static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result)
        error = decode_stat(xdr, &status);
        if (unlikely(error))
                goto out;
+       if (op_status)
+               *op_status = status;
        if (status != NFS_OK)
                goto out_default;
        error = decode_fattr(xdr, result);
@@ -808,7 +811,7 @@ out_default:
 static int nfs2_xdr_dec_attrstat(struct rpc_rqst *req, struct xdr_stream *xdr,
                                 struct nfs_fattr *result)
 {
-       return decode_attrstat(xdr, result);
+       return decode_attrstat(xdr, result, NULL);
 }
 
 static int nfs2_xdr_dec_diropres(struct rpc_rqst *req, struct xdr_stream *xdr,
@@ -865,6 +868,7 @@ static int nfs2_xdr_dec_readres(struct rpc_rqst *req, struct xdr_stream *xdr,
        error = decode_stat(xdr, &status);
        if (unlikely(error))
                goto out;
+       result->op_status = status;
        if (status != NFS_OK)
                goto out_default;
        error = decode_fattr(xdr, result->fattr);
@@ -882,7 +886,7 @@ static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, struct xdr_stream *xdr,
 {
        /* All NFSv2 writes are "file sync" writes */
        result->verf->committed = NFS_FILE_SYNC;
-       return decode_attrstat(xdr, result->fattr);
+       return decode_attrstat(xdr, result->fattr, &result->op_status);
 }
 
 /**
index 8f4cbe7f4aa81e38b88dd2ddc307e173d1be561d..2a932fdc57cb37b2676e08dcb33838c9aecd2a9a 100644 (file)
@@ -1636,6 +1636,7 @@ static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr,
        error = decode_post_op_attr(xdr, result->fattr);
        if (unlikely(error))
                goto out;
+       result->op_status = status;
        if (status != NFS3_OK)
                goto out_status;
        error = decode_read3resok(xdr, result);
@@ -1708,6 +1709,7 @@ static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr,
        error = decode_wcc_data(xdr, result->fattr);
        if (unlikely(error))
                goto out;
+       result->op_status = status;
        if (status != NFS3_OK)
                goto out_status;
        error = decode_write3resok(xdr, result);
@@ -2323,6 +2325,7 @@ static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req,
        error = decode_wcc_data(xdr, result->fattr);
        if (unlikely(error))
                goto out;
+       result->op_status = status;
        if (status != NFS3_OK)
                goto out_status;
        error = decode_writeverf3(xdr, &result->verf->verifier);
index cb4376b78ed91771b98bf03695eea1c67a5b5889..7d8d7a47f771bd65e588e9f4b11ad7dc7996c36d 100644 (file)
@@ -6567,6 +6567,7 @@ static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
        int status;
 
        status = decode_compound_hdr(xdr, &hdr);
+       res->op_status = hdr.status;
        if (status)
                goto out;
        status = decode_sequence(xdr, &res->seq_res, rqstp);
@@ -6592,6 +6593,7 @@ static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
        int status;
 
        status = decode_compound_hdr(xdr, &hdr);
+       res->op_status = hdr.status;
        if (status)
                goto out;
        status = decode_sequence(xdr, &res->seq_res, rqstp);
@@ -6621,6 +6623,7 @@ static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
        int status;
 
        status = decode_compound_hdr(xdr, &hdr);
+       res->op_status = hdr.status;
        if (status)
                goto out;
        status = decode_sequence(xdr, &res->seq_res, rqstp);
index 467c84efb5960f8e79fac918eabc721e5f3722d4..962f461c065d7566c5749d9b269be47999a4e716 100644 (file)
@@ -513,6 +513,7 @@ struct nfs_pgio_res {
        struct nfs4_sequence_res        seq_res;
        struct nfs_fattr *      fattr;
        __u32                   count;
+       __u32                   op_status;
        int                     eof;            /* used by read */
        struct nfs_writeverf *  verf;           /* used by write */
        const struct nfs_server *server;        /* used by write */
@@ -532,6 +533,7 @@ struct nfs_commitargs {
 
 struct nfs_commitres {
        struct nfs4_sequence_res        seq_res;
+       __u32                   op_status;
        struct nfs_fattr        *fattr;
        struct nfs_writeverf    *verf;
        const struct nfs_server *server;