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: 476a7b1f4b
(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:
Родитель
76f47128f9
Коммит
69bbd9c7b9
|
@ -3278,7 +3278,7 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd
|
|||
|
||||
wire_count = htonl(maxcount);
|
||||
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)
|
||||
write_bytes_to_xdr_buf(xdr->buf, length_offset + 4 + maxcount,
|
||||
&zero, 4 - (maxcount&3));
|
||||
|
|
Загрузка…
Ссылка в новой задаче