Revision 6511ef77

b/block/vmdk.c
108 108

  
109 109
static uint32_t vmdk_read_cid(BlockDriverState *bs, int parent)
110 110
{
111
    BDRVVmdkState *s = bs->opaque;
112 111
    char desc[DESC_SIZE];
113 112
    uint32_t cid;
114 113
    const char *p_name, *cid_str;
115 114
    size_t cid_str_size;
116 115

  
117 116
    /* the descriptor offset = 0x200 */
118
    if (bdrv_pread(s->hd, 0x200, desc, DESC_SIZE) != DESC_SIZE)
117
    if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE)
119 118
        return 0;
120 119

  
121 120
    if (parent) {
......
136 135

  
137 136
static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid)
138 137
{
139
    BDRVVmdkState *s = bs->opaque;
140 138
    char desc[DESC_SIZE], tmp_desc[DESC_SIZE];
141 139
    char *p_name, *tmp_str;
142 140

  
143 141
    /* the descriptor offset = 0x200 */
144
    if (bdrv_pread(s->hd, 0x200, desc, DESC_SIZE) != DESC_SIZE)
142
    if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE)
145 143
        return -1;
146 144

  
147 145
    tmp_str = strstr(desc,"parentCID");
......
152 150
        pstrcat(desc, sizeof(desc), tmp_desc);
153 151
    }
154 152

  
155
    if (bdrv_pwrite(s->hd, 0x200, desc, DESC_SIZE) != DESC_SIZE)
153
    if (bdrv_pwrite(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE)
156 154
        return -1;
157 155
    return 0;
158 156
}
......
339 337

  
340 338
static int vmdk_parent_open(BlockDriverState *bs)
341 339
{
342
    BDRVVmdkState *s = bs->opaque;
343 340
    char *p_name;
344 341
    char desc[DESC_SIZE];
345 342

  
346 343
    /* the descriptor offset = 0x200 */
347
    if (bdrv_pread(s->hd, 0x200, desc, DESC_SIZE) != DESC_SIZE)
344
    if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE)
348 345
        return -1;
349 346

  
350 347
    if ((p_name = strstr(desc,"parentFileNameHint")) != NULL) {
......
362 359
    return 0;
363 360
}
364 361

  
365
static int vmdk_open(BlockDriverState *bs, const char *filename, int flags)
362
static int vmdk_open(BlockDriverState *bs, int flags)
366 363
{
367 364
    BDRVVmdkState *s = bs->opaque;
368 365
    uint32_t magic;
369
    int l1_size, i, ret;
366
    int l1_size, i;
370 367

  
371
    ret = bdrv_file_open(&s->hd, filename, flags);
372
    if (ret < 0)
373
        return ret;
374
    if (bdrv_pread(s->hd, 0, &magic, sizeof(magic)) != sizeof(magic))
368
    if (bdrv_pread(bs->file, 0, &magic, sizeof(magic)) != sizeof(magic))
375 369
        goto fail;
376 370

  
377 371
    magic = be32_to_cpu(magic);
378 372
    if (magic == VMDK3_MAGIC) {
379 373
        VMDK3Header header;
380 374

  
381
        if (bdrv_pread(s->hd, sizeof(magic), &header, sizeof(header)) != sizeof(header))
375
        if (bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header)) != sizeof(header))
382 376
            goto fail;
383 377
        s->cluster_sectors = le32_to_cpu(header.granularity);
384 378
        s->l2_size = 1 << 9;
......
390 384
    } else if (magic == VMDK4_MAGIC) {
391 385
        VMDK4Header header;
392 386

  
393
        if (bdrv_pread(s->hd, sizeof(magic), &header, sizeof(header)) != sizeof(header))
387
        if (bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header)) != sizeof(header))
394 388
            goto fail;
395 389
        bs->total_sectors = le64_to_cpu(header.capacity);
396 390
        s->cluster_sectors = le64_to_cpu(header.granularity);
......
415 409
    /* read the L1 table */
416 410
    l1_size = s->l1_size * sizeof(uint32_t);
417 411
    s->l1_table = qemu_malloc(l1_size);
418
    if (bdrv_pread(s->hd, s->l1_table_offset, s->l1_table, l1_size) != l1_size)
412
    if (bdrv_pread(bs->file, s->l1_table_offset, s->l1_table, l1_size) != l1_size)
419 413
        goto fail;
420 414
    for(i = 0; i < s->l1_size; i++) {
421 415
        le32_to_cpus(&s->l1_table[i]);
......
423 417

  
424 418
    if (s->l1_backup_table_offset) {
425 419
        s->l1_backup_table = qemu_malloc(l1_size);
426
        if (bdrv_pread(s->hd, s->l1_backup_table_offset, s->l1_backup_table, l1_size) != l1_size)
420
        if (bdrv_pread(bs->file, s->l1_backup_table_offset, s->l1_backup_table, l1_size) != l1_size)
427 421
            goto fail;
428 422
        for(i = 0; i < s->l1_size; i++) {
429 423
            le32_to_cpus(&s->l1_backup_table[i]);
......
436 430
    qemu_free(s->l1_backup_table);
437 431
    qemu_free(s->l1_table);
438 432
    qemu_free(s->l2_cache);
439
    bdrv_delete(s->hd);
440 433
    return -1;
441 434
}
442 435

  
......
464 457
        }
465 458

  
466 459
        //Write grain only into the active image
467
        ret = bdrv_write(s->hd, cluster_offset, whole_grain,
460
        ret = bdrv_write(bs->file, cluster_offset, whole_grain,
468 461
            s->cluster_sectors);
469 462
        if (ret < 0) {
470 463
            return -1;
......
478 471
    BDRVVmdkState *s = bs->opaque;
479 472

  
480 473
    /* update L2 table */
481
    if (bdrv_pwrite(s->hd, ((int64_t)m_data->l2_offset * 512) + (m_data->l2_index * sizeof(m_data->offset)),
474
    if (bdrv_pwrite(bs->file, ((int64_t)m_data->l2_offset * 512) + (m_data->l2_index * sizeof(m_data->offset)),
482 475
                    &(m_data->offset), sizeof(m_data->offset)) != sizeof(m_data->offset))
483 476
        return -1;
484 477
    /* update backup L2 table */
485 478
    if (s->l1_backup_table_offset != 0) {
486 479
        m_data->l2_offset = s->l1_backup_table[m_data->l1_index];
487
        if (bdrv_pwrite(s->hd, ((int64_t)m_data->l2_offset * 512) + (m_data->l2_index * sizeof(m_data->offset)),
480
        if (bdrv_pwrite(bs->file, ((int64_t)m_data->l2_offset * 512) + (m_data->l2_index * sizeof(m_data->offset)),
488 481
                        &(m_data->offset), sizeof(m_data->offset)) != sizeof(m_data->offset))
489 482
            return -1;
490 483
    }
......
532 525
        }
533 526
    }
534 527
    l2_table = s->l2_cache + (min_index * s->l2_size);
535
    if (bdrv_pread(s->hd, (int64_t)l2_offset * 512, l2_table, s->l2_size * sizeof(uint32_t)) !=
528
    if (bdrv_pread(bs->file, (int64_t)l2_offset * 512, l2_table, s->l2_size * sizeof(uint32_t)) !=
536 529
                                                                        s->l2_size * sizeof(uint32_t))
537 530
        return 0;
538 531

  
......
547 540
            return 0;
548 541

  
549 542
        // Avoid the L2 tables update for the images that have snapshots.
550
        cluster_offset = bdrv_getlength(s->hd);
551
        bdrv_truncate(s->hd, cluster_offset + (s->cluster_sectors << 9));
543
        cluster_offset = bdrv_getlength(bs->file);
544
        bdrv_truncate(bs->file, cluster_offset + (s->cluster_sectors << 9));
552 545

  
553 546
        cluster_offset >>= 9;
554 547
        tmp = cpu_to_le32(cluster_offset);
......
615 608
                memset(buf, 0, 512 * n);
616 609
            }
617 610
        } else {
618
            if(bdrv_pread(s->hd, cluster_offset + index_in_cluster * 512, buf, n * 512) != n * 512)
611
            if(bdrv_pread(bs->file, cluster_offset + index_in_cluster * 512, buf, n * 512) != n * 512)
619 612
                return -1;
620 613
        }
621 614
        nb_sectors -= n;
......
651 644
        if (!cluster_offset)
652 645
            return -1;
653 646

  
654
        if (bdrv_pwrite(s->hd, cluster_offset + index_in_cluster * 512, buf, n * 512) != n * 512)
647
        if (bdrv_pwrite(bs->file, cluster_offset + index_in_cluster * 512, buf, n * 512) != n * 512)
655 648
            return -1;
656 649
        if (m_data.valid) {
657 650
            /* update L2 tables */
......
828 821

  
829 822
    qemu_free(s->l1_table);
830 823
    qemu_free(s->l2_cache);
831
    bdrv_delete(s->hd);
832 824
}
833 825

  
834 826
static void vmdk_flush(BlockDriverState *bs)
835 827
{
836
    BDRVVmdkState *s = bs->opaque;
837
    bdrv_flush(s->hd);
828
    bdrv_flush(bs->file);
838 829
}
839 830

  
840 831

  
......
861 852
    .format_name	= "vmdk",
862 853
    .instance_size	= sizeof(BDRVVmdkState),
863 854
    .bdrv_probe		= vmdk_probe,
864
    .bdrv_file_open	= vmdk_open,
855
    .bdrv_open      = vmdk_open,
865 856
    .bdrv_read		= vmdk_read,
866 857
    .bdrv_write		= vmdk_write,
867 858
    .bdrv_close		= vmdk_close,

Also available in: Unified diff