aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4xdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r--fs/nfs/nfs4xdr.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 7f91d613d31a..cd9e26cfa868 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -198,17 +198,21 @@ static int nfs_stat_to_errno(int);
198#define NFS4_enc_open_downgrade_sz \ 198#define NFS4_enc_open_downgrade_sz \
199 (compound_encode_hdr_maxsz + \ 199 (compound_encode_hdr_maxsz + \
200 encode_putfh_maxsz + \ 200 encode_putfh_maxsz + \
201 op_encode_hdr_maxsz + 7) 201 op_encode_hdr_maxsz + 7 + \
202 encode_getattr_maxsz)
202#define NFS4_dec_open_downgrade_sz \ 203#define NFS4_dec_open_downgrade_sz \
203 (compound_decode_hdr_maxsz + \ 204 (compound_decode_hdr_maxsz + \
204 decode_putfh_maxsz + \ 205 decode_putfh_maxsz + \
205 op_decode_hdr_maxsz + 4) 206 op_decode_hdr_maxsz + 4 + \
207 decode_getattr_maxsz)
206#define NFS4_enc_close_sz (compound_encode_hdr_maxsz + \ 208#define NFS4_enc_close_sz (compound_encode_hdr_maxsz + \
207 encode_putfh_maxsz + \ 209 encode_putfh_maxsz + \
208 op_encode_hdr_maxsz + 5) 210 op_encode_hdr_maxsz + 5 + \
211 encode_getattr_maxsz)
209#define NFS4_dec_close_sz (compound_decode_hdr_maxsz + \ 212#define NFS4_dec_close_sz (compound_decode_hdr_maxsz + \
210 decode_putfh_maxsz + \ 213 decode_putfh_maxsz + \
211 op_decode_hdr_maxsz + 4) 214 op_decode_hdr_maxsz + 4 + \
215 decode_getattr_maxsz)
212#define NFS4_enc_setattr_sz (compound_encode_hdr_maxsz + \ 216#define NFS4_enc_setattr_sz (compound_encode_hdr_maxsz + \
213 encode_putfh_maxsz + \ 217 encode_putfh_maxsz + \
214 op_encode_hdr_maxsz + 4 + \ 218 op_encode_hdr_maxsz + 4 + \
@@ -1433,7 +1437,7 @@ static int nfs4_xdr_enc_close(struct rpc_rqst *req, uint32_t *p, struct nfs_clos
1433{ 1437{
1434 struct xdr_stream xdr; 1438 struct xdr_stream xdr;
1435 struct compound_hdr hdr = { 1439 struct compound_hdr hdr = {
1436 .nops = 2, 1440 .nops = 3,
1437 }; 1441 };
1438 int status; 1442 int status;
1439 1443
@@ -1443,6 +1447,9 @@ static int nfs4_xdr_enc_close(struct rpc_rqst *req, uint32_t *p, struct nfs_clos
1443 if(status) 1447 if(status)
1444 goto out; 1448 goto out;
1445 status = encode_close(&xdr, args); 1449 status = encode_close(&xdr, args);
1450 if (status != 0)
1451 goto out;
1452 status = encode_getfattr(&xdr, args->bitmask);
1446out: 1453out:
1447 return status; 1454 return status;
1448} 1455}
@@ -1541,7 +1548,7 @@ static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, uint32_t *p, struct
1541{ 1548{
1542 struct xdr_stream xdr; 1549 struct xdr_stream xdr;
1543 struct compound_hdr hdr = { 1550 struct compound_hdr hdr = {
1544 .nops = 2, 1551 .nops = 3,
1545 }; 1552 };
1546 int status; 1553 int status;
1547 1554
@@ -1551,6 +1558,9 @@ static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, uint32_t *p, struct
1551 if (status) 1558 if (status)
1552 goto out; 1559 goto out;
1553 status = encode_open_downgrade(&xdr, args); 1560 status = encode_open_downgrade(&xdr, args);
1561 if (status != 0)
1562 goto out;
1563 status = encode_getfattr(&xdr, args->bitmask);
1554out: 1564out:
1555 return status; 1565 return status;
1556} 1566}
@@ -3403,6 +3413,9 @@ static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, uint32_t *p, stru
3403 if (status) 3413 if (status)
3404 goto out; 3414 goto out;
3405 status = decode_open_downgrade(&xdr, res); 3415 status = decode_open_downgrade(&xdr, res);
3416 if (status != 0)
3417 goto out;
3418 decode_getfattr(&xdr, res->fattr, res->server);
3406out: 3419out:
3407 return status; 3420 return status;
3408} 3421}
@@ -3678,6 +3691,15 @@ static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_cl
3678 if (status) 3691 if (status)
3679 goto out; 3692 goto out;
3680 status = decode_close(&xdr, res); 3693 status = decode_close(&xdr, res);
3694 if (status != 0)
3695 goto out;
3696 /*
3697 * Note: Server may do delete on close for this file
3698 * in which case the getattr call will fail with
3699 * an ESTALE error. Shouldn't be a problem,
3700 * though, since fattr->valid will remain unset.
3701 */
3702 decode_getfattr(&xdr, res->fattr, res->server);
3681out: 3703out:
3682 return status; 3704 return status;
3683} 3705}