forked from Minki/linux
NFSv4: Fix the readdir reply buffer alignment
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
9104a55dc3
commit
d6ac02dfaa
@ -1168,12 +1168,10 @@ static int encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args)
|
|||||||
|
|
||||||
static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req)
|
static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req)
|
||||||
{
|
{
|
||||||
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
|
|
||||||
uint32_t attrs[2] = {
|
uint32_t attrs[2] = {
|
||||||
FATTR4_WORD0_RDATTR_ERROR|FATTR4_WORD0_FILEID,
|
FATTR4_WORD0_RDATTR_ERROR|FATTR4_WORD0_FILEID,
|
||||||
FATTR4_WORD1_MOUNTED_ON_FILEID,
|
FATTR4_WORD1_MOUNTED_ON_FILEID,
|
||||||
};
|
};
|
||||||
int replen;
|
|
||||||
__be32 *p;
|
__be32 *p;
|
||||||
|
|
||||||
RESERVE_SPACE(12+NFS4_VERIFIER_SIZE+20);
|
RESERVE_SPACE(12+NFS4_VERIFIER_SIZE+20);
|
||||||
@ -1198,17 +1196,6 @@ static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg
|
|||||||
attrs[0] & readdir->bitmask[0],
|
attrs[0] & readdir->bitmask[0],
|
||||||
attrs[1] & readdir->bitmask[1]);
|
attrs[1] & readdir->bitmask[1]);
|
||||||
|
|
||||||
/* set up reply kvec
|
|
||||||
* toplevel_status + taglen + rescount + OP_PUTFH + status
|
|
||||||
* + OP_READDIR + status + verifer(2) = 9
|
|
||||||
*/
|
|
||||||
replen = (RPC_REPHDRSIZE + auth->au_rslack + 9) << 2;
|
|
||||||
xdr_inline_pages(&req->rq_rcv_buf, replen, readdir->pages,
|
|
||||||
readdir->pgbase, readdir->count);
|
|
||||||
dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
|
|
||||||
__FUNCTION__, replen, readdir->pages,
|
|
||||||
readdir->pgbase, readdir->count);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1815,6 +1802,8 @@ static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nf
|
|||||||
struct compound_hdr hdr = {
|
struct compound_hdr hdr = {
|
||||||
.nops = 2,
|
.nops = 2,
|
||||||
};
|
};
|
||||||
|
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
|
||||||
|
int replen;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
xdr_init_encode(&xdr, &req->rq_snd_buf, p);
|
xdr_init_encode(&xdr, &req->rq_snd_buf, p);
|
||||||
@ -1823,6 +1812,18 @@ static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nf
|
|||||||
if(status)
|
if(status)
|
||||||
goto out;
|
goto out;
|
||||||
status = encode_readdir(&xdr, args, req);
|
status = encode_readdir(&xdr, args, req);
|
||||||
|
|
||||||
|
/* set up reply kvec
|
||||||
|
* toplevel_status + taglen + rescount + OP_PUTFH + status
|
||||||
|
* + OP_READDIR + status + verifer(2) = 9
|
||||||
|
*/
|
||||||
|
replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_readdir_sz) << 2;
|
||||||
|
xdr_inline_pages(&req->rq_rcv_buf, replen, args->pages,
|
||||||
|
args->pgbase, args->count);
|
||||||
|
dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
|
||||||
|
__FUNCTION__, replen, args->pages,
|
||||||
|
args->pgbase, args->count);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user