On Fri, Oct 11, 2013 at 02:17:31PM -0400, Jeff Cody wrote:
> + case PAYLOAD_BLOCK_FULLY_PRESENT:
> + /* if the file offset address is in the header zone,
> + * there is a problem */
> + if (sinfo.file_offset < (1024 * 1024)) {
When a block is allocated we update s->bat[] and changed the file size.
This should be undone so that in-memory and on-disk metadata doesn't get
out of sync.
> + ret = -EFAULT;
> + goto exit;
> + }
> +
> + if (!use_zero_buffers) {
> + qemu_iovec_concat(&hd_qiov, qiov, bytes_done,
> + sinfo.bytes_avail);
> + }
> + /* block exists, so we can just overwrite it */
> + qemu_co_mutex_unlock(&s->lock);
> + ret = bdrv_co_writev(bs->file,
> + sinfo.file_offset >> BDRV_SECTOR_BITS,
> + sectors_to_write, &hd_qiov);
> + qemu_co_mutex_lock(&s->lock);
> + if (ret < 0) {
> + goto exit;
Same comment about in-memory and on-disk metadata getting out of sync in
the error case.
> +exit:
> + qemu_vfree(iov1.iov_base);
> + qemu_vfree(iov2.iov_base);
> + qemu_co_mutex_unlock(&s->lock);
> + return ret;
Missing qemu_iovec_destroy(&hd_qiov).