}
}
}
- if (ret) {
+ if (ret < 0) {
blk_mig_cleanup();
return ret;
}
qemu_put_be64(f, BLK_MIG_FLAG_EOS);
- return 0;
+ /* Complete when bulk transfer is done and all dirty blocks have been
+ * transferred.
+ */
+ return block_mig_state.bulk_completed &&
+ block_mig_state.submitted == 0 &&
+ block_mig_state.read_done == 0;
}
static int block_save_complete(QEMUFile *f, void *opaque)
} while (ret == 0);
blk_mig_cleanup();
- if (ret) {
+ if (ret < 0) {
return ret;
}
/* report completion */
(addr == 100) ? '\n' : '\r');
fflush(stdout);
} else if (!(flags & BLK_MIG_FLAG_EOS)) {
- fprintf(stderr, "Unknown flags\n");
+ fprintf(stderr, "Unknown block migration flags: %#x\n", flags);
return -EINVAL;
}
ret = qemu_file_get_error(f);