Commit 45566e9c9930ebdfb82822c99a792c5caedb38b0
Committed by
Anthony Liguori
1 parent
e1e8f35a
replace bdrv_{get, put}_buffer with bdrv_{load, save}_vmstate
The VM state offset is a concept internal to the image format. Replace the old bdrv_{get,put}_buffer method that require an index into the image file that is constructed from the VM state offset and an offset into the vmstate with the bdrv_{load,save}_vmstate that just take an offset into the VM state. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
5 changed files
with
37 additions
and
60 deletions
block.c
@@ -1158,24 +1158,26 @@ int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) | @@ -1158,24 +1158,26 @@ int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) | ||
1158 | return drv->bdrv_get_info(bs, bdi); | 1158 | return drv->bdrv_get_info(bs, bdi); |
1159 | } | 1159 | } |
1160 | 1160 | ||
1161 | -int bdrv_put_buffer(BlockDriverState *bs, const uint8_t *buf, int64_t pos, int size) | 1161 | +int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf, |
1162 | + int64_t pos, int size) | ||
1162 | { | 1163 | { |
1163 | BlockDriver *drv = bs->drv; | 1164 | BlockDriver *drv = bs->drv; |
1164 | if (!drv) | 1165 | if (!drv) |
1165 | return -ENOMEDIUM; | 1166 | return -ENOMEDIUM; |
1166 | - if (!drv->bdrv_put_buffer) | 1167 | + if (!drv->bdrv_save_vmstate) |
1167 | return -ENOTSUP; | 1168 | return -ENOTSUP; |
1168 | - return drv->bdrv_put_buffer(bs, buf, pos, size); | 1169 | + return drv->bdrv_save_vmstate(bs, buf, pos, size); |
1169 | } | 1170 | } |
1170 | 1171 | ||
1171 | -int bdrv_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size) | 1172 | +int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, |
1173 | + int64_t pos, int size) | ||
1172 | { | 1174 | { |
1173 | BlockDriver *drv = bs->drv; | 1175 | BlockDriver *drv = bs->drv; |
1174 | if (!drv) | 1176 | if (!drv) |
1175 | return -ENOMEDIUM; | 1177 | return -ENOMEDIUM; |
1176 | - if (!drv->bdrv_get_buffer) | 1178 | + if (!drv->bdrv_load_vmstate) |
1177 | return -ENOTSUP; | 1179 | return -ENOTSUP; |
1178 | - return drv->bdrv_get_buffer(bs, buf, pos, size); | 1180 | + return drv->bdrv_load_vmstate(bs, buf, pos, size); |
1179 | } | 1181 | } |
1180 | 1182 | ||
1181 | /**************************************************************/ | 1183 | /**************************************************************/ |
block.h
@@ -159,9 +159,10 @@ void path_combine(char *dest, int dest_size, | @@ -159,9 +159,10 @@ void path_combine(char *dest, int dest_size, | ||
159 | const char *base_path, | 159 | const char *base_path, |
160 | const char *filename); | 160 | const char *filename); |
161 | 161 | ||
162 | -int bdrv_put_buffer(BlockDriverState *bs, const uint8_t *buf, | ||
163 | - int64_t pos, int size); | 162 | +int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf, |
163 | + int64_t pos, int size); | ||
164 | 164 | ||
165 | -int bdrv_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size); | 165 | +int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, |
166 | + int64_t pos, int size); | ||
166 | 167 | ||
167 | #endif | 168 | #endif |
block/qcow2.c
@@ -890,12 +890,16 @@ static void qcow_flush(BlockDriverState *bs) | @@ -890,12 +890,16 @@ static void qcow_flush(BlockDriverState *bs) | ||
890 | bdrv_flush(s->hd); | 890 | bdrv_flush(s->hd); |
891 | } | 891 | } |
892 | 892 | ||
893 | +static int64_t qcow_vm_state_offset(BDRVQcowState *s) | ||
894 | +{ | ||
895 | + return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits); | ||
896 | +} | ||
897 | + | ||
893 | static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) | 898 | static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) |
894 | { | 899 | { |
895 | BDRVQcowState *s = bs->opaque; | 900 | BDRVQcowState *s = bs->opaque; |
896 | bdi->cluster_size = s->cluster_size; | 901 | bdi->cluster_size = s->cluster_size; |
897 | - bdi->vm_state_offset = (int64_t)s->l1_vm_state_index << | ||
898 | - (s->cluster_bits + s->l2_bits); | 902 | + bdi->vm_state_offset = qcow_vm_state_offset(s); |
899 | return 0; | 903 | return 0; |
900 | } | 904 | } |
901 | 905 | ||
@@ -925,26 +929,28 @@ static void dump_refcounts(BlockDriverState *bs) | @@ -925,26 +929,28 @@ static void dump_refcounts(BlockDriverState *bs) | ||
925 | } | 929 | } |
926 | #endif | 930 | #endif |
927 | 931 | ||
928 | -static int qcow_put_buffer(BlockDriverState *bs, const uint8_t *buf, | 932 | +static int qcow_save_vmstate(BlockDriverState *bs, const uint8_t *buf, |
929 | int64_t pos, int size) | 933 | int64_t pos, int size) |
930 | { | 934 | { |
935 | + BDRVQcowState *s = bs->opaque; | ||
931 | int growable = bs->growable; | 936 | int growable = bs->growable; |
932 | 937 | ||
933 | bs->growable = 1; | 938 | bs->growable = 1; |
934 | - bdrv_pwrite(bs, pos, buf, size); | 939 | + bdrv_pwrite(bs, qcow_vm_state_offset(s) + pos, buf, size); |
935 | bs->growable = growable; | 940 | bs->growable = growable; |
936 | 941 | ||
937 | return size; | 942 | return size; |
938 | } | 943 | } |
939 | 944 | ||
940 | -static int qcow_get_buffer(BlockDriverState *bs, uint8_t *buf, | 945 | +static int qcow_load_vmstate(BlockDriverState *bs, uint8_t *buf, |
941 | int64_t pos, int size) | 946 | int64_t pos, int size) |
942 | { | 947 | { |
948 | + BDRVQcowState *s = bs->opaque; | ||
943 | int growable = bs->growable; | 949 | int growable = bs->growable; |
944 | int ret; | 950 | int ret; |
945 | 951 | ||
946 | bs->growable = 1; | 952 | bs->growable = 1; |
947 | - ret = bdrv_pread(bs, pos, buf, size); | 953 | + ret = bdrv_pread(bs, qcow_vm_state_offset(s) + pos, buf, size); |
948 | bs->growable = growable; | 954 | bs->growable = growable; |
949 | 955 | ||
950 | return ret; | 956 | return ret; |
@@ -1001,8 +1007,8 @@ static BlockDriver bdrv_qcow2 = { | @@ -1001,8 +1007,8 @@ static BlockDriver bdrv_qcow2 = { | ||
1001 | .bdrv_snapshot_list = qcow2_snapshot_list, | 1007 | .bdrv_snapshot_list = qcow2_snapshot_list, |
1002 | .bdrv_get_info = qcow_get_info, | 1008 | .bdrv_get_info = qcow_get_info, |
1003 | 1009 | ||
1004 | - .bdrv_put_buffer = qcow_put_buffer, | ||
1005 | - .bdrv_get_buffer = qcow_get_buffer, | 1010 | + .bdrv_save_vmstate = qcow_save_vmstate, |
1011 | + .bdrv_load_vmstate = qcow_load_vmstate, | ||
1006 | 1012 | ||
1007 | .create_options = qcow_create_options, | 1013 | .create_options = qcow_create_options, |
1008 | .bdrv_check = qcow_check, | 1014 | .bdrv_check = qcow_check, |
block_int.h
@@ -84,10 +84,10 @@ struct BlockDriver { | @@ -84,10 +84,10 @@ struct BlockDriver { | ||
84 | QEMUSnapshotInfo **psn_info); | 84 | QEMUSnapshotInfo **psn_info); |
85 | int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi); | 85 | int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi); |
86 | 86 | ||
87 | - int (*bdrv_put_buffer)(BlockDriverState *bs, const uint8_t *buf, | ||
88 | - int64_t pos, int size); | ||
89 | - int (*bdrv_get_buffer)(BlockDriverState *bs, uint8_t *buf, | ||
90 | - int64_t pos, int size); | 87 | + int (*bdrv_save_vmstate)(BlockDriverState *bs, const uint8_t *buf, |
88 | + int64_t pos, int size); | ||
89 | + int (*bdrv_load_vmstate)(BlockDriverState *bs, uint8_t *buf, | ||
90 | + int64_t pos, int size); | ||
91 | 91 | ||
92 | /* removable device specific */ | 92 | /* removable device specific */ |
93 | int (*bdrv_is_inserted)(BlockDriverState *bs); | 93 | int (*bdrv_is_inserted)(BlockDriverState *bs); |
savevm.c
@@ -337,46 +337,28 @@ fail: | @@ -337,46 +337,28 @@ fail: | ||
337 | return NULL; | 337 | return NULL; |
338 | } | 338 | } |
339 | 339 | ||
340 | -typedef struct QEMUFileBdrv | ||
341 | -{ | ||
342 | - BlockDriverState *bs; | ||
343 | - int64_t base_offset; | ||
344 | -} QEMUFileBdrv; | ||
345 | - | ||
346 | static int block_put_buffer(void *opaque, const uint8_t *buf, | 340 | static int block_put_buffer(void *opaque, const uint8_t *buf, |
347 | int64_t pos, int size) | 341 | int64_t pos, int size) |
348 | { | 342 | { |
349 | - QEMUFileBdrv *s = opaque; | ||
350 | - bdrv_put_buffer(s->bs, buf, s->base_offset + pos, size); | 343 | + bdrv_save_vmstate(opaque, buf, pos, size); |
351 | return size; | 344 | return size; |
352 | } | 345 | } |
353 | 346 | ||
354 | static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) | 347 | static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) |
355 | { | 348 | { |
356 | - QEMUFileBdrv *s = opaque; | ||
357 | - return bdrv_get_buffer(s->bs, buf, s->base_offset + pos, size); | 349 | + return bdrv_load_vmstate(opaque, buf, pos, size); |
358 | } | 350 | } |
359 | 351 | ||
360 | static int bdrv_fclose(void *opaque) | 352 | static int bdrv_fclose(void *opaque) |
361 | { | 353 | { |
362 | - QEMUFileBdrv *s = opaque; | ||
363 | - qemu_free(s); | ||
364 | return 0; | 354 | return 0; |
365 | } | 355 | } |
366 | 356 | ||
367 | -static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable) | 357 | +static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable) |
368 | { | 358 | { |
369 | - QEMUFileBdrv *s; | ||
370 | - | ||
371 | - s = qemu_mallocz(sizeof(QEMUFileBdrv)); | ||
372 | - | ||
373 | - s->bs = bs; | ||
374 | - s->base_offset = offset; | ||
375 | - | ||
376 | if (is_writable) | 359 | if (is_writable) |
377 | - return qemu_fopen_ops(s, block_put_buffer, NULL, bdrv_fclose, NULL, NULL); | ||
378 | - | ||
379 | - return qemu_fopen_ops(s, NULL, block_get_buffer, bdrv_fclose, NULL, NULL); | 360 | + return qemu_fopen_ops(bs, block_put_buffer, NULL, bdrv_fclose, NULL, NULL); |
361 | + return qemu_fopen_ops(bs, NULL, block_get_buffer, bdrv_fclose, NULL, NULL); | ||
380 | } | 362 | } |
381 | 363 | ||
382 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, | 364 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, |
@@ -1069,7 +1051,6 @@ void do_savevm(Monitor *mon, const char *name) | @@ -1069,7 +1051,6 @@ void do_savevm(Monitor *mon, const char *name) | ||
1069 | BlockDriverState *bs, *bs1; | 1051 | BlockDriverState *bs, *bs1; |
1070 | QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; | 1052 | QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; |
1071 | int must_delete, ret, i; | 1053 | int must_delete, ret, i; |
1072 | - BlockDriverInfo bdi1, *bdi = &bdi1; | ||
1073 | QEMUFile *f; | 1054 | QEMUFile *f; |
1074 | int saved_vm_running; | 1055 | int saved_vm_running; |
1075 | uint32_t vm_state_size; | 1056 | uint32_t vm_state_size; |
@@ -1119,14 +1100,8 @@ void do_savevm(Monitor *mon, const char *name) | @@ -1119,14 +1100,8 @@ void do_savevm(Monitor *mon, const char *name) | ||
1119 | #endif | 1100 | #endif |
1120 | sn->vm_clock_nsec = qemu_get_clock(vm_clock); | 1101 | sn->vm_clock_nsec = qemu_get_clock(vm_clock); |
1121 | 1102 | ||
1122 | - if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) { | ||
1123 | - monitor_printf(mon, "Device %s does not support VM state snapshots\n", | ||
1124 | - bdrv_get_device_name(bs)); | ||
1125 | - goto the_end; | ||
1126 | - } | ||
1127 | - | ||
1128 | /* save the VM state */ | 1103 | /* save the VM state */ |
1129 | - f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1); | 1104 | + f = qemu_fopen_bdrv(bs, 1); |
1130 | if (!f) { | 1105 | if (!f) { |
1131 | monitor_printf(mon, "Could not open VM state file\n"); | 1106 | monitor_printf(mon, "Could not open VM state file\n"); |
1132 | goto the_end; | 1107 | goto the_end; |
@@ -1170,7 +1145,6 @@ void do_savevm(Monitor *mon, const char *name) | @@ -1170,7 +1145,6 @@ void do_savevm(Monitor *mon, const char *name) | ||
1170 | void do_loadvm(Monitor *mon, const char *name) | 1145 | void do_loadvm(Monitor *mon, const char *name) |
1171 | { | 1146 | { |
1172 | BlockDriverState *bs, *bs1; | 1147 | BlockDriverState *bs, *bs1; |
1173 | - BlockDriverInfo bdi1, *bdi = &bdi1; | ||
1174 | QEMUSnapshotInfo sn; | 1148 | QEMUSnapshotInfo sn; |
1175 | QEMUFile *f; | 1149 | QEMUFile *f; |
1176 | int i, ret; | 1150 | int i, ret; |
@@ -1218,19 +1192,13 @@ void do_loadvm(Monitor *mon, const char *name) | @@ -1218,19 +1192,13 @@ void do_loadvm(Monitor *mon, const char *name) | ||
1218 | } | 1192 | } |
1219 | } | 1193 | } |
1220 | 1194 | ||
1221 | - if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) { | ||
1222 | - monitor_printf(mon, "Device %s does not support VM state snapshots\n", | ||
1223 | - bdrv_get_device_name(bs)); | ||
1224 | - return; | ||
1225 | - } | ||
1226 | - | ||
1227 | /* Don't even try to load empty VM states */ | 1195 | /* Don't even try to load empty VM states */ |
1228 | ret = bdrv_snapshot_find(bs, &sn, name); | 1196 | ret = bdrv_snapshot_find(bs, &sn, name); |
1229 | if ((ret >= 0) && (sn.vm_state_size == 0)) | 1197 | if ((ret >= 0) && (sn.vm_state_size == 0)) |
1230 | goto the_end; | 1198 | goto the_end; |
1231 | 1199 | ||
1232 | /* restore the VM state */ | 1200 | /* restore the VM state */ |
1233 | - f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0); | 1201 | + f = qemu_fopen_bdrv(bs, 0); |
1234 | if (!f) { | 1202 | if (!f) { |
1235 | monitor_printf(mon, "Could not open VM state file\n"); | 1203 | monitor_printf(mon, "Could not open VM state file\n"); |
1236 | goto the_end; | 1204 | goto the_end; |