提交 fa0eb5c5 编写于 作者: G Greg Kurz

9pfs: fix offset error in v9fs_xattr_read()

The current code tries to copy `read_count' bytes starting at offset
`offset' from a `read_count`-sized iovec. This causes v9fs_pack() to
fail with ENOBUFS.

Since the PDU iovec is already partially filled with `offset' bytes,
let's skip them when creating `qiov_full' and have v9fs_pack() to
copy the whole of it. Moreover, this is consistent with the other
places where v9fs_init_qiov_from_pdu() is called.

This fixes commit "bcb8998f 9pfs: call v9fs_init_qiov_from_pdu
before v9fs_pack".
Signed-off-by: NGreg Kurz <groug@kaod.org>
Reviewed-by: NStefano Stabellini <sstabellini@kernel.org>
上级 6fe76acc
...@@ -1655,7 +1655,7 @@ static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu, ...@@ -1655,7 +1655,7 @@ static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu,
if (is_write) { if (is_write) {
pdu->s->transport->init_out_iov_from_pdu(pdu, &iov, &niov); pdu->s->transport->init_out_iov_from_pdu(pdu, &iov, &niov);
} else { } else {
pdu->s->transport->init_in_iov_from_pdu(pdu, &iov, &niov, size); pdu->s->transport->init_in_iov_from_pdu(pdu, &iov, &niov, size + skip);
} }
qemu_iovec_init_external(&elem, iov, niov); qemu_iovec_init_external(&elem, iov, niov);
...@@ -1685,8 +1685,8 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, ...@@ -1685,8 +1685,8 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp,
} }
offset += err; offset += err;
v9fs_init_qiov_from_pdu(&qiov_full, pdu, 0, read_count, false); v9fs_init_qiov_from_pdu(&qiov_full, pdu, offset, read_count, false);
err = v9fs_pack(qiov_full.iov, qiov_full.niov, offset, err = v9fs_pack(qiov_full.iov, qiov_full.niov, 0,
((char *)fidp->fs.xattr.value) + off, ((char *)fidp->fs.xattr.value) + off,
read_count); read_count);
qemu_iovec_destroy(&qiov_full); qemu_iovec_destroy(&qiov_full);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册