Remove the internal QEMUFile error state modification from qemu_get_buffer_at(). This function is called by two functions, both of which already check for unexpected return values and handle their own error reporting.
Removing this shared state modification makes qemu_get_buffer_at() strictly thread-safe for concurrent disk reads, serving as a preparatory change for the upcoming fast snapshot load feature. Removed local error by passing errp to improve on error handling, consequently also change caller to use error_prevent and not error_setg. Signed-off-by: Aadeshveer Singh <[email protected]> --- migration/qemu-file.c | 9 +++------ migration/qemu-file.h | 4 ++-- migration/ram.c | 6 +++--- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/migration/qemu-file.c b/migration/qemu-file.c index d5a48115bd..0c28c878a9 100644 --- a/migration/qemu-file.c +++ b/migration/qemu-file.c @@ -550,17 +550,14 @@ void qemu_put_buffer_at(QEMUFile *f, const uint8_t *buf, size_t buflen, } -size_t qemu_get_buffer_at(QEMUFile *f, uint8_t *buf, size_t buflen, - off_t pos) +size_t qemu_get_buffer_at(QEMUFile *f, uint8_t *buf, size_t buflen, off_t pos, + Error **errp) { - Error *err = NULL; - if (f->last_error) { return 0; } - if (qio_channel_pread_all(f->ioc, buf, buflen, pos, &err) < 0) { - qemu_file_set_error_obj(f, -EIO, err); + if (qio_channel_pread_all(f->ioc, buf, buflen, pos, errp) < 0) { return 0; } diff --git a/migration/qemu-file.h b/migration/qemu-file.h index 8f824c124d..966766788d 100644 --- a/migration/qemu-file.h +++ b/migration/qemu-file.h @@ -76,8 +76,8 @@ void qemu_set_offset(QEMUFile *f, off_t off, int whence); off_t qemu_get_offset(QEMUFile *f); void qemu_put_buffer_at(QEMUFile *f, const uint8_t *buf, size_t buflen, off_t pos); -size_t qemu_get_buffer_at(QEMUFile *f, uint8_t *buf, size_t buflen, - off_t pos); +size_t qemu_get_buffer_at(QEMUFile *f, uint8_t *buf, size_t buflen, off_t pos, + Error **errp); QIOChannel *qemu_file_get_ioc(QEMUFile *file); int qemu_file_put_fd(QEMUFile *f, int fd); diff --git a/migration/ram.c b/migration/ram.c index 4728f14d73..967db7c0db 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -4127,7 +4127,7 @@ static bool read_ramblock_mapped_ram(QEMUFile *f, RAMBlock *block, block->pages_offset + offset); } else { read = qemu_get_buffer_at(f, host, size, - block->pages_offset + offset); + block->pages_offset + offset, errp); } if (!read) { @@ -4196,8 +4196,8 @@ static void parse_ramblock_mapped_ram(QEMUFile *f, RAMBlock *block, bitmap_size = BITS_TO_LONGS(num_pages) * sizeof(unsigned long); if (qemu_get_buffer_at(f, (uint8_t *)block->file_bmap, bitmap_size, - header.bitmap_offset) != bitmap_size) { - error_setg(errp, "Error reading dirty bitmap"); + header.bitmap_offset, errp) != bitmap_size) { + error_prepend(errp, "Error reading dirty bitmap"); return; } -- 2.55.0
