Revision ae261c86 block/vmdk.c
b/block/vmdk.c | ||
---|---|---|
102 | 102 |
{ |
103 | 103 |
uint32_t magic; |
104 | 104 |
|
105 |
if (buf_size < 4) |
|
105 |
if (buf_size < 4) {
|
|
106 | 106 |
return 0; |
107 |
} |
|
107 | 108 |
magic = be32_to_cpu(*(uint32_t *)buf); |
108 | 109 |
if (magic == VMDK3_MAGIC || |
109 | 110 |
magic == VMDK4_MAGIC) { |
... | ... | |
193 | 194 |
cid_str_size = sizeof("CID"); |
194 | 195 |
} |
195 | 196 |
|
196 |
if ((p_name = strstr(desc,cid_str)) != NULL) { |
|
197 |
p_name = strstr(desc, cid_str); |
|
198 |
if (p_name != NULL) { |
|
197 | 199 |
p_name += cid_str_size; |
198 |
sscanf(p_name,"%x",&cid);
|
|
200 |
sscanf(p_name, "%x", &cid);
|
|
199 | 201 |
} |
200 | 202 |
|
201 | 203 |
return cid; |
... | ... | |
212 | 214 |
return -EIO; |
213 | 215 |
} |
214 | 216 |
|
215 |
tmp_str = strstr(desc,"parentCID"); |
|
217 |
tmp_str = strstr(desc, "parentCID");
|
|
216 | 218 |
pstrcpy(tmp_desc, sizeof(tmp_desc), tmp_str); |
217 |
if ((p_name = strstr(desc,"CID")) != NULL) { |
|
219 |
p_name = strstr(desc, "CID"); |
|
220 |
if (p_name != NULL) { |
|
218 | 221 |
p_name += sizeof("CID"); |
219 | 222 |
snprintf(p_name, sizeof(desc) - (p_name - desc), "%x\n", cid); |
220 | 223 |
pstrcat(desc, sizeof(desc), tmp_desc); |
... | ... | |
234 | 237 |
uint32_t cur_pcid; |
235 | 238 |
|
236 | 239 |
if (p_bs) { |
237 |
cur_pcid = vmdk_read_cid(p_bs,0); |
|
238 |
if (s->parent_cid != cur_pcid) |
|
239 |
// CID not valid
|
|
240 |
cur_pcid = vmdk_read_cid(p_bs, 0);
|
|
241 |
if (s->parent_cid != cur_pcid) {
|
|
242 |
/* CID not valid */
|
|
240 | 243 |
return 0; |
244 |
} |
|
241 | 245 |
} |
242 | 246 |
#endif |
243 |
// CID valid
|
|
247 |
/* CID valid */
|
|
244 | 248 |
return 1; |
245 | 249 |
} |
246 | 250 |
|
... | ... | |
255 | 259 |
return -1; |
256 | 260 |
} |
257 | 261 |
|
258 |
if ((p_name = strstr(desc,"parentFileNameHint")) != NULL) { |
|
262 |
p_name = strstr(desc, "parentFileNameHint"); |
|
263 |
if (p_name != NULL) { |
|
259 | 264 |
char *end_name; |
260 | 265 |
|
261 | 266 |
p_name += sizeof("parentFileNameHint") + 1; |
262 |
if ((end_name = strchr(p_name,'\"')) == NULL) |
|
267 |
end_name = strchr(p_name, '\"'); |
|
268 |
if (end_name == NULL) { |
|
263 | 269 |
return -1; |
264 |
if ((end_name - p_name) > sizeof (bs->backing_file) - 1) |
|
270 |
} |
|
271 |
if ((end_name - p_name) > sizeof(bs->backing_file) - 1) { |
|
265 | 272 |
return -1; |
273 |
} |
|
266 | 274 |
|
267 | 275 |
pstrcpy(bs->backing_file, end_name - p_name + 1, p_name); |
268 | 276 |
} |
... | ... | |
595 | 603 |
if (bs->backing_hd) { |
596 | 604 |
int ret; |
597 | 605 |
|
598 |
if (!vmdk_is_cid_valid(bs)) |
|
606 |
if (!vmdk_is_cid_valid(bs)) {
|
|
599 | 607 |
return -1; |
608 |
} |
|
600 | 609 |
|
601 | 610 |
/* floor offset to cluster */ |
602 | 611 |
offset -= offset % (extent->cluster_sectors * 512); |
... | ... | |
655 | 664 |
int min_index, i, j; |
656 | 665 |
uint32_t min_count, *l2_table, tmp = 0; |
657 | 666 |
|
658 |
if (m_data) |
|
667 |
if (m_data) {
|
|
659 | 668 |
m_data->valid = 0; |
669 |
} |
|
660 | 670 |
if (extent->flat) { |
661 | 671 |
*cluster_offset = extent->flat_start_offset; |
662 | 672 |
return 0; |
... | ... | |
712 | 722 |
return -1; |
713 | 723 |
} |
714 | 724 |
|
715 |
// Avoid the L2 tables update for the images that have snapshots.
|
|
725 |
/* Avoid the L2 tables update for the images that have snapshots. */
|
|
716 | 726 |
*cluster_offset = bdrv_getlength(extent->file); |
717 | 727 |
bdrv_truncate( |
718 | 728 |
extent->file, |
... | ... | |
729 | 739 |
* or inappropriate VM shutdown. |
730 | 740 |
*/ |
731 | 741 |
if (get_whole_cluster( |
732 |
bs, extent, *cluster_offset, offset, allocate) == -1) |
|
742 |
bs, extent, *cluster_offset, offset, allocate) == -1) {
|
|
733 | 743 |
return -1; |
744 |
} |
|
734 | 745 |
|
735 | 746 |
if (m_data) { |
736 | 747 |
m_data->offset = tmp; |
... | ... | |
780 | 791 |
|
781 | 792 |
index_in_cluster = sector_num % extent->cluster_sectors; |
782 | 793 |
n = extent->cluster_sectors - index_in_cluster; |
783 |
if (n > nb_sectors) |
|
794 |
if (n > nb_sectors) {
|
|
784 | 795 |
n = nb_sectors; |
796 |
} |
|
785 | 797 |
*pnum = n; |
786 | 798 |
return ret; |
787 | 799 |
} |
... | ... | |
805 | 817 |
sector_num << 9, 0, &cluster_offset); |
806 | 818 |
index_in_cluster = sector_num % extent->cluster_sectors; |
807 | 819 |
n = extent->cluster_sectors - index_in_cluster; |
808 |
if (n > nb_sectors) |
|
820 |
if (n > nb_sectors) {
|
|
809 | 821 |
n = nb_sectors; |
822 |
} |
|
810 | 823 |
if (ret) { |
811 | 824 |
/* if not allocated, try to read from parent image, if exist */ |
812 | 825 |
if (bs->backing_hd) { |
813 |
if (!vmdk_is_cid_valid(bs)) |
|
826 |
if (!vmdk_is_cid_valid(bs)) {
|
|
814 | 827 |
return -EINVAL; |
828 |
} |
|
815 | 829 |
ret = bdrv_read(bs->backing_hd, sector_num, buf, n); |
816 |
if (ret < 0) |
|
830 |
if (ret < 0) {
|
|
817 | 831 |
return ret; |
832 |
} |
|
818 | 833 |
} else { |
819 | 834 |
memset(buf, 0, 512 * n); |
820 | 835 |
} |
... | ... | |
888 | 903 |
sector_num += n; |
889 | 904 |
buf += n * 512; |
890 | 905 |
|
891 |
// update CID on the first write every time the virtual disk is opened |
|
906 |
/* update CID on the first write every time the virtual disk is |
|
907 |
* opened */ |
|
892 | 908 |
if (!s->cid_updated) { |
893 | 909 |
vmdk_write_cid(bs, time(NULL)); |
894 | 910 |
s->cid_updated = true; |
... | ... | |
1301 | 1317 |
}; |
1302 | 1318 |
|
1303 | 1319 |
static BlockDriver bdrv_vmdk = { |
1304 |
.format_name = "vmdk",
|
|
1305 |
.instance_size = sizeof(BDRVVmdkState),
|
|
1306 |
.bdrv_probe = vmdk_probe,
|
|
1320 |
.format_name = "vmdk",
|
|
1321 |
.instance_size = sizeof(BDRVVmdkState),
|
|
1322 |
.bdrv_probe = vmdk_probe,
|
|
1307 | 1323 |
.bdrv_open = vmdk_open, |
1308 |
.bdrv_read = vmdk_read,
|
|
1309 |
.bdrv_write = vmdk_write,
|
|
1310 |
.bdrv_close = vmdk_close,
|
|
1311 |
.bdrv_create = vmdk_create,
|
|
1312 |
.bdrv_flush = vmdk_flush,
|
|
1313 |
.bdrv_is_allocated = vmdk_is_allocated,
|
|
1324 |
.bdrv_read = vmdk_read,
|
|
1325 |
.bdrv_write = vmdk_write,
|
|
1326 |
.bdrv_close = vmdk_close,
|
|
1327 |
.bdrv_create = vmdk_create,
|
|
1328 |
.bdrv_flush = vmdk_flush,
|
|
1329 |
.bdrv_is_allocated = vmdk_is_allocated,
|
|
1314 | 1330 |
|
1315 | 1331 |
.create_options = vmdk_create_options, |
1316 | 1332 |
}; |
Also available in: Unified diff