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 | 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 | 1164 | BlockDriver *drv = bs->drv; |
1164 | 1165 | if (!drv) |
1165 | 1166 | return -ENOMEDIUM; |
1166 | - if (!drv->bdrv_put_buffer) | |
1167 | + if (!drv->bdrv_save_vmstate) | |
1167 | 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 | 1175 | BlockDriver *drv = bs->drv; |
1174 | 1176 | if (!drv) |
1175 | 1177 | return -ENOMEDIUM; |
1176 | - if (!drv->bdrv_get_buffer) | |
1178 | + if (!drv->bdrv_load_vmstate) | |
1177 | 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 | 159 | const char *base_path, |
160 | 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 | 168 | #endif | ... | ... |
block/qcow2.c
... | ... | @@ -890,12 +890,16 @@ static void qcow_flush(BlockDriverState *bs) |
890 | 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 | 898 | static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) |
894 | 899 | { |
895 | 900 | BDRVQcowState *s = bs->opaque; |
896 | 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 | 903 | return 0; |
900 | 904 | } |
901 | 905 | |
... | ... | @@ -925,26 +929,28 @@ static void dump_refcounts(BlockDriverState *bs) |
925 | 929 | } |
926 | 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 | 933 | int64_t pos, int size) |
930 | 934 | { |
935 | + BDRVQcowState *s = bs->opaque; | |
931 | 936 | int growable = bs->growable; |
932 | 937 | |
933 | 938 | bs->growable = 1; |
934 | - bdrv_pwrite(bs, pos, buf, size); | |
939 | + bdrv_pwrite(bs, qcow_vm_state_offset(s) + pos, buf, size); | |
935 | 940 | bs->growable = growable; |
936 | 941 | |
937 | 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 | 946 | int64_t pos, int size) |
942 | 947 | { |
948 | + BDRVQcowState *s = bs->opaque; | |
943 | 949 | int growable = bs->growable; |
944 | 950 | int ret; |
945 | 951 | |
946 | 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 | 954 | bs->growable = growable; |
949 | 955 | |
950 | 956 | return ret; |
... | ... | @@ -1001,8 +1007,8 @@ static BlockDriver bdrv_qcow2 = { |
1001 | 1007 | .bdrv_snapshot_list = qcow2_snapshot_list, |
1002 | 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 | 1013 | .create_options = qcow_create_options, |
1008 | 1014 | .bdrv_check = qcow_check, | ... | ... |
block_int.h
... | ... | @@ -84,10 +84,10 @@ struct BlockDriver { |
84 | 84 | QEMUSnapshotInfo **psn_info); |
85 | 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 | 92 | /* removable device specific */ |
93 | 93 | int (*bdrv_is_inserted)(BlockDriverState *bs); | ... | ... |
savevm.c
... | ... | @@ -337,46 +337,28 @@ fail: |
337 | 337 | return NULL; |
338 | 338 | } |
339 | 339 | |
340 | -typedef struct QEMUFileBdrv | |
341 | -{ | |
342 | - BlockDriverState *bs; | |
343 | - int64_t base_offset; | |
344 | -} QEMUFileBdrv; | |
345 | - | |
346 | 340 | static int block_put_buffer(void *opaque, const uint8_t *buf, |
347 | 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 | 344 | return size; |
352 | 345 | } |
353 | 346 | |
354 | 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 | 352 | static int bdrv_fclose(void *opaque) |
361 | 353 | { |
362 | - QEMUFileBdrv *s = opaque; | |
363 | - qemu_free(s); | |
364 | 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 | 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 | 364 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, |
... | ... | @@ -1069,7 +1051,6 @@ void do_savevm(Monitor *mon, const char *name) |
1069 | 1051 | BlockDriverState *bs, *bs1; |
1070 | 1052 | QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; |
1071 | 1053 | int must_delete, ret, i; |
1072 | - BlockDriverInfo bdi1, *bdi = &bdi1; | |
1073 | 1054 | QEMUFile *f; |
1074 | 1055 | int saved_vm_running; |
1075 | 1056 | uint32_t vm_state_size; |
... | ... | @@ -1119,14 +1100,8 @@ void do_savevm(Monitor *mon, const char *name) |
1119 | 1100 | #endif |
1120 | 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 | 1103 | /* save the VM state */ |
1129 | - f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1); | |
1104 | + f = qemu_fopen_bdrv(bs, 1); | |
1130 | 1105 | if (!f) { |
1131 | 1106 | monitor_printf(mon, "Could not open VM state file\n"); |
1132 | 1107 | goto the_end; |
... | ... | @@ -1170,7 +1145,6 @@ void do_savevm(Monitor *mon, const char *name) |
1170 | 1145 | void do_loadvm(Monitor *mon, const char *name) |
1171 | 1146 | { |
1172 | 1147 | BlockDriverState *bs, *bs1; |
1173 | - BlockDriverInfo bdi1, *bdi = &bdi1; | |
1174 | 1148 | QEMUSnapshotInfo sn; |
1175 | 1149 | QEMUFile *f; |
1176 | 1150 | int i, ret; |
... | ... | @@ -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 | 1195 | /* Don't even try to load empty VM states */ |
1228 | 1196 | ret = bdrv_snapshot_find(bs, &sn, name); |
1229 | 1197 | if ((ret >= 0) && (sn.vm_state_size == 0)) |
1230 | 1198 | goto the_end; |
1231 | 1199 | |
1232 | 1200 | /* restore the VM state */ |
1233 | - f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0); | |
1201 | + f = qemu_fopen_bdrv(bs, 0); | |
1234 | 1202 | if (!f) { |
1235 | 1203 | monitor_printf(mon, "Could not open VM state file\n"); |
1236 | 1204 | goto the_end; | ... | ... |