The Wednesday 30 Jul 2014 à 09:53:30 (+0100), Stefan Hajnoczi wrote : > When request A is a strict superset of request B: > > AAAAAAAA > BBBB > > multiwrite_merge() merges them as follows: > > AABBBB > > The tail of request A should have been included: > > AABBBBAA > > This patch fixes data loss but this code path is probably rare. Since > guests cannot assume ordering between in-flight requests, few > applications submit overlapping write requests. > > Reported-by: Slava Pestov <[email protected]> > Signed-off-by: Stefan Hajnoczi <[email protected]> > --- > block.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/block.c b/block.c > index 8cf519b..0a3ac43 100644 > --- a/block.c > +++ b/block.c > @@ -4498,6 +4498,12 @@ static int multiwrite_merge(BlockDriverState *bs, > BlockRequest *reqs, > // Add the second request > qemu_iovec_concat(qiov, reqs[i].qiov, 0, reqs[i].qiov->size); > > + // Add tail of first request, if necessary > + if (qiov->size < reqs[outidx].qiov->size) { > + qemu_iovec_concat(qiov, reqs[outidx].qiov, qiov->size, > + reqs[outidx].qiov->size - qiov->size); > + } > + > reqs[outidx].nb_sectors = qiov->size >> 9; > reqs[outidx].qiov = qiov; > > -- > 1.9.3 > >
Seems to make sense. Reviewed-by: Benoit Canet <[email protected]>
