nfs: fix nfs4d readlink truncated packet
XDR requires 4-byte alignment; nfs4d READLINK reply writes out the padding, but truncates the packet to the padding-less size. Fix by taking the padding into consideration when truncating the packet. Symptoms: # ll /mnt/ ls: cannot read symbolic link /mnt/test: Input/output error total 4 -rw-r--r--. 1 root root 0 Jun 14 01:21 123456 lrwxrwxrwx. 1 root root 6 Jul 2 03:33 test drwxr-xr-x. 1 root root 0 Jul 2 23:50 tmp drwxr-xr-x. 1 root root 60 Jul 2 23:44 tree Signed-off-by: Avi Kivity <avi@cloudius-systems.com> Fixes: 476a7b1f4b2c (nfsd4: don't treat readlink like a zero-copy operation) Reviewed-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
76f47128f9
commit
69bbd9c7b9
@ -3278,7 +3278,7 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd
|
|||||||
|
|
||||||
wire_count = htonl(maxcount);
|
wire_count = htonl(maxcount);
|
||||||
write_bytes_to_xdr_buf(xdr->buf, length_offset, &wire_count, 4);
|
write_bytes_to_xdr_buf(xdr->buf, length_offset, &wire_count, 4);
|
||||||
xdr_truncate_encode(xdr, length_offset + 4 + maxcount);
|
xdr_truncate_encode(xdr, length_offset + 4 + ALIGN(maxcount, 4));
|
||||||
if (maxcount & 3)
|
if (maxcount & 3)
|
||||||
write_bytes_to_xdr_buf(xdr->buf, length_offset + 4 + maxcount,
|
write_bytes_to_xdr_buf(xdr->buf, length_offset + 4 + maxcount,
|
||||||
&zero, 4 - (maxcount&3));
|
&zero, 4 - (maxcount&3));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user