Revision 8b3b7206
b/block/qcow2-cluster.c | ||
---|---|---|
64 | 64 |
BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_WRITE_TABLE); |
65 | 65 |
for(i = 0; i < s->l1_size; i++) |
66 | 66 |
new_l1_table[i] = cpu_to_be64(new_l1_table[i]); |
67 |
ret = bdrv_pwrite(bs->file, new_l1_table_offset, new_l1_table, new_l1_size2); |
|
68 |
if (ret != new_l1_size2)
|
|
67 |
ret = bdrv_pwrite_sync(bs->file, new_l1_table_offset, new_l1_table, new_l1_size2);
|
|
68 |
if (ret < 0)
|
|
69 | 69 |
goto fail; |
70 | 70 |
for(i = 0; i < s->l1_size; i++) |
71 | 71 |
new_l1_table[i] = be64_to_cpu(new_l1_table[i]); |
... | ... | |
74 | 74 |
BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_ACTIVATE_TABLE); |
75 | 75 |
cpu_to_be32w((uint32_t*)data, new_l1_size); |
76 | 76 |
cpu_to_be64w((uint64_t*)(data + 4), new_l1_table_offset); |
77 |
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, l1_size), data,sizeof(data)); |
|
78 |
if (ret != sizeof(data)) {
|
|
77 |
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_size), data,sizeof(data));
|
|
78 |
if (ret < 0) {
|
|
79 | 79 |
goto fail; |
80 | 80 |
} |
81 | 81 |
qemu_free(s->l1_table); |
... | ... | |
87 | 87 |
fail: |
88 | 88 |
qemu_free(new_l1_table); |
89 | 89 |
qcow2_free_clusters(bs, new_l1_table_offset, new_l1_size2); |
90 |
return ret < 0 ? ret : -EIO;
|
|
90 |
return ret; |
|
91 | 91 |
} |
92 | 92 |
|
93 | 93 |
void qcow2_l2_cache_reset(BlockDriverState *bs) |
... | ... | |
207 | 207 |
} |
208 | 208 |
|
209 | 209 |
BLKDBG_EVENT(bs->file, BLKDBG_L1_UPDATE); |
210 |
ret = bdrv_pwrite(bs->file, s->l1_table_offset + 8 * l1_start_index, |
|
210 |
ret = bdrv_pwrite_sync(bs->file, s->l1_table_offset + 8 * l1_start_index,
|
|
211 | 211 |
buf, sizeof(buf)); |
212 | 212 |
if (ret < 0) { |
213 | 213 |
return ret; |
... | ... | |
263 | 263 |
} |
264 | 264 |
/* write the l2 table to the file */ |
265 | 265 |
BLKDBG_EVENT(bs->file, BLKDBG_L2_ALLOC_WRITE); |
266 |
ret = bdrv_pwrite(bs->file, l2_offset, l2_table, |
|
266 |
ret = bdrv_pwrite_sync(bs->file, l2_offset, l2_table,
|
|
267 | 267 |
s->l2_size * sizeof(uint64_t)); |
268 | 268 |
if (ret < 0) { |
269 | 269 |
goto fail; |
... | ... | |
413 | 413 |
&s->aes_encrypt_key); |
414 | 414 |
} |
415 | 415 |
BLKDBG_EVENT(bs->file, BLKDBG_COW_WRITE); |
416 |
ret = bdrv_write(bs->file, (cluster_offset >> 9) + n_start, |
|
417 |
s->cluster_data, n);
|
|
416 |
ret = bdrv_write_sync(bs->file, (cluster_offset >> 9) + n_start,
|
|
417 |
s->cluster_data, n); |
|
418 | 418 |
if (ret < 0) |
419 | 419 |
return ret; |
420 | 420 |
return 0; |
... | ... | |
631 | 631 |
|
632 | 632 |
BLKDBG_EVENT(bs->file, BLKDBG_L2_UPDATE_COMPRESSED); |
633 | 633 |
l2_table[l2_index] = cpu_to_be64(cluster_offset); |
634 |
if (bdrv_pwrite(bs->file, |
|
634 |
if (bdrv_pwrite_sync(bs->file,
|
|
635 | 635 |
l2_offset + l2_index * sizeof(uint64_t), |
636 | 636 |
l2_table + l2_index, |
637 |
sizeof(uint64_t)) != sizeof(uint64_t))
|
|
637 |
sizeof(uint64_t)) < 0)
|
|
638 | 638 |
return 0; |
639 | 639 |
|
640 | 640 |
return cluster_offset; |
... | ... | |
655 | 655 |
int ret; |
656 | 656 |
|
657 | 657 |
BLKDBG_EVENT(bs->file, BLKDBG_L2_UPDATE); |
658 |
ret = bdrv_pwrite(bs->file, l2_offset + start_offset, |
|
658 |
ret = bdrv_pwrite_sync(bs->file, l2_offset + start_offset,
|
|
659 | 659 |
&l2_table[l2_start_index], len); |
660 | 660 |
if (ret < 0) { |
661 | 661 |
return ret; |
b/block/qcow2-refcount.c | ||
---|---|---|
44 | 44 |
} |
45 | 45 |
|
46 | 46 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_UPDATE); |
47 |
if (bdrv_pwrite(bs->file, s->refcount_block_cache_offset, |
|
48 |
s->refcount_block_cache, size) != size)
|
|
47 |
if (bdrv_pwrite_sync(bs->file, s->refcount_block_cache_offset,
|
|
48 |
s->refcount_block_cache, size) < 0)
|
|
49 | 49 |
{ |
50 | 50 |
return -EIO; |
51 | 51 |
} |
... | ... | |
269 | 269 |
|
270 | 270 |
/* Now the new refcount block needs to be written to disk */ |
271 | 271 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE); |
272 |
ret = bdrv_pwrite(bs->file, new_block, s->refcount_block_cache, |
|
272 |
ret = bdrv_pwrite_sync(bs->file, new_block, s->refcount_block_cache,
|
|
273 | 273 |
s->cluster_size); |
274 | 274 |
if (ret < 0) { |
275 | 275 |
goto fail_block; |
... | ... | |
279 | 279 |
if (refcount_table_index < s->refcount_table_size) { |
280 | 280 |
uint64_t data64 = cpu_to_be64(new_block); |
281 | 281 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_HOOKUP); |
282 |
ret = bdrv_pwrite(bs->file, |
|
282 |
ret = bdrv_pwrite_sync(bs->file,
|
|
283 | 283 |
s->refcount_table_offset + refcount_table_index * sizeof(uint64_t), |
284 | 284 |
&data64, sizeof(data64)); |
285 | 285 |
if (ret < 0) { |
... | ... | |
359 | 359 |
|
360 | 360 |
/* Write refcount blocks to disk */ |
361 | 361 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_BLOCKS); |
362 |
ret = bdrv_pwrite(bs->file, meta_offset, new_blocks, |
|
362 |
ret = bdrv_pwrite_sync(bs->file, meta_offset, new_blocks,
|
|
363 | 363 |
blocks_clusters * s->cluster_size); |
364 | 364 |
qemu_free(new_blocks); |
365 | 365 |
if (ret < 0) { |
... | ... | |
372 | 372 |
} |
373 | 373 |
|
374 | 374 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_TABLE); |
375 |
ret = bdrv_pwrite(bs->file, table_offset, new_table, |
|
375 |
ret = bdrv_pwrite_sync(bs->file, table_offset, new_table,
|
|
376 | 376 |
table_size * sizeof(uint64_t)); |
377 | 377 |
if (ret < 0) { |
378 | 378 |
goto fail_table; |
... | ... | |
387 | 387 |
cpu_to_be64w((uint64_t*)data, table_offset); |
388 | 388 |
cpu_to_be32w((uint32_t*)(data + 8), table_clusters); |
389 | 389 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_SWITCH_TABLE); |
390 |
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, refcount_table_offset), |
|
390 |
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, refcount_table_offset),
|
|
391 | 391 |
data, sizeof(data)); |
392 | 392 |
if (ret < 0) { |
393 | 393 |
goto fail_table; |
... | ... | |
444 | 444 |
size = (last_index - first_index) << REFCOUNT_SHIFT; |
445 | 445 |
|
446 | 446 |
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_UPDATE_PART); |
447 |
ret = bdrv_pwrite(bs->file, |
|
447 |
ret = bdrv_pwrite_sync(bs->file,
|
|
448 | 448 |
refcount_block_offset + (first_index << REFCOUNT_SHIFT), |
449 | 449 |
&s->refcount_block_cache[first_index], size); |
450 | 450 |
if (ret < 0) { |
... | ... | |
826 | 826 |
} |
827 | 827 |
} |
828 | 828 |
if (l2_modified) { |
829 |
if (bdrv_pwrite(bs->file, |
|
830 |
l2_offset, l2_table, l2_size) != l2_size)
|
|
829 |
if (bdrv_pwrite_sync(bs->file,
|
|
830 |
l2_offset, l2_table, l2_size) < 0)
|
|
831 | 831 |
goto fail; |
832 | 832 |
} |
833 | 833 |
|
... | ... | |
850 | 850 |
if (l1_modified) { |
851 | 851 |
for(i = 0; i < l1_size; i++) |
852 | 852 |
cpu_to_be64s(&l1_table[i]); |
853 |
if (bdrv_pwrite(bs->file, l1_table_offset, l1_table, |
|
854 |
l1_size2) != l1_size2)
|
|
853 |
if (bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table,
|
|
854 |
l1_size2) < 0)
|
|
855 | 855 |
goto fail; |
856 | 856 |
for(i = 0; i < l1_size; i++) |
857 | 857 |
be64_to_cpus(&l1_table[i]); |
b/block/qcow2-snapshot.c | ||
---|---|---|
158 | 158 |
h.id_str_size = cpu_to_be16(id_str_size); |
159 | 159 |
h.name_size = cpu_to_be16(name_size); |
160 | 160 |
offset = align_offset(offset, 8); |
161 |
if (bdrv_pwrite(bs->file, offset, &h, sizeof(h)) != sizeof(h))
|
|
161 |
if (bdrv_pwrite_sync(bs->file, offset, &h, sizeof(h)) < 0)
|
|
162 | 162 |
goto fail; |
163 | 163 |
offset += sizeof(h); |
164 |
if (bdrv_pwrite(bs->file, offset, sn->id_str, id_str_size) != id_str_size)
|
|
164 |
if (bdrv_pwrite_sync(bs->file, offset, sn->id_str, id_str_size) < 0)
|
|
165 | 165 |
goto fail; |
166 | 166 |
offset += id_str_size; |
167 |
if (bdrv_pwrite(bs->file, offset, sn->name, name_size) != name_size)
|
|
167 |
if (bdrv_pwrite_sync(bs->file, offset, sn->name, name_size) < 0)
|
|
168 | 168 |
goto fail; |
169 | 169 |
offset += name_size; |
170 | 170 |
} |
171 | 171 |
|
172 | 172 |
/* update the various header fields */ |
173 | 173 |
data64 = cpu_to_be64(snapshots_offset); |
174 |
if (bdrv_pwrite(bs->file, offsetof(QCowHeader, snapshots_offset), |
|
175 |
&data64, sizeof(data64)) != sizeof(data64))
|
|
174 |
if (bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, snapshots_offset),
|
|
175 |
&data64, sizeof(data64)) < 0)
|
|
176 | 176 |
goto fail; |
177 | 177 |
data32 = cpu_to_be32(s->nb_snapshots); |
178 |
if (bdrv_pwrite(bs->file, offsetof(QCowHeader, nb_snapshots), |
|
179 |
&data32, sizeof(data32)) != sizeof(data32))
|
|
178 |
if (bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
|
|
179 |
&data32, sizeof(data32)) < 0)
|
|
180 | 180 |
goto fail; |
181 | 181 |
|
182 | 182 |
/* free the old snapshot table */ |
... | ... | |
284 | 284 |
for(i = 0; i < s->l1_size; i++) { |
285 | 285 |
l1_table[i] = cpu_to_be64(s->l1_table[i]); |
286 | 286 |
} |
287 |
if (bdrv_pwrite(bs->file, sn->l1_table_offset, |
|
288 |
l1_table, s->l1_size * sizeof(uint64_t)) != |
|
289 |
(s->l1_size * sizeof(uint64_t))) |
|
287 |
if (bdrv_pwrite_sync(bs->file, sn->l1_table_offset, |
|
288 |
l1_table, s->l1_size * sizeof(uint64_t)) < 0) |
|
290 | 289 |
goto fail; |
291 | 290 |
qemu_free(l1_table); |
292 | 291 |
l1_table = NULL; |
... | ... | |
335 | 334 |
if (bdrv_pread(bs->file, sn->l1_table_offset, |
336 | 335 |
s->l1_table, l1_size2) != l1_size2) |
337 | 336 |
goto fail; |
338 |
if (bdrv_pwrite(bs->file, s->l1_table_offset, |
|
339 |
s->l1_table, l1_size2) != l1_size2)
|
|
337 |
if (bdrv_pwrite_sync(bs->file, s->l1_table_offset,
|
|
338 |
s->l1_table, l1_size2) < 0)
|
|
340 | 339 |
goto fail; |
341 | 340 |
for(i = 0;i < s->l1_size; i++) { |
342 | 341 |
be64_to_cpus(&s->l1_table[i]); |
b/block/qcow2.c | ||
---|---|---|
735 | 735 |
backing_file_offset = sizeof(QCowHeader) + offset; |
736 | 736 |
} |
737 | 737 |
|
738 |
ret = bdrv_pwrite(bs->file, sizeof(QCowHeader), buf, ext_size); |
|
738 |
ret = bdrv_pwrite_sync(bs->file, sizeof(QCowHeader), buf, ext_size);
|
|
739 | 739 |
if (ret < 0) { |
740 | 740 |
goto fail; |
741 | 741 |
} |
... | ... | |
744 | 744 |
uint64_t be_backing_file_offset = cpu_to_be64(backing_file_offset); |
745 | 745 |
uint32_t be_backing_file_size = cpu_to_be32(backing_file_len); |
746 | 746 |
|
747 |
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, backing_file_offset), |
|
747 |
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, backing_file_offset),
|
|
748 | 748 |
&be_backing_file_offset, sizeof(uint64_t)); |
749 | 749 |
if (ret < 0) { |
750 | 750 |
goto fail; |
751 | 751 |
} |
752 | 752 |
|
753 |
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, backing_file_size), |
|
753 |
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, backing_file_size),
|
|
754 | 754 |
&be_backing_file_size, sizeof(uint32_t)); |
755 | 755 |
if (ret < 0) { |
756 | 756 |
goto fail; |
... | ... | |
1131 | 1131 |
|
1132 | 1132 |
/* write updated header.size */ |
1133 | 1133 |
offset = cpu_to_be64(offset); |
1134 |
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, size), |
|
1135 |
&offset, sizeof(uint64_t)); |
|
1134 |
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size),
|
|
1135 |
&offset, sizeof(uint64_t));
|
|
1136 | 1136 |
if (ret < 0) { |
1137 | 1137 |
return ret; |
1138 | 1138 |
} |
Also available in: Unified diff