cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

vmdk.c (98671B)


      1/*
      2 * Block driver for the VMDK format
      3 *
      4 * Copyright (c) 2004 Fabrice Bellard
      5 * Copyright (c) 2005 Filip Navara
      6 *
      7 * Permission is hereby granted, free of charge, to any person obtaining a copy
      8 * of this software and associated documentation files (the "Software"), to deal
      9 * in the Software without restriction, including without limitation the rights
     10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11 * copies of the Software, and to permit persons to whom the Software is
     12 * furnished to do so, subject to the following conditions:
     13 *
     14 * The above copyright notice and this permission notice shall be included in
     15 * all copies or substantial portions of the Software.
     16 *
     17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23 * THE SOFTWARE.
     24 */
     25
     26#include "qemu/osdep.h"
     27#include "qapi/error.h"
     28#include "block/block_int.h"
     29#include "sysemu/block-backend.h"
     30#include "qapi/qmp/qdict.h"
     31#include "qapi/qmp/qerror.h"
     32#include "qemu/error-report.h"
     33#include "qemu/module.h"
     34#include "qemu/option.h"
     35#include "qemu/bswap.h"
     36#include "migration/blocker.h"
     37#include "qemu/cutils.h"
     38#include <zlib.h>
     39
     40#define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D')
     41#define VMDK4_MAGIC (('K' << 24) | ('D' << 16) | ('M' << 8) | 'V')
     42#define VMDK4_COMPRESSION_DEFLATE 1
     43#define VMDK4_FLAG_NL_DETECT (1 << 0)
     44#define VMDK4_FLAG_RGD (1 << 1)
     45/* Zeroed-grain enable bit */
     46#define VMDK4_FLAG_ZERO_GRAIN   (1 << 2)
     47#define VMDK4_FLAG_COMPRESS (1 << 16)
     48#define VMDK4_FLAG_MARKER (1 << 17)
     49#define VMDK4_GD_AT_END 0xffffffffffffffffULL
     50
     51#define VMDK_EXTENT_MAX_SECTORS (1ULL << 32)
     52
     53#define VMDK_GTE_ZEROED 0x1
     54
     55/* VMDK internal error codes */
     56#define VMDK_OK      0
     57#define VMDK_ERROR   (-1)
     58/* Cluster not allocated */
     59#define VMDK_UNALLOC (-2)
     60#define VMDK_ZEROED  (-3)
     61
     62#define BLOCK_OPT_ZEROED_GRAIN "zeroed_grain"
     63
     64typedef struct {
     65    uint32_t version;
     66    uint32_t flags;
     67    uint32_t disk_sectors;
     68    uint32_t granularity;
     69    uint32_t l1dir_offset;
     70    uint32_t l1dir_size;
     71    uint32_t file_sectors;
     72    uint32_t cylinders;
     73    uint32_t heads;
     74    uint32_t sectors_per_track;
     75} QEMU_PACKED VMDK3Header;
     76
     77typedef struct {
     78    uint32_t version;
     79    uint32_t flags;
     80    uint64_t capacity;
     81    uint64_t granularity;
     82    uint64_t desc_offset;
     83    uint64_t desc_size;
     84    /* Number of GrainTableEntries per GrainTable */
     85    uint32_t num_gtes_per_gt;
     86    uint64_t rgd_offset;
     87    uint64_t gd_offset;
     88    uint64_t grain_offset;
     89    char filler[1];
     90    char check_bytes[4];
     91    uint16_t compressAlgorithm;
     92} QEMU_PACKED VMDK4Header;
     93
     94typedef struct VMDKSESparseConstHeader {
     95    uint64_t magic;
     96    uint64_t version;
     97    uint64_t capacity;
     98    uint64_t grain_size;
     99    uint64_t grain_table_size;
    100    uint64_t flags;
    101    uint64_t reserved1;
    102    uint64_t reserved2;
    103    uint64_t reserved3;
    104    uint64_t reserved4;
    105    uint64_t volatile_header_offset;
    106    uint64_t volatile_header_size;
    107    uint64_t journal_header_offset;
    108    uint64_t journal_header_size;
    109    uint64_t journal_offset;
    110    uint64_t journal_size;
    111    uint64_t grain_dir_offset;
    112    uint64_t grain_dir_size;
    113    uint64_t grain_tables_offset;
    114    uint64_t grain_tables_size;
    115    uint64_t free_bitmap_offset;
    116    uint64_t free_bitmap_size;
    117    uint64_t backmap_offset;
    118    uint64_t backmap_size;
    119    uint64_t grains_offset;
    120    uint64_t grains_size;
    121    uint8_t pad[304];
    122} QEMU_PACKED VMDKSESparseConstHeader;
    123
    124typedef struct VMDKSESparseVolatileHeader {
    125    uint64_t magic;
    126    uint64_t free_gt_number;
    127    uint64_t next_txn_seq_number;
    128    uint64_t replay_journal;
    129    uint8_t pad[480];
    130} QEMU_PACKED VMDKSESparseVolatileHeader;
    131
    132#define L2_CACHE_SIZE 16
    133
    134typedef struct VmdkExtent {
    135    BdrvChild *file;
    136    bool flat;
    137    bool compressed;
    138    bool has_marker;
    139    bool has_zero_grain;
    140    bool sesparse;
    141    uint64_t sesparse_l2_tables_offset;
    142    uint64_t sesparse_clusters_offset;
    143    int32_t entry_size;
    144    int version;
    145    int64_t sectors;
    146    int64_t end_sector;
    147    int64_t flat_start_offset;
    148    int64_t l1_table_offset;
    149    int64_t l1_backup_table_offset;
    150    void *l1_table;
    151    uint32_t *l1_backup_table;
    152    unsigned int l1_size;
    153    uint32_t l1_entry_sectors;
    154
    155    unsigned int l2_size;
    156    void *l2_cache;
    157    uint32_t l2_cache_offsets[L2_CACHE_SIZE];
    158    uint32_t l2_cache_counts[L2_CACHE_SIZE];
    159
    160    int64_t cluster_sectors;
    161    int64_t next_cluster_sector;
    162    char *type;
    163} VmdkExtent;
    164
    165typedef struct BDRVVmdkState {
    166    CoMutex lock;
    167    uint64_t desc_offset;
    168    bool cid_updated;
    169    bool cid_checked;
    170    uint32_t cid;
    171    uint32_t parent_cid;
    172    int num_extents;
    173    /* Extent array with num_extents entries, ascend ordered by address */
    174    VmdkExtent *extents;
    175    Error *migration_blocker;
    176    char *create_type;
    177} BDRVVmdkState;
    178
    179typedef struct VmdkMetaData {
    180    unsigned int l1_index;
    181    unsigned int l2_index;
    182    unsigned int l2_offset;
    183    bool new_allocation;
    184    uint32_t *l2_cache_entry;
    185} VmdkMetaData;
    186
    187typedef struct VmdkGrainMarker {
    188    uint64_t lba;
    189    uint32_t size;
    190    uint8_t  data[];
    191} QEMU_PACKED VmdkGrainMarker;
    192
    193enum {
    194    MARKER_END_OF_STREAM    = 0,
    195    MARKER_GRAIN_TABLE      = 1,
    196    MARKER_GRAIN_DIRECTORY  = 2,
    197    MARKER_FOOTER           = 3,
    198};
    199
    200static int vmdk_probe(const uint8_t *buf, int buf_size, const char *filename)
    201{
    202    uint32_t magic;
    203
    204    if (buf_size < 4) {
    205        return 0;
    206    }
    207    magic = be32_to_cpu(*(uint32_t *)buf);
    208    if (magic == VMDK3_MAGIC ||
    209        magic == VMDK4_MAGIC) {
    210        return 100;
    211    } else {
    212        const char *p = (const char *)buf;
    213        const char *end = p + buf_size;
    214        while (p < end) {
    215            if (*p == '#') {
    216                /* skip comment line */
    217                while (p < end && *p != '\n') {
    218                    p++;
    219                }
    220                p++;
    221                continue;
    222            }
    223            if (*p == ' ') {
    224                while (p < end && *p == ' ') {
    225                    p++;
    226                }
    227                /* skip '\r' if windows line endings used. */
    228                if (p < end && *p == '\r') {
    229                    p++;
    230                }
    231                /* only accept blank lines before 'version=' line */
    232                if (p == end || *p != '\n') {
    233                    return 0;
    234                }
    235                p++;
    236                continue;
    237            }
    238            if (end - p >= strlen("version=X\n")) {
    239                if (strncmp("version=1\n", p, strlen("version=1\n")) == 0 ||
    240                    strncmp("version=2\n", p, strlen("version=2\n")) == 0 ||
    241                    strncmp("version=3\n", p, strlen("version=3\n")) == 0) {
    242                    return 100;
    243                }
    244            }
    245            if (end - p >= strlen("version=X\r\n")) {
    246                if (strncmp("version=1\r\n", p, strlen("version=1\r\n")) == 0 ||
    247                    strncmp("version=2\r\n", p, strlen("version=2\r\n")) == 0 ||
    248                    strncmp("version=3\r\n", p, strlen("version=3\r\n")) == 0) {
    249                    return 100;
    250                }
    251            }
    252            return 0;
    253        }
    254        return 0;
    255    }
    256}
    257
    258#define SECTOR_SIZE 512
    259#define DESC_SIZE (20 * SECTOR_SIZE)    /* 20 sectors of 512 bytes each */
    260#define BUF_SIZE 4096
    261#define HEADER_SIZE 512                 /* first sector of 512 bytes */
    262
    263static void vmdk_free_extents(BlockDriverState *bs)
    264{
    265    int i;
    266    BDRVVmdkState *s = bs->opaque;
    267    VmdkExtent *e;
    268
    269    for (i = 0; i < s->num_extents; i++) {
    270        e = &s->extents[i];
    271        g_free(e->l1_table);
    272        g_free(e->l2_cache);
    273        g_free(e->l1_backup_table);
    274        g_free(e->type);
    275        if (e->file != bs->file) {
    276            bdrv_unref_child(bs, e->file);
    277        }
    278    }
    279    g_free(s->extents);
    280}
    281
    282static void vmdk_free_last_extent(BlockDriverState *bs)
    283{
    284    BDRVVmdkState *s = bs->opaque;
    285
    286    if (s->num_extents == 0) {
    287        return;
    288    }
    289    s->num_extents--;
    290    s->extents = g_renew(VmdkExtent, s->extents, s->num_extents);
    291}
    292
    293/* Return -ve errno, or 0 on success and write CID into *pcid. */
    294static int vmdk_read_cid(BlockDriverState *bs, int parent, uint32_t *pcid)
    295{
    296    char *desc;
    297    uint32_t cid;
    298    const char *p_name, *cid_str;
    299    size_t cid_str_size;
    300    BDRVVmdkState *s = bs->opaque;
    301    int ret;
    302
    303    desc = g_malloc0(DESC_SIZE);
    304    ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
    305    if (ret < 0) {
    306        goto out;
    307    }
    308
    309    if (parent) {
    310        cid_str = "parentCID";
    311        cid_str_size = sizeof("parentCID");
    312    } else {
    313        cid_str = "CID";
    314        cid_str_size = sizeof("CID");
    315    }
    316
    317    desc[DESC_SIZE - 1] = '\0';
    318    p_name = strstr(desc, cid_str);
    319    if (p_name == NULL) {
    320        ret = -EINVAL;
    321        goto out;
    322    }
    323    p_name += cid_str_size;
    324    if (sscanf(p_name, "%" SCNx32, &cid) != 1) {
    325        ret = -EINVAL;
    326        goto out;
    327    }
    328    *pcid = cid;
    329    ret = 0;
    330
    331out:
    332    g_free(desc);
    333    return ret;
    334}
    335
    336static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid)
    337{
    338    char *desc, *tmp_desc;
    339    char *p_name, *tmp_str;
    340    BDRVVmdkState *s = bs->opaque;
    341    int ret = 0;
    342
    343    desc = g_malloc0(DESC_SIZE);
    344    tmp_desc = g_malloc0(DESC_SIZE);
    345    ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
    346    if (ret < 0) {
    347        goto out;
    348    }
    349
    350    desc[DESC_SIZE - 1] = '\0';
    351    tmp_str = strstr(desc, "parentCID");
    352    if (tmp_str == NULL) {
    353        ret = -EINVAL;
    354        goto out;
    355    }
    356
    357    pstrcpy(tmp_desc, DESC_SIZE, tmp_str);
    358    p_name = strstr(desc, "CID");
    359    if (p_name != NULL) {
    360        p_name += sizeof("CID");
    361        snprintf(p_name, DESC_SIZE - (p_name - desc), "%" PRIx32 "\n", cid);
    362        pstrcat(desc, DESC_SIZE, tmp_desc);
    363    }
    364
    365    ret = bdrv_pwrite_sync(bs->file, s->desc_offset, desc, DESC_SIZE);
    366
    367out:
    368    g_free(desc);
    369    g_free(tmp_desc);
    370    return ret;
    371}
    372
    373static int vmdk_is_cid_valid(BlockDriverState *bs)
    374{
    375    BDRVVmdkState *s = bs->opaque;
    376    uint32_t cur_pcid;
    377
    378    if (!s->cid_checked && bs->backing) {
    379        BlockDriverState *p_bs = bs->backing->bs;
    380
    381        if (strcmp(p_bs->drv->format_name, "vmdk")) {
    382            /* Backing file is not in vmdk format, so it does not have
    383             * a CID, which makes the overlay's parent CID invalid */
    384            return 0;
    385        }
    386
    387        if (vmdk_read_cid(p_bs, 0, &cur_pcid) != 0) {
    388            /* read failure: report as not valid */
    389            return 0;
    390        }
    391        if (s->parent_cid != cur_pcid) {
    392            /* CID not valid */
    393            return 0;
    394        }
    395    }
    396    s->cid_checked = true;
    397    /* CID valid */
    398    return 1;
    399}
    400
    401/* We have nothing to do for VMDK reopen, stubs just return success */
    402static int vmdk_reopen_prepare(BDRVReopenState *state,
    403                               BlockReopenQueue *queue, Error **errp)
    404{
    405    assert(state != NULL);
    406    assert(state->bs != NULL);
    407    return 0;
    408}
    409
    410static int vmdk_parent_open(BlockDriverState *bs)
    411{
    412    char *p_name;
    413    char *desc;
    414    BDRVVmdkState *s = bs->opaque;
    415    int ret;
    416
    417    desc = g_malloc0(DESC_SIZE + 1);
    418    ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
    419    if (ret < 0) {
    420        goto out;
    421    }
    422    ret = 0;
    423
    424    p_name = strstr(desc, "parentFileNameHint");
    425    if (p_name != NULL) {
    426        char *end_name;
    427
    428        p_name += sizeof("parentFileNameHint") + 1;
    429        end_name = strchr(p_name, '\"');
    430        if (end_name == NULL) {
    431            ret = -EINVAL;
    432            goto out;
    433        }
    434        if ((end_name - p_name) > sizeof(bs->auto_backing_file) - 1) {
    435            ret = -EINVAL;
    436            goto out;
    437        }
    438
    439        pstrcpy(bs->auto_backing_file, end_name - p_name + 1, p_name);
    440        pstrcpy(bs->backing_file, sizeof(bs->backing_file),
    441                bs->auto_backing_file);
    442        pstrcpy(bs->backing_format, sizeof(bs->backing_format),
    443                "vmdk");
    444    }
    445
    446out:
    447    g_free(desc);
    448    return ret;
    449}
    450
    451/* Create and append extent to the extent array. Return the added VmdkExtent
    452 * address. return NULL if allocation failed. */
    453static int vmdk_add_extent(BlockDriverState *bs,
    454                           BdrvChild *file, bool flat, int64_t sectors,
    455                           int64_t l1_offset, int64_t l1_backup_offset,
    456                           uint32_t l1_size,
    457                           int l2_size, uint64_t cluster_sectors,
    458                           VmdkExtent **new_extent,
    459                           Error **errp)
    460{
    461    VmdkExtent *extent;
    462    BDRVVmdkState *s = bs->opaque;
    463    int64_t nb_sectors;
    464
    465    if (cluster_sectors > 0x200000) {
    466        /* 0x200000 * 512Bytes = 1GB for one cluster is unrealistic */
    467        error_setg(errp, "Invalid granularity, image may be corrupt");
    468        return -EFBIG;
    469    }
    470    if (l1_size > 32 * 1024 * 1024) {
    471        /*
    472         * Although with big capacity and small l1_entry_sectors, we can get a
    473         * big l1_size, we don't want unbounded value to allocate the table.
    474         * Limit it to 32M, which is enough to store:
    475         *     8TB  - for both VMDK3 & VMDK4 with
    476         *            minimal cluster size: 512B
    477         *            minimal L2 table size: 512 entries
    478         *            8 TB is still more than the maximal value supported for
    479         *            VMDK3 & VMDK4 which is 2TB.
    480         *     64TB - for "ESXi seSparse Extent"
    481         *            minimal cluster size: 512B (default is 4KB)
    482         *            L2 table size: 4096 entries (const).
    483         *            64TB is more than the maximal value supported for
    484         *            seSparse VMDKs (which is slightly less than 64TB)
    485         */
    486        error_setg(errp, "L1 size too big");
    487        return -EFBIG;
    488    }
    489
    490    nb_sectors = bdrv_nb_sectors(file->bs);
    491    if (nb_sectors < 0) {
    492        return nb_sectors;
    493    }
    494
    495    s->extents = g_renew(VmdkExtent, s->extents, s->num_extents + 1);
    496    extent = &s->extents[s->num_extents];
    497    s->num_extents++;
    498
    499    memset(extent, 0, sizeof(VmdkExtent));
    500    extent->file = file;
    501    extent->flat = flat;
    502    extent->sectors = sectors;
    503    extent->l1_table_offset = l1_offset;
    504    extent->l1_backup_table_offset = l1_backup_offset;
    505    extent->l1_size = l1_size;
    506    extent->l1_entry_sectors = l2_size * cluster_sectors;
    507    extent->l2_size = l2_size;
    508    extent->cluster_sectors = flat ? sectors : cluster_sectors;
    509    extent->next_cluster_sector = ROUND_UP(nb_sectors, cluster_sectors);
    510    extent->entry_size = sizeof(uint32_t);
    511
    512    if (s->num_extents > 1) {
    513        extent->end_sector = (*(extent - 1)).end_sector + extent->sectors;
    514    } else {
    515        extent->end_sector = extent->sectors;
    516    }
    517    bs->total_sectors = extent->end_sector;
    518    if (new_extent) {
    519        *new_extent = extent;
    520    }
    521    return 0;
    522}
    523
    524static int vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent,
    525                            Error **errp)
    526{
    527    int ret;
    528    size_t l1_size;
    529    int i;
    530
    531    /* read the L1 table */
    532    l1_size = extent->l1_size * extent->entry_size;
    533    extent->l1_table = g_try_malloc(l1_size);
    534    if (l1_size && extent->l1_table == NULL) {
    535        return -ENOMEM;
    536    }
    537
    538    ret = bdrv_pread(extent->file,
    539                     extent->l1_table_offset,
    540                     extent->l1_table,
    541                     l1_size);
    542    if (ret < 0) {
    543        bdrv_refresh_filename(extent->file->bs);
    544        error_setg_errno(errp, -ret,
    545                         "Could not read l1 table from extent '%s'",
    546                         extent->file->bs->filename);
    547        goto fail_l1;
    548    }
    549    for (i = 0; i < extent->l1_size; i++) {
    550        if (extent->entry_size == sizeof(uint64_t)) {
    551            le64_to_cpus((uint64_t *)extent->l1_table + i);
    552        } else {
    553            assert(extent->entry_size == sizeof(uint32_t));
    554            le32_to_cpus((uint32_t *)extent->l1_table + i);
    555        }
    556    }
    557
    558    if (extent->l1_backup_table_offset) {
    559        assert(!extent->sesparse);
    560        extent->l1_backup_table = g_try_malloc(l1_size);
    561        if (l1_size && extent->l1_backup_table == NULL) {
    562            ret = -ENOMEM;
    563            goto fail_l1;
    564        }
    565        ret = bdrv_pread(extent->file,
    566                         extent->l1_backup_table_offset,
    567                         extent->l1_backup_table,
    568                         l1_size);
    569        if (ret < 0) {
    570            bdrv_refresh_filename(extent->file->bs);
    571            error_setg_errno(errp, -ret,
    572                             "Could not read l1 backup table from extent '%s'",
    573                             extent->file->bs->filename);
    574            goto fail_l1b;
    575        }
    576        for (i = 0; i < extent->l1_size; i++) {
    577            le32_to_cpus(&extent->l1_backup_table[i]);
    578        }
    579    }
    580
    581    extent->l2_cache =
    582        g_malloc(extent->entry_size * extent->l2_size * L2_CACHE_SIZE);
    583    return 0;
    584 fail_l1b:
    585    g_free(extent->l1_backup_table);
    586 fail_l1:
    587    g_free(extent->l1_table);
    588    return ret;
    589}
    590
    591static int vmdk_open_vmfs_sparse(BlockDriverState *bs,
    592                                 BdrvChild *file,
    593                                 int flags, Error **errp)
    594{
    595    int ret;
    596    uint32_t magic;
    597    VMDK3Header header;
    598    VmdkExtent *extent = NULL;
    599
    600    ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header));
    601    if (ret < 0) {
    602        bdrv_refresh_filename(file->bs);
    603        error_setg_errno(errp, -ret,
    604                         "Could not read header from file '%s'",
    605                         file->bs->filename);
    606        return ret;
    607    }
    608    ret = vmdk_add_extent(bs, file, false,
    609                          le32_to_cpu(header.disk_sectors),
    610                          (int64_t)le32_to_cpu(header.l1dir_offset) << 9,
    611                          0,
    612                          le32_to_cpu(header.l1dir_size),
    613                          4096,
    614                          le32_to_cpu(header.granularity),
    615                          &extent,
    616                          errp);
    617    if (ret < 0) {
    618        return ret;
    619    }
    620    ret = vmdk_init_tables(bs, extent, errp);
    621    if (ret) {
    622        /* free extent allocated by vmdk_add_extent */
    623        vmdk_free_last_extent(bs);
    624    }
    625    return ret;
    626}
    627
    628#define SESPARSE_CONST_HEADER_MAGIC UINT64_C(0x00000000cafebabe)
    629#define SESPARSE_VOLATILE_HEADER_MAGIC UINT64_C(0x00000000cafecafe)
    630
    631/* Strict checks - format not officially documented */
    632static int check_se_sparse_const_header(VMDKSESparseConstHeader *header,
    633                                        Error **errp)
    634{
    635    header->magic = le64_to_cpu(header->magic);
    636    header->version = le64_to_cpu(header->version);
    637    header->grain_size = le64_to_cpu(header->grain_size);
    638    header->grain_table_size = le64_to_cpu(header->grain_table_size);
    639    header->flags = le64_to_cpu(header->flags);
    640    header->reserved1 = le64_to_cpu(header->reserved1);
    641    header->reserved2 = le64_to_cpu(header->reserved2);
    642    header->reserved3 = le64_to_cpu(header->reserved3);
    643    header->reserved4 = le64_to_cpu(header->reserved4);
    644
    645    header->volatile_header_offset =
    646        le64_to_cpu(header->volatile_header_offset);
    647    header->volatile_header_size = le64_to_cpu(header->volatile_header_size);
    648
    649    header->journal_header_offset = le64_to_cpu(header->journal_header_offset);
    650    header->journal_header_size = le64_to_cpu(header->journal_header_size);
    651
    652    header->journal_offset = le64_to_cpu(header->journal_offset);
    653    header->journal_size = le64_to_cpu(header->journal_size);
    654
    655    header->grain_dir_offset = le64_to_cpu(header->grain_dir_offset);
    656    header->grain_dir_size = le64_to_cpu(header->grain_dir_size);
    657
    658    header->grain_tables_offset = le64_to_cpu(header->grain_tables_offset);
    659    header->grain_tables_size = le64_to_cpu(header->grain_tables_size);
    660
    661    header->free_bitmap_offset = le64_to_cpu(header->free_bitmap_offset);
    662    header->free_bitmap_size = le64_to_cpu(header->free_bitmap_size);
    663
    664    header->backmap_offset = le64_to_cpu(header->backmap_offset);
    665    header->backmap_size = le64_to_cpu(header->backmap_size);
    666
    667    header->grains_offset = le64_to_cpu(header->grains_offset);
    668    header->grains_size = le64_to_cpu(header->grains_size);
    669
    670    if (header->magic != SESPARSE_CONST_HEADER_MAGIC) {
    671        error_setg(errp, "Bad const header magic: 0x%016" PRIx64,
    672                   header->magic);
    673        return -EINVAL;
    674    }
    675
    676    if (header->version != 0x0000000200000001) {
    677        error_setg(errp, "Unsupported version: 0x%016" PRIx64,
    678                   header->version);
    679        return -ENOTSUP;
    680    }
    681
    682    if (header->grain_size != 8) {
    683        error_setg(errp, "Unsupported grain size: %" PRIu64,
    684                   header->grain_size);
    685        return -ENOTSUP;
    686    }
    687
    688    if (header->grain_table_size != 64) {
    689        error_setg(errp, "Unsupported grain table size: %" PRIu64,
    690                   header->grain_table_size);
    691        return -ENOTSUP;
    692    }
    693
    694    if (header->flags != 0) {
    695        error_setg(errp, "Unsupported flags: 0x%016" PRIx64,
    696                   header->flags);
    697        return -ENOTSUP;
    698    }
    699
    700    if (header->reserved1 != 0 || header->reserved2 != 0 ||
    701        header->reserved3 != 0 || header->reserved4 != 0) {
    702        error_setg(errp, "Unsupported reserved bits:"
    703                   " 0x%016" PRIx64 " 0x%016" PRIx64
    704                   " 0x%016" PRIx64 " 0x%016" PRIx64,
    705                   header->reserved1, header->reserved2,
    706                   header->reserved3, header->reserved4);
    707        return -ENOTSUP;
    708    }
    709
    710    /* check that padding is 0 */
    711    if (!buffer_is_zero(header->pad, sizeof(header->pad))) {
    712        error_setg(errp, "Unsupported non-zero const header padding");
    713        return -ENOTSUP;
    714    }
    715
    716    return 0;
    717}
    718
    719static int check_se_sparse_volatile_header(VMDKSESparseVolatileHeader *header,
    720                                           Error **errp)
    721{
    722    header->magic = le64_to_cpu(header->magic);
    723    header->free_gt_number = le64_to_cpu(header->free_gt_number);
    724    header->next_txn_seq_number = le64_to_cpu(header->next_txn_seq_number);
    725    header->replay_journal = le64_to_cpu(header->replay_journal);
    726
    727    if (header->magic != SESPARSE_VOLATILE_HEADER_MAGIC) {
    728        error_setg(errp, "Bad volatile header magic: 0x%016" PRIx64,
    729                   header->magic);
    730        return -EINVAL;
    731    }
    732
    733    if (header->replay_journal) {
    734        error_setg(errp, "Image is dirty, Replaying journal not supported");
    735        return -ENOTSUP;
    736    }
    737
    738    /* check that padding is 0 */
    739    if (!buffer_is_zero(header->pad, sizeof(header->pad))) {
    740        error_setg(errp, "Unsupported non-zero volatile header padding");
    741        return -ENOTSUP;
    742    }
    743
    744    return 0;
    745}
    746
    747static int vmdk_open_se_sparse(BlockDriverState *bs,
    748                               BdrvChild *file,
    749                               int flags, Error **errp)
    750{
    751    int ret;
    752    VMDKSESparseConstHeader const_header;
    753    VMDKSESparseVolatileHeader volatile_header;
    754    VmdkExtent *extent = NULL;
    755
    756    ret = bdrv_apply_auto_read_only(bs,
    757            "No write support for seSparse images available", errp);
    758    if (ret < 0) {
    759        return ret;
    760    }
    761
    762    assert(sizeof(const_header) == SECTOR_SIZE);
    763
    764    ret = bdrv_pread(file, 0, &const_header, sizeof(const_header));
    765    if (ret < 0) {
    766        bdrv_refresh_filename(file->bs);
    767        error_setg_errno(errp, -ret,
    768                         "Could not read const header from file '%s'",
    769                         file->bs->filename);
    770        return ret;
    771    }
    772
    773    /* check const header */
    774    ret = check_se_sparse_const_header(&const_header, errp);
    775    if (ret < 0) {
    776        return ret;
    777    }
    778
    779    assert(sizeof(volatile_header) == SECTOR_SIZE);
    780
    781    ret = bdrv_pread(file,
    782                     const_header.volatile_header_offset * SECTOR_SIZE,
    783                     &volatile_header, sizeof(volatile_header));
    784    if (ret < 0) {
    785        bdrv_refresh_filename(file->bs);
    786        error_setg_errno(errp, -ret,
    787                         "Could not read volatile header from file '%s'",
    788                         file->bs->filename);
    789        return ret;
    790    }
    791
    792    /* check volatile header */
    793    ret = check_se_sparse_volatile_header(&volatile_header, errp);
    794    if (ret < 0) {
    795        return ret;
    796    }
    797
    798    ret = vmdk_add_extent(bs, file, false,
    799                          const_header.capacity,
    800                          const_header.grain_dir_offset * SECTOR_SIZE,
    801                          0,
    802                          const_header.grain_dir_size *
    803                          SECTOR_SIZE / sizeof(uint64_t),
    804                          const_header.grain_table_size *
    805                          SECTOR_SIZE / sizeof(uint64_t),
    806                          const_header.grain_size,
    807                          &extent,
    808                          errp);
    809    if (ret < 0) {
    810        return ret;
    811    }
    812
    813    extent->sesparse = true;
    814    extent->sesparse_l2_tables_offset = const_header.grain_tables_offset;
    815    extent->sesparse_clusters_offset = const_header.grains_offset;
    816    extent->entry_size = sizeof(uint64_t);
    817
    818    ret = vmdk_init_tables(bs, extent, errp);
    819    if (ret) {
    820        /* free extent allocated by vmdk_add_extent */
    821        vmdk_free_last_extent(bs);
    822    }
    823
    824    return ret;
    825}
    826
    827static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
    828                               QDict *options, Error **errp);
    829
    830static char *vmdk_read_desc(BdrvChild *file, uint64_t desc_offset, Error **errp)
    831{
    832    int64_t size;
    833    char *buf;
    834    int ret;
    835
    836    size = bdrv_getlength(file->bs);
    837    if (size < 0) {
    838        error_setg_errno(errp, -size, "Could not access file");
    839        return NULL;
    840    }
    841
    842    if (size < 4) {
    843        /* Both descriptor file and sparse image must be much larger than 4
    844         * bytes, also callers of vmdk_read_desc want to compare the first 4
    845         * bytes with VMDK4_MAGIC, let's error out if less is read. */
    846        error_setg(errp, "File is too small, not a valid image");
    847        return NULL;
    848    }
    849
    850    size = MIN(size, (1 << 20) - 1);  /* avoid unbounded allocation */
    851    buf = g_malloc(size + 1);
    852
    853    ret = bdrv_pread(file, desc_offset, buf, size);
    854    if (ret < 0) {
    855        error_setg_errno(errp, -ret, "Could not read from file");
    856        g_free(buf);
    857        return NULL;
    858    }
    859    buf[ret] = 0;
    860
    861    return buf;
    862}
    863
    864static int vmdk_open_vmdk4(BlockDriverState *bs,
    865                           BdrvChild *file,
    866                           int flags, QDict *options, Error **errp)
    867{
    868    int ret;
    869    uint32_t magic;
    870    uint32_t l1_size, l1_entry_sectors;
    871    VMDK4Header header;
    872    VmdkExtent *extent = NULL;
    873    BDRVVmdkState *s = bs->opaque;
    874    int64_t l1_backup_offset = 0;
    875    bool compressed;
    876
    877    ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header));
    878    if (ret < 0) {
    879        bdrv_refresh_filename(file->bs);
    880        error_setg_errno(errp, -ret,
    881                         "Could not read header from file '%s'",
    882                         file->bs->filename);
    883        return -EINVAL;
    884    }
    885    if (header.capacity == 0) {
    886        uint64_t desc_offset = le64_to_cpu(header.desc_offset);
    887        if (desc_offset) {
    888            char *buf = vmdk_read_desc(file, desc_offset << 9, errp);
    889            if (!buf) {
    890                return -EINVAL;
    891            }
    892            ret = vmdk_open_desc_file(bs, flags, buf, options, errp);
    893            g_free(buf);
    894            return ret;
    895        }
    896    }
    897
    898    if (!s->create_type) {
    899        s->create_type = g_strdup("monolithicSparse");
    900    }
    901
    902    if (le64_to_cpu(header.gd_offset) == VMDK4_GD_AT_END) {
    903        /*
    904         * The footer takes precedence over the header, so read it in. The
    905         * footer starts at offset -1024 from the end: One sector for the
    906         * footer, and another one for the end-of-stream marker.
    907         */
    908        struct {
    909            struct {
    910                uint64_t val;
    911                uint32_t size;
    912                uint32_t type;
    913                uint8_t pad[512 - 16];
    914            } QEMU_PACKED footer_marker;
    915
    916            uint32_t magic;
    917            VMDK4Header header;
    918            uint8_t pad[512 - 4 - sizeof(VMDK4Header)];
    919
    920            struct {
    921                uint64_t val;
    922                uint32_t size;
    923                uint32_t type;
    924                uint8_t pad[512 - 16];
    925            } QEMU_PACKED eos_marker;
    926        } QEMU_PACKED footer;
    927
    928        ret = bdrv_pread(file,
    929            bs->file->bs->total_sectors * 512 - 1536,
    930            &footer, sizeof(footer));
    931        if (ret < 0) {
    932            error_setg_errno(errp, -ret, "Failed to read footer");
    933            return ret;
    934        }
    935
    936        /* Some sanity checks for the footer */
    937        if (be32_to_cpu(footer.magic) != VMDK4_MAGIC ||
    938            le32_to_cpu(footer.footer_marker.size) != 0  ||
    939            le32_to_cpu(footer.footer_marker.type) != MARKER_FOOTER ||
    940            le64_to_cpu(footer.eos_marker.val) != 0  ||
    941            le32_to_cpu(footer.eos_marker.size) != 0  ||
    942            le32_to_cpu(footer.eos_marker.type) != MARKER_END_OF_STREAM)
    943        {
    944            error_setg(errp, "Invalid footer");
    945            return -EINVAL;
    946        }
    947
    948        header = footer.header;
    949    }
    950
    951    compressed =
    952        le16_to_cpu(header.compressAlgorithm) == VMDK4_COMPRESSION_DEFLATE;
    953    if (le32_to_cpu(header.version) > 3) {
    954        error_setg(errp, "Unsupported VMDK version %" PRIu32,
    955                   le32_to_cpu(header.version));
    956        return -ENOTSUP;
    957    } else if (le32_to_cpu(header.version) == 3 && (flags & BDRV_O_RDWR) &&
    958               !compressed) {
    959        /* VMware KB 2064959 explains that version 3 added support for
    960         * persistent changed block tracking (CBT), and backup software can
    961         * read it as version=1 if it doesn't care about the changed area
    962         * information. So we are safe to enable read only. */
    963        error_setg(errp, "VMDK version 3 must be read only");
    964        return -EINVAL;
    965    }
    966
    967    if (le32_to_cpu(header.num_gtes_per_gt) > 512) {
    968        error_setg(errp, "L2 table size too big");
    969        return -EINVAL;
    970    }
    971
    972    l1_entry_sectors = le32_to_cpu(header.num_gtes_per_gt)
    973                        * le64_to_cpu(header.granularity);
    974    if (l1_entry_sectors == 0) {
    975        error_setg(errp, "L1 entry size is invalid");
    976        return -EINVAL;
    977    }
    978    l1_size = (le64_to_cpu(header.capacity) + l1_entry_sectors - 1)
    979                / l1_entry_sectors;
    980    if (le32_to_cpu(header.flags) & VMDK4_FLAG_RGD) {
    981        l1_backup_offset = le64_to_cpu(header.rgd_offset) << 9;
    982    }
    983    if (bdrv_nb_sectors(file->bs) < le64_to_cpu(header.grain_offset)) {
    984        error_setg(errp, "File truncated, expecting at least %" PRId64 " bytes",
    985                   (int64_t)(le64_to_cpu(header.grain_offset)
    986                             * BDRV_SECTOR_SIZE));
    987        return -EINVAL;
    988    }
    989
    990    ret = vmdk_add_extent(bs, file, false,
    991                          le64_to_cpu(header.capacity),
    992                          le64_to_cpu(header.gd_offset) << 9,
    993                          l1_backup_offset,
    994                          l1_size,
    995                          le32_to_cpu(header.num_gtes_per_gt),
    996                          le64_to_cpu(header.granularity),
    997                          &extent,
    998                          errp);
    999    if (ret < 0) {
   1000        return ret;
   1001    }
   1002    extent->compressed =
   1003        le16_to_cpu(header.compressAlgorithm) == VMDK4_COMPRESSION_DEFLATE;
   1004    if (extent->compressed) {
   1005        g_free(s->create_type);
   1006        s->create_type = g_strdup("streamOptimized");
   1007    }
   1008    extent->has_marker = le32_to_cpu(header.flags) & VMDK4_FLAG_MARKER;
   1009    extent->version = le32_to_cpu(header.version);
   1010    extent->has_zero_grain = le32_to_cpu(header.flags) & VMDK4_FLAG_ZERO_GRAIN;
   1011    ret = vmdk_init_tables(bs, extent, errp);
   1012    if (ret) {
   1013        /* free extent allocated by vmdk_add_extent */
   1014        vmdk_free_last_extent(bs);
   1015    }
   1016    return ret;
   1017}
   1018
   1019/* find an option value out of descriptor file */
   1020static int vmdk_parse_description(const char *desc, const char *opt_name,
   1021        char *buf, int buf_size)
   1022{
   1023    char *opt_pos, *opt_end;
   1024    const char *end = desc + strlen(desc);
   1025
   1026    opt_pos = strstr(desc, opt_name);
   1027    if (!opt_pos) {
   1028        return VMDK_ERROR;
   1029    }
   1030    /* Skip "=\"" following opt_name */
   1031    opt_pos += strlen(opt_name) + 2;
   1032    if (opt_pos >= end) {
   1033        return VMDK_ERROR;
   1034    }
   1035    opt_end = opt_pos;
   1036    while (opt_end < end && *opt_end != '"') {
   1037        opt_end++;
   1038    }
   1039    if (opt_end == end || buf_size < opt_end - opt_pos + 1) {
   1040        return VMDK_ERROR;
   1041    }
   1042    pstrcpy(buf, opt_end - opt_pos + 1, opt_pos);
   1043    return VMDK_OK;
   1044}
   1045
   1046/* Open an extent file and append to bs array */
   1047static int vmdk_open_sparse(BlockDriverState *bs, BdrvChild *file, int flags,
   1048                            char *buf, QDict *options, Error **errp)
   1049{
   1050    uint32_t magic;
   1051
   1052    magic = ldl_be_p(buf);
   1053    switch (magic) {
   1054        case VMDK3_MAGIC:
   1055            return vmdk_open_vmfs_sparse(bs, file, flags, errp);
   1056        case VMDK4_MAGIC:
   1057            return vmdk_open_vmdk4(bs, file, flags, options, errp);
   1058        default:
   1059            error_setg(errp, "Image not in VMDK format");
   1060            return -EINVAL;
   1061    }
   1062}
   1063
   1064static const char *next_line(const char *s)
   1065{
   1066    while (*s) {
   1067        if (*s == '\n') {
   1068            return s + 1;
   1069        }
   1070        s++;
   1071    }
   1072    return s;
   1073}
   1074
   1075static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
   1076                              QDict *options, Error **errp)
   1077{
   1078    int ret;
   1079    int matches;
   1080    char access[11];
   1081    char type[11];
   1082    char fname[512];
   1083    const char *p, *np;
   1084    int64_t sectors = 0;
   1085    int64_t flat_offset;
   1086    char *desc_file_dir = NULL;
   1087    char *extent_path;
   1088    BdrvChild *extent_file;
   1089    BdrvChildRole extent_role;
   1090    BDRVVmdkState *s = bs->opaque;
   1091    VmdkExtent *extent = NULL;
   1092    char extent_opt_prefix[32];
   1093    Error *local_err = NULL;
   1094
   1095    for (p = desc; *p; p = next_line(p)) {
   1096        /* parse extent line in one of below formats:
   1097         *
   1098         * RW [size in sectors] FLAT "file-name.vmdk" OFFSET
   1099         * RW [size in sectors] SPARSE "file-name.vmdk"
   1100         * RW [size in sectors] VMFS "file-name.vmdk"
   1101         * RW [size in sectors] VMFSSPARSE "file-name.vmdk"
   1102         * RW [size in sectors] SESPARSE "file-name.vmdk"
   1103         */
   1104        flat_offset = -1;
   1105        matches = sscanf(p, "%10s %" SCNd64 " %10s \"%511[^\n\r\"]\" %" SCNd64,
   1106                         access, &sectors, type, fname, &flat_offset);
   1107        if (matches < 4 || strcmp(access, "RW")) {
   1108            continue;
   1109        } else if (!strcmp(type, "FLAT")) {
   1110            if (matches != 5 || flat_offset < 0) {
   1111                goto invalid;
   1112            }
   1113        } else if (!strcmp(type, "VMFS")) {
   1114            if (matches == 4) {
   1115                flat_offset = 0;
   1116            } else {
   1117                goto invalid;
   1118            }
   1119        } else if (matches != 4) {
   1120            goto invalid;
   1121        }
   1122
   1123        if (sectors <= 0 ||
   1124            (strcmp(type, "FLAT") && strcmp(type, "SPARSE") &&
   1125             strcmp(type, "VMFS") && strcmp(type, "VMFSSPARSE") &&
   1126             strcmp(type, "SESPARSE")) ||
   1127            (strcmp(access, "RW"))) {
   1128            continue;
   1129        }
   1130
   1131        if (path_is_absolute(fname)) {
   1132            extent_path = g_strdup(fname);
   1133        } else {
   1134            if (!desc_file_dir) {
   1135                desc_file_dir = bdrv_dirname(bs->file->bs, errp);
   1136                if (!desc_file_dir) {
   1137                    bdrv_refresh_filename(bs->file->bs);
   1138                    error_prepend(errp, "Cannot use relative paths with VMDK "
   1139                                  "descriptor file '%s': ",
   1140                                  bs->file->bs->filename);
   1141                    ret = -EINVAL;
   1142                    goto out;
   1143                }
   1144            }
   1145
   1146            extent_path = g_strconcat(desc_file_dir, fname, NULL);
   1147        }
   1148
   1149        ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
   1150        assert(ret < 32);
   1151
   1152        extent_role = BDRV_CHILD_DATA;
   1153        if (strcmp(type, "FLAT") != 0 && strcmp(type, "VMFS") != 0) {
   1154            /* non-flat extents have metadata */
   1155            extent_role |= BDRV_CHILD_METADATA;
   1156        }
   1157
   1158        extent_file = bdrv_open_child(extent_path, options, extent_opt_prefix,
   1159                                      bs, &child_of_bds, extent_role, false,
   1160                                      &local_err);
   1161        g_free(extent_path);
   1162        if (local_err) {
   1163            error_propagate(errp, local_err);
   1164            ret = -EINVAL;
   1165            goto out;
   1166        }
   1167
   1168        /* save to extents array */
   1169        if (!strcmp(type, "FLAT") || !strcmp(type, "VMFS")) {
   1170            /* FLAT extent */
   1171
   1172            ret = vmdk_add_extent(bs, extent_file, true, sectors,
   1173                            0, 0, 0, 0, 0, &extent, errp);
   1174            if (ret < 0) {
   1175                bdrv_unref_child(bs, extent_file);
   1176                goto out;
   1177            }
   1178            extent->flat_start_offset = flat_offset << 9;
   1179        } else if (!strcmp(type, "SPARSE") || !strcmp(type, "VMFSSPARSE")) {
   1180            /* SPARSE extent and VMFSSPARSE extent are both "COWD" sparse file*/
   1181            char *buf = vmdk_read_desc(extent_file, 0, errp);
   1182            if (!buf) {
   1183                ret = -EINVAL;
   1184            } else {
   1185                ret = vmdk_open_sparse(bs, extent_file, bs->open_flags, buf,
   1186                                       options, errp);
   1187            }
   1188            g_free(buf);
   1189            if (ret) {
   1190                bdrv_unref_child(bs, extent_file);
   1191                goto out;
   1192            }
   1193            extent = &s->extents[s->num_extents - 1];
   1194        } else if (!strcmp(type, "SESPARSE")) {
   1195            ret = vmdk_open_se_sparse(bs, extent_file, bs->open_flags, errp);
   1196            if (ret) {
   1197                bdrv_unref_child(bs, extent_file);
   1198                goto out;
   1199            }
   1200            extent = &s->extents[s->num_extents - 1];
   1201        } else {
   1202            error_setg(errp, "Unsupported extent type '%s'", type);
   1203            bdrv_unref_child(bs, extent_file);
   1204            ret = -ENOTSUP;
   1205            goto out;
   1206        }
   1207        extent->type = g_strdup(type);
   1208    }
   1209
   1210    ret = 0;
   1211    goto out;
   1212
   1213invalid:
   1214    np = next_line(p);
   1215    assert(np != p);
   1216    if (np[-1] == '\n') {
   1217        np--;
   1218    }
   1219    error_setg(errp, "Invalid extent line: %.*s", (int)(np - p), p);
   1220    ret = -EINVAL;
   1221
   1222out:
   1223    g_free(desc_file_dir);
   1224    return ret;
   1225}
   1226
   1227static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
   1228                               QDict *options, Error **errp)
   1229{
   1230    int ret;
   1231    char ct[128];
   1232    BDRVVmdkState *s = bs->opaque;
   1233
   1234    if (vmdk_parse_description(buf, "createType", ct, sizeof(ct))) {
   1235        error_setg(errp, "invalid VMDK image descriptor");
   1236        ret = -EINVAL;
   1237        goto exit;
   1238    }
   1239    if (strcmp(ct, "monolithicFlat") &&
   1240        strcmp(ct, "vmfs") &&
   1241        strcmp(ct, "vmfsSparse") &&
   1242        strcmp(ct, "seSparse") &&
   1243        strcmp(ct, "twoGbMaxExtentSparse") &&
   1244        strcmp(ct, "twoGbMaxExtentFlat")) {
   1245        error_setg(errp, "Unsupported image type '%s'", ct);
   1246        ret = -ENOTSUP;
   1247        goto exit;
   1248    }
   1249    s->create_type = g_strdup(ct);
   1250    s->desc_offset = 0;
   1251    ret = vmdk_parse_extents(buf, bs, options, errp);
   1252exit:
   1253    return ret;
   1254}
   1255
   1256static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
   1257                     Error **errp)
   1258{
   1259    char *buf;
   1260    int ret;
   1261    BDRVVmdkState *s = bs->opaque;
   1262    uint32_t magic;
   1263
   1264    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
   1265                               BDRV_CHILD_IMAGE, false, errp);
   1266    if (!bs->file) {
   1267        return -EINVAL;
   1268    }
   1269
   1270    buf = vmdk_read_desc(bs->file, 0, errp);
   1271    if (!buf) {
   1272        return -EINVAL;
   1273    }
   1274
   1275    magic = ldl_be_p(buf);
   1276    switch (magic) {
   1277        case VMDK3_MAGIC:
   1278        case VMDK4_MAGIC:
   1279            ret = vmdk_open_sparse(bs, bs->file, flags, buf, options,
   1280                                   errp);
   1281            s->desc_offset = 0x200;
   1282            break;
   1283        default:
   1284            /* No data in the descriptor file */
   1285            bs->file->role &= ~BDRV_CHILD_DATA;
   1286
   1287            /* Must succeed because we have given up permissions if anything */
   1288            bdrv_child_refresh_perms(bs, bs->file, &error_abort);
   1289
   1290            ret = vmdk_open_desc_file(bs, flags, buf, options, errp);
   1291            break;
   1292    }
   1293    if (ret) {
   1294        goto fail;
   1295    }
   1296
   1297    /* try to open parent images, if exist */
   1298    ret = vmdk_parent_open(bs);
   1299    if (ret) {
   1300        goto fail;
   1301    }
   1302    ret = vmdk_read_cid(bs, 0, &s->cid);
   1303    if (ret) {
   1304        goto fail;
   1305    }
   1306    ret = vmdk_read_cid(bs, 1, &s->parent_cid);
   1307    if (ret) {
   1308        goto fail;
   1309    }
   1310    qemu_co_mutex_init(&s->lock);
   1311
   1312    /* Disable migration when VMDK images are used */
   1313    error_setg(&s->migration_blocker, "The vmdk format used by node '%s' "
   1314               "does not support live migration",
   1315               bdrv_get_device_or_node_name(bs));
   1316    ret = migrate_add_blocker(s->migration_blocker, errp);
   1317    if (ret < 0) {
   1318        error_free(s->migration_blocker);
   1319        goto fail;
   1320    }
   1321
   1322    g_free(buf);
   1323    return 0;
   1324
   1325fail:
   1326    g_free(buf);
   1327    g_free(s->create_type);
   1328    s->create_type = NULL;
   1329    vmdk_free_extents(bs);
   1330    return ret;
   1331}
   1332
   1333
   1334static void vmdk_refresh_limits(BlockDriverState *bs, Error **errp)
   1335{
   1336    BDRVVmdkState *s = bs->opaque;
   1337    int i;
   1338
   1339    for (i = 0; i < s->num_extents; i++) {
   1340        if (!s->extents[i].flat) {
   1341            bs->bl.pwrite_zeroes_alignment =
   1342                MAX(bs->bl.pwrite_zeroes_alignment,
   1343                    s->extents[i].cluster_sectors << BDRV_SECTOR_BITS);
   1344        }
   1345    }
   1346}
   1347
   1348/**
   1349 * get_whole_cluster
   1350 *
   1351 * Copy backing file's cluster that covers @sector_num, otherwise write zero,
   1352 * to the cluster at @cluster_sector_num. If @zeroed is true, we're overwriting
   1353 * a zeroed cluster in the current layer and must not copy data from the
   1354 * backing file.
   1355 *
   1356 * If @skip_start_sector < @skip_end_sector, the relative range
   1357 * [@skip_start_sector, @skip_end_sector) is not copied or written, and leave
   1358 * it for call to write user data in the request.
   1359 */
   1360static int get_whole_cluster(BlockDriverState *bs,
   1361                             VmdkExtent *extent,
   1362                             uint64_t cluster_offset,
   1363                             uint64_t offset,
   1364                             uint64_t skip_start_bytes,
   1365                             uint64_t skip_end_bytes,
   1366                             bool zeroed)
   1367{
   1368    int ret = VMDK_OK;
   1369    int64_t cluster_bytes;
   1370    uint8_t *whole_grain;
   1371    bool copy_from_backing;
   1372
   1373    /* For COW, align request sector_num to cluster start */
   1374    cluster_bytes = extent->cluster_sectors << BDRV_SECTOR_BITS;
   1375    offset = QEMU_ALIGN_DOWN(offset, cluster_bytes);
   1376    whole_grain = qemu_blockalign(bs, cluster_bytes);
   1377    copy_from_backing = bs->backing && !zeroed;
   1378
   1379    if (!copy_from_backing) {
   1380        memset(whole_grain, 0, skip_start_bytes);
   1381        memset(whole_grain + skip_end_bytes, 0, cluster_bytes - skip_end_bytes);
   1382    }
   1383
   1384    assert(skip_end_bytes <= cluster_bytes);
   1385    /* we will be here if it's first write on non-exist grain(cluster).
   1386     * try to read from parent image, if exist */
   1387    if (bs->backing && !vmdk_is_cid_valid(bs)) {
   1388        ret = VMDK_ERROR;
   1389        goto exit;
   1390    }
   1391
   1392    /* Read backing data before skip range */
   1393    if (skip_start_bytes > 0) {
   1394        if (copy_from_backing) {
   1395            /* qcow2 emits this on bs->file instead of bs->backing */
   1396            BLKDBG_EVENT(extent->file, BLKDBG_COW_READ);
   1397            ret = bdrv_pread(bs->backing, offset, whole_grain,
   1398                             skip_start_bytes);
   1399            if (ret < 0) {
   1400                ret = VMDK_ERROR;
   1401                goto exit;
   1402            }
   1403        }
   1404        BLKDBG_EVENT(extent->file, BLKDBG_COW_WRITE);
   1405        ret = bdrv_pwrite(extent->file, cluster_offset, whole_grain,
   1406                          skip_start_bytes);
   1407        if (ret < 0) {
   1408            ret = VMDK_ERROR;
   1409            goto exit;
   1410        }
   1411    }
   1412    /* Read backing data after skip range */
   1413    if (skip_end_bytes < cluster_bytes) {
   1414        if (copy_from_backing) {
   1415            /* qcow2 emits this on bs->file instead of bs->backing */
   1416            BLKDBG_EVENT(extent->file, BLKDBG_COW_READ);
   1417            ret = bdrv_pread(bs->backing, offset + skip_end_bytes,
   1418                             whole_grain + skip_end_bytes,
   1419                             cluster_bytes - skip_end_bytes);
   1420            if (ret < 0) {
   1421                ret = VMDK_ERROR;
   1422                goto exit;
   1423            }
   1424        }
   1425        BLKDBG_EVENT(extent->file, BLKDBG_COW_WRITE);
   1426        ret = bdrv_pwrite(extent->file, cluster_offset + skip_end_bytes,
   1427                          whole_grain + skip_end_bytes,
   1428                          cluster_bytes - skip_end_bytes);
   1429        if (ret < 0) {
   1430            ret = VMDK_ERROR;
   1431            goto exit;
   1432        }
   1433    }
   1434
   1435    ret = VMDK_OK;
   1436exit:
   1437    qemu_vfree(whole_grain);
   1438    return ret;
   1439}
   1440
   1441static int vmdk_L2update(VmdkExtent *extent, VmdkMetaData *m_data,
   1442                         uint32_t offset)
   1443{
   1444    offset = cpu_to_le32(offset);
   1445    /* update L2 table */
   1446    BLKDBG_EVENT(extent->file, BLKDBG_L2_UPDATE);
   1447    if (bdrv_pwrite(extent->file,
   1448                ((int64_t)m_data->l2_offset * 512)
   1449                    + (m_data->l2_index * sizeof(offset)),
   1450                &offset, sizeof(offset)) < 0) {
   1451        return VMDK_ERROR;
   1452    }
   1453    /* update backup L2 table */
   1454    if (extent->l1_backup_table_offset != 0) {
   1455        m_data->l2_offset = extent->l1_backup_table[m_data->l1_index];
   1456        if (bdrv_pwrite(extent->file,
   1457                    ((int64_t)m_data->l2_offset * 512)
   1458                        + (m_data->l2_index * sizeof(offset)),
   1459                    &offset, sizeof(offset)) < 0) {
   1460            return VMDK_ERROR;
   1461        }
   1462    }
   1463    if (bdrv_flush(extent->file->bs) < 0) {
   1464        return VMDK_ERROR;
   1465    }
   1466    if (m_data->l2_cache_entry) {
   1467        *m_data->l2_cache_entry = offset;
   1468    }
   1469
   1470    return VMDK_OK;
   1471}
   1472
   1473/**
   1474 * get_cluster_offset
   1475 *
   1476 * Look up cluster offset in extent file by sector number, and store in
   1477 * @cluster_offset.
   1478 *
   1479 * For flat extents, the start offset as parsed from the description file is
   1480 * returned.
   1481 *
   1482 * For sparse extents, look up in L1, L2 table. If allocate is true, return an
   1483 * offset for a new cluster and update L2 cache. If there is a backing file,
   1484 * COW is done before returning; otherwise, zeroes are written to the allocated
   1485 * cluster. Both COW and zero writing skips the sector range
   1486 * [@skip_start_sector, @skip_end_sector) passed in by caller, because caller
   1487 * has new data to write there.
   1488 *
   1489 * Returns: VMDK_OK if cluster exists and mapped in the image.
   1490 *          VMDK_UNALLOC if cluster is not mapped and @allocate is false.
   1491 *          VMDK_ERROR if failed.
   1492 */
   1493static int get_cluster_offset(BlockDriverState *bs,
   1494                              VmdkExtent *extent,
   1495                              VmdkMetaData *m_data,
   1496                              uint64_t offset,
   1497                              bool allocate,
   1498                              uint64_t *cluster_offset,
   1499                              uint64_t skip_start_bytes,
   1500                              uint64_t skip_end_bytes)
   1501{
   1502    unsigned int l1_index, l2_offset, l2_index;
   1503    int min_index, i, j;
   1504    uint32_t min_count;
   1505    void *l2_table;
   1506    bool zeroed = false;
   1507    int64_t ret;
   1508    int64_t cluster_sector;
   1509    unsigned int l2_size_bytes = extent->l2_size * extent->entry_size;
   1510
   1511    if (m_data) {
   1512        m_data->new_allocation = false;
   1513    }
   1514    if (extent->flat) {
   1515        *cluster_offset = extent->flat_start_offset;
   1516        return VMDK_OK;
   1517    }
   1518
   1519    offset -= (extent->end_sector - extent->sectors) * SECTOR_SIZE;
   1520    l1_index = (offset >> 9) / extent->l1_entry_sectors;
   1521    if (l1_index >= extent->l1_size) {
   1522        return VMDK_ERROR;
   1523    }
   1524    if (extent->sesparse) {
   1525        uint64_t l2_offset_u64;
   1526
   1527        assert(extent->entry_size == sizeof(uint64_t));
   1528
   1529        l2_offset_u64 = ((uint64_t *)extent->l1_table)[l1_index];
   1530        if (l2_offset_u64 == 0) {
   1531            l2_offset = 0;
   1532        } else if ((l2_offset_u64 & 0xffffffff00000000) != 0x1000000000000000) {
   1533            /*
   1534             * Top most nibble is 0x1 if grain table is allocated.
   1535             * strict check - top most 4 bytes must be 0x10000000 since max
   1536             * supported size is 64TB for disk - so no more than 64TB / 16MB
   1537             * grain directories which is smaller than uint32,
   1538             * where 16MB is the only supported default grain table coverage.
   1539             */
   1540            return VMDK_ERROR;
   1541        } else {
   1542            l2_offset_u64 = l2_offset_u64 & 0x00000000ffffffff;
   1543            l2_offset_u64 = extent->sesparse_l2_tables_offset +
   1544                l2_offset_u64 * l2_size_bytes / SECTOR_SIZE;
   1545            if (l2_offset_u64 > 0x00000000ffffffff) {
   1546                return VMDK_ERROR;
   1547            }
   1548            l2_offset = (unsigned int)(l2_offset_u64);
   1549        }
   1550    } else {
   1551        assert(extent->entry_size == sizeof(uint32_t));
   1552        l2_offset = ((uint32_t *)extent->l1_table)[l1_index];
   1553    }
   1554    if (!l2_offset) {
   1555        return VMDK_UNALLOC;
   1556    }
   1557    for (i = 0; i < L2_CACHE_SIZE; i++) {
   1558        if (l2_offset == extent->l2_cache_offsets[i]) {
   1559            /* increment the hit count */
   1560            if (++extent->l2_cache_counts[i] == 0xffffffff) {
   1561                for (j = 0; j < L2_CACHE_SIZE; j++) {
   1562                    extent->l2_cache_counts[j] >>= 1;
   1563                }
   1564            }
   1565            l2_table = (char *)extent->l2_cache + (i * l2_size_bytes);
   1566            goto found;
   1567        }
   1568    }
   1569    /* not found: load a new entry in the least used one */
   1570    min_index = 0;
   1571    min_count = 0xffffffff;
   1572    for (i = 0; i < L2_CACHE_SIZE; i++) {
   1573        if (extent->l2_cache_counts[i] < min_count) {
   1574            min_count = extent->l2_cache_counts[i];
   1575            min_index = i;
   1576        }
   1577    }
   1578    l2_table = (char *)extent->l2_cache + (min_index * l2_size_bytes);
   1579    BLKDBG_EVENT(extent->file, BLKDBG_L2_LOAD);
   1580    if (bdrv_pread(extent->file,
   1581                (int64_t)l2_offset * 512,
   1582                l2_table,
   1583                l2_size_bytes
   1584            ) != l2_size_bytes) {
   1585        return VMDK_ERROR;
   1586    }
   1587
   1588    extent->l2_cache_offsets[min_index] = l2_offset;
   1589    extent->l2_cache_counts[min_index] = 1;
   1590 found:
   1591    l2_index = ((offset >> 9) / extent->cluster_sectors) % extent->l2_size;
   1592    if (m_data) {
   1593        m_data->l1_index = l1_index;
   1594        m_data->l2_index = l2_index;
   1595        m_data->l2_offset = l2_offset;
   1596        m_data->l2_cache_entry = ((uint32_t *)l2_table) + l2_index;
   1597    }
   1598
   1599    if (extent->sesparse) {
   1600        cluster_sector = le64_to_cpu(((uint64_t *)l2_table)[l2_index]);
   1601        switch (cluster_sector & 0xf000000000000000) {
   1602        case 0x0000000000000000:
   1603            /* unallocated grain */
   1604            if (cluster_sector != 0) {
   1605                return VMDK_ERROR;
   1606            }
   1607            break;
   1608        case 0x1000000000000000:
   1609            /* scsi-unmapped grain - fallthrough */
   1610        case 0x2000000000000000:
   1611            /* zero grain */
   1612            zeroed = true;
   1613            break;
   1614        case 0x3000000000000000:
   1615            /* allocated grain */
   1616            cluster_sector = (((cluster_sector & 0x0fff000000000000) >> 48) |
   1617                              ((cluster_sector & 0x0000ffffffffffff) << 12));
   1618            cluster_sector = extent->sesparse_clusters_offset +
   1619                cluster_sector * extent->cluster_sectors;
   1620            break;
   1621        default:
   1622            return VMDK_ERROR;
   1623        }
   1624    } else {
   1625        cluster_sector = le32_to_cpu(((uint32_t *)l2_table)[l2_index]);
   1626
   1627        if (extent->has_zero_grain && cluster_sector == VMDK_GTE_ZEROED) {
   1628            zeroed = true;
   1629        }
   1630    }
   1631
   1632    if (!cluster_sector || zeroed) {
   1633        if (!allocate) {
   1634            return zeroed ? VMDK_ZEROED : VMDK_UNALLOC;
   1635        }
   1636        assert(!extent->sesparse);
   1637
   1638        if (extent->next_cluster_sector >= VMDK_EXTENT_MAX_SECTORS) {
   1639            return VMDK_ERROR;
   1640        }
   1641
   1642        cluster_sector = extent->next_cluster_sector;
   1643        extent->next_cluster_sector += extent->cluster_sectors;
   1644
   1645        /* First of all we write grain itself, to avoid race condition
   1646         * that may to corrupt the image.
   1647         * This problem may occur because of insufficient space on host disk
   1648         * or inappropriate VM shutdown.
   1649         */
   1650        ret = get_whole_cluster(bs, extent, cluster_sector * BDRV_SECTOR_SIZE,
   1651                                offset, skip_start_bytes, skip_end_bytes,
   1652                                zeroed);
   1653        if (ret) {
   1654            return ret;
   1655        }
   1656        if (m_data) {
   1657            m_data->new_allocation = true;
   1658        }
   1659    }
   1660    *cluster_offset = cluster_sector << BDRV_SECTOR_BITS;
   1661    return VMDK_OK;
   1662}
   1663
   1664static VmdkExtent *find_extent(BDRVVmdkState *s,
   1665                                int64_t sector_num, VmdkExtent *start_hint)
   1666{
   1667    VmdkExtent *extent = start_hint;
   1668
   1669    if (!extent) {
   1670        extent = &s->extents[0];
   1671    }
   1672    while (extent < &s->extents[s->num_extents]) {
   1673        if (sector_num < extent->end_sector) {
   1674            return extent;
   1675        }
   1676        extent++;
   1677    }
   1678    return NULL;
   1679}
   1680
   1681static inline uint64_t vmdk_find_offset_in_cluster(VmdkExtent *extent,
   1682                                                   int64_t offset)
   1683{
   1684    uint64_t extent_begin_offset, extent_relative_offset;
   1685    uint64_t cluster_size = extent->cluster_sectors * BDRV_SECTOR_SIZE;
   1686
   1687    extent_begin_offset =
   1688        (extent->end_sector - extent->sectors) * BDRV_SECTOR_SIZE;
   1689    extent_relative_offset = offset - extent_begin_offset;
   1690    return extent_relative_offset % cluster_size;
   1691}
   1692
   1693static int coroutine_fn vmdk_co_block_status(BlockDriverState *bs,
   1694                                             bool want_zero,
   1695                                             int64_t offset, int64_t bytes,
   1696                                             int64_t *pnum, int64_t *map,
   1697                                             BlockDriverState **file)
   1698{
   1699    BDRVVmdkState *s = bs->opaque;
   1700    int64_t index_in_cluster, n, ret;
   1701    uint64_t cluster_offset;
   1702    VmdkExtent *extent;
   1703
   1704    extent = find_extent(s, offset >> BDRV_SECTOR_BITS, NULL);
   1705    if (!extent) {
   1706        return -EIO;
   1707    }
   1708    qemu_co_mutex_lock(&s->lock);
   1709    ret = get_cluster_offset(bs, extent, NULL, offset, false, &cluster_offset,
   1710                             0, 0);
   1711    qemu_co_mutex_unlock(&s->lock);
   1712
   1713    index_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
   1714    switch (ret) {
   1715    case VMDK_ERROR:
   1716        ret = -EIO;
   1717        break;
   1718    case VMDK_UNALLOC:
   1719        ret = 0;
   1720        break;
   1721    case VMDK_ZEROED:
   1722        ret = BDRV_BLOCK_ZERO;
   1723        break;
   1724    case VMDK_OK:
   1725        ret = BDRV_BLOCK_DATA;
   1726        if (!extent->compressed) {
   1727            ret |= BDRV_BLOCK_OFFSET_VALID;
   1728            *map = cluster_offset + index_in_cluster;
   1729            if (extent->flat) {
   1730                ret |= BDRV_BLOCK_RECURSE;
   1731            }
   1732        }
   1733        *file = extent->file->bs;
   1734        break;
   1735    }
   1736
   1737    n = extent->cluster_sectors * BDRV_SECTOR_SIZE - index_in_cluster;
   1738    *pnum = MIN(n, bytes);
   1739    return ret;
   1740}
   1741
   1742static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
   1743                            int64_t offset_in_cluster, QEMUIOVector *qiov,
   1744                            uint64_t qiov_offset, uint64_t n_bytes,
   1745                            uint64_t offset)
   1746{
   1747    int ret;
   1748    VmdkGrainMarker *data = NULL;
   1749    uLongf buf_len;
   1750    QEMUIOVector local_qiov;
   1751    int64_t write_offset;
   1752    int64_t write_end_sector;
   1753
   1754    if (extent->compressed) {
   1755        void *compressed_data;
   1756
   1757        /* Only whole clusters */
   1758        if (offset_in_cluster ||
   1759            n_bytes > (extent->cluster_sectors * SECTOR_SIZE) ||
   1760            (n_bytes < (extent->cluster_sectors * SECTOR_SIZE) &&
   1761             offset + n_bytes != extent->end_sector * SECTOR_SIZE))
   1762        {
   1763            ret = -EINVAL;
   1764            goto out;
   1765        }
   1766
   1767        if (!extent->has_marker) {
   1768            ret = -EINVAL;
   1769            goto out;
   1770        }
   1771        buf_len = (extent->cluster_sectors << 9) * 2;
   1772        data = g_malloc(buf_len + sizeof(VmdkGrainMarker));
   1773
   1774        compressed_data = g_malloc(n_bytes);
   1775        qemu_iovec_to_buf(qiov, qiov_offset, compressed_data, n_bytes);
   1776        ret = compress(data->data, &buf_len, compressed_data, n_bytes);
   1777        g_free(compressed_data);
   1778
   1779        if (ret != Z_OK || buf_len == 0) {
   1780            ret = -EINVAL;
   1781            goto out;
   1782        }
   1783
   1784        data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS);
   1785        data->size = cpu_to_le32(buf_len);
   1786
   1787        n_bytes = buf_len + sizeof(VmdkGrainMarker);
   1788        qemu_iovec_init_buf(&local_qiov, data, n_bytes);
   1789
   1790        BLKDBG_EVENT(extent->file, BLKDBG_WRITE_COMPRESSED);
   1791    } else {
   1792        qemu_iovec_init(&local_qiov, qiov->niov);
   1793        qemu_iovec_concat(&local_qiov, qiov, qiov_offset, n_bytes);
   1794
   1795        BLKDBG_EVENT(extent->file, BLKDBG_WRITE_AIO);
   1796    }
   1797
   1798    write_offset = cluster_offset + offset_in_cluster;
   1799    ret = bdrv_co_pwritev(extent->file, write_offset, n_bytes,
   1800                          &local_qiov, 0);
   1801
   1802    write_end_sector = DIV_ROUND_UP(write_offset + n_bytes, BDRV_SECTOR_SIZE);
   1803
   1804    if (extent->compressed) {
   1805        extent->next_cluster_sector = write_end_sector;
   1806    } else {
   1807        extent->next_cluster_sector = MAX(extent->next_cluster_sector,
   1808                                          write_end_sector);
   1809    }
   1810
   1811    if (ret < 0) {
   1812        goto out;
   1813    }
   1814    ret = 0;
   1815 out:
   1816    g_free(data);
   1817    if (!extent->compressed) {
   1818        qemu_iovec_destroy(&local_qiov);
   1819    }
   1820    return ret;
   1821}
   1822
   1823static int vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset,
   1824                            int64_t offset_in_cluster, QEMUIOVector *qiov,
   1825                            int bytes)
   1826{
   1827    int ret;
   1828    int cluster_bytes, buf_bytes;
   1829    uint8_t *cluster_buf, *compressed_data;
   1830    uint8_t *uncomp_buf;
   1831    uint32_t data_len;
   1832    VmdkGrainMarker *marker;
   1833    uLongf buf_len;
   1834
   1835
   1836    if (!extent->compressed) {
   1837        BLKDBG_EVENT(extent->file, BLKDBG_READ_AIO);
   1838        ret = bdrv_co_preadv(extent->file,
   1839                             cluster_offset + offset_in_cluster, bytes,
   1840                             qiov, 0);
   1841        if (ret < 0) {
   1842            return ret;
   1843        }
   1844        return 0;
   1845    }
   1846    cluster_bytes = extent->cluster_sectors * 512;
   1847    /* Read two clusters in case GrainMarker + compressed data > one cluster */
   1848    buf_bytes = cluster_bytes * 2;
   1849    cluster_buf = g_malloc(buf_bytes);
   1850    uncomp_buf = g_malloc(cluster_bytes);
   1851    BLKDBG_EVENT(extent->file, BLKDBG_READ_COMPRESSED);
   1852    ret = bdrv_pread(extent->file,
   1853                cluster_offset,
   1854                cluster_buf, buf_bytes);
   1855    if (ret < 0) {
   1856        goto out;
   1857    }
   1858    compressed_data = cluster_buf;
   1859    buf_len = cluster_bytes;
   1860    data_len = cluster_bytes;
   1861    if (extent->has_marker) {
   1862        marker = (VmdkGrainMarker *)cluster_buf;
   1863        compressed_data = marker->data;
   1864        data_len = le32_to_cpu(marker->size);
   1865    }
   1866    if (!data_len || data_len > buf_bytes) {
   1867        ret = -EINVAL;
   1868        goto out;
   1869    }
   1870    ret = uncompress(uncomp_buf, &buf_len, compressed_data, data_len);
   1871    if (ret != Z_OK) {
   1872        ret = -EINVAL;
   1873        goto out;
   1874
   1875    }
   1876    if (offset_in_cluster < 0 ||
   1877            offset_in_cluster + bytes > buf_len) {
   1878        ret = -EINVAL;
   1879        goto out;
   1880    }
   1881    qemu_iovec_from_buf(qiov, 0, uncomp_buf + offset_in_cluster, bytes);
   1882    ret = 0;
   1883
   1884 out:
   1885    g_free(uncomp_buf);
   1886    g_free(cluster_buf);
   1887    return ret;
   1888}
   1889
   1890static int coroutine_fn
   1891vmdk_co_preadv(BlockDriverState *bs, int64_t offset, int64_t bytes,
   1892               QEMUIOVector *qiov, BdrvRequestFlags flags)
   1893{
   1894    BDRVVmdkState *s = bs->opaque;
   1895    int ret;
   1896    uint64_t n_bytes, offset_in_cluster;
   1897    VmdkExtent *extent = NULL;
   1898    QEMUIOVector local_qiov;
   1899    uint64_t cluster_offset;
   1900    uint64_t bytes_done = 0;
   1901
   1902    qemu_iovec_init(&local_qiov, qiov->niov);
   1903    qemu_co_mutex_lock(&s->lock);
   1904
   1905    while (bytes > 0) {
   1906        extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent);
   1907        if (!extent) {
   1908            ret = -EIO;
   1909            goto fail;
   1910        }
   1911        ret = get_cluster_offset(bs, extent, NULL,
   1912                                 offset, false, &cluster_offset, 0, 0);
   1913        offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
   1914
   1915        n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
   1916                             - offset_in_cluster);
   1917
   1918        if (ret != VMDK_OK) {
   1919            /* if not allocated, try to read from parent image, if exist */
   1920            if (bs->backing && ret != VMDK_ZEROED) {
   1921                if (!vmdk_is_cid_valid(bs)) {
   1922                    ret = -EINVAL;
   1923                    goto fail;
   1924                }
   1925
   1926                qemu_iovec_reset(&local_qiov);
   1927                qemu_iovec_concat(&local_qiov, qiov, bytes_done, n_bytes);
   1928
   1929                /* qcow2 emits this on bs->file instead of bs->backing */
   1930                BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
   1931                ret = bdrv_co_preadv(bs->backing, offset, n_bytes,
   1932                                     &local_qiov, 0);
   1933                if (ret < 0) {
   1934                    goto fail;
   1935                }
   1936            } else {
   1937                qemu_iovec_memset(qiov, bytes_done, 0, n_bytes);
   1938            }
   1939        } else {
   1940            qemu_iovec_reset(&local_qiov);
   1941            qemu_iovec_concat(&local_qiov, qiov, bytes_done, n_bytes);
   1942
   1943            ret = vmdk_read_extent(extent, cluster_offset, offset_in_cluster,
   1944                                   &local_qiov, n_bytes);
   1945            if (ret) {
   1946                goto fail;
   1947            }
   1948        }
   1949        bytes -= n_bytes;
   1950        offset += n_bytes;
   1951        bytes_done += n_bytes;
   1952    }
   1953
   1954    ret = 0;
   1955fail:
   1956    qemu_co_mutex_unlock(&s->lock);
   1957    qemu_iovec_destroy(&local_qiov);
   1958
   1959    return ret;
   1960}
   1961
   1962/**
   1963 * vmdk_write:
   1964 * @zeroed:       buf is ignored (data is zero), use zeroed_grain GTE feature
   1965 *                if possible, otherwise return -ENOTSUP.
   1966 * @zero_dry_run: used for zeroed == true only, don't update L2 table, just try
   1967 *                with each cluster. By dry run we can find if the zero write
   1968 *                is possible without modifying image data.
   1969 *
   1970 * Returns: error code with 0 for success.
   1971 */
   1972static int vmdk_pwritev(BlockDriverState *bs, uint64_t offset,
   1973                       uint64_t bytes, QEMUIOVector *qiov,
   1974                       bool zeroed, bool zero_dry_run)
   1975{
   1976    BDRVVmdkState *s = bs->opaque;
   1977    VmdkExtent *extent = NULL;
   1978    int ret;
   1979    int64_t offset_in_cluster, n_bytes;
   1980    uint64_t cluster_offset;
   1981    uint64_t bytes_done = 0;
   1982    VmdkMetaData m_data;
   1983
   1984    if (DIV_ROUND_UP(offset, BDRV_SECTOR_SIZE) > bs->total_sectors) {
   1985        error_report("Wrong offset: offset=0x%" PRIx64
   1986                     " total_sectors=0x%" PRIx64,
   1987                     offset, bs->total_sectors);
   1988        return -EIO;
   1989    }
   1990
   1991    while (bytes > 0) {
   1992        extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent);
   1993        if (!extent) {
   1994            return -EIO;
   1995        }
   1996        if (extent->sesparse) {
   1997            return -ENOTSUP;
   1998        }
   1999        offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
   2000        n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
   2001                             - offset_in_cluster);
   2002
   2003        ret = get_cluster_offset(bs, extent, &m_data, offset,
   2004                                 !(extent->compressed || zeroed),
   2005                                 &cluster_offset, offset_in_cluster,
   2006                                 offset_in_cluster + n_bytes);
   2007        if (extent->compressed) {
   2008            if (ret == VMDK_OK) {
   2009                /* Refuse write to allocated cluster for streamOptimized */
   2010                error_report("Could not write to allocated cluster"
   2011                              " for streamOptimized");
   2012                return -EIO;
   2013            } else if (!zeroed) {
   2014                /* allocate */
   2015                ret = get_cluster_offset(bs, extent, &m_data, offset,
   2016                                         true, &cluster_offset, 0, 0);
   2017            }
   2018        }
   2019        if (ret == VMDK_ERROR) {
   2020            return -EINVAL;
   2021        }
   2022        if (zeroed) {
   2023            /* Do zeroed write, buf is ignored */
   2024            if (extent->has_zero_grain &&
   2025                    offset_in_cluster == 0 &&
   2026                    n_bytes >= extent->cluster_sectors * BDRV_SECTOR_SIZE) {
   2027                n_bytes = extent->cluster_sectors * BDRV_SECTOR_SIZE;
   2028                if (!zero_dry_run && ret != VMDK_ZEROED) {
   2029                    /* update L2 tables */
   2030                    if (vmdk_L2update(extent, &m_data, VMDK_GTE_ZEROED)
   2031                            != VMDK_OK) {
   2032                        return -EIO;
   2033                    }
   2034                }
   2035            } else {
   2036                return -ENOTSUP;
   2037            }
   2038        } else {
   2039            ret = vmdk_write_extent(extent, cluster_offset, offset_in_cluster,
   2040                                    qiov, bytes_done, n_bytes, offset);
   2041            if (ret) {
   2042                return ret;
   2043            }
   2044            if (m_data.new_allocation) {
   2045                /* update L2 tables */
   2046                if (vmdk_L2update(extent, &m_data,
   2047                                  cluster_offset >> BDRV_SECTOR_BITS)
   2048                        != VMDK_OK) {
   2049                    return -EIO;
   2050                }
   2051            }
   2052        }
   2053        bytes -= n_bytes;
   2054        offset += n_bytes;
   2055        bytes_done += n_bytes;
   2056
   2057        /* update CID on the first write every time the virtual disk is
   2058         * opened */
   2059        if (!s->cid_updated) {
   2060            ret = vmdk_write_cid(bs, g_random_int());
   2061            if (ret < 0) {
   2062                return ret;
   2063            }
   2064            s->cid_updated = true;
   2065        }
   2066    }
   2067    return 0;
   2068}
   2069
   2070static int coroutine_fn
   2071vmdk_co_pwritev(BlockDriverState *bs, int64_t offset, int64_t bytes,
   2072                QEMUIOVector *qiov, BdrvRequestFlags flags)
   2073{
   2074    int ret;
   2075    BDRVVmdkState *s = bs->opaque;
   2076    qemu_co_mutex_lock(&s->lock);
   2077    ret = vmdk_pwritev(bs, offset, bytes, qiov, false, false);
   2078    qemu_co_mutex_unlock(&s->lock);
   2079    return ret;
   2080}
   2081
   2082static int coroutine_fn
   2083vmdk_co_pwritev_compressed(BlockDriverState *bs, int64_t offset, int64_t bytes,
   2084                           QEMUIOVector *qiov)
   2085{
   2086    if (bytes == 0) {
   2087        /* The caller will write bytes 0 to signal EOF.
   2088         * When receive it, we align EOF to a sector boundary. */
   2089        BDRVVmdkState *s = bs->opaque;
   2090        int i, ret;
   2091        int64_t length;
   2092
   2093        for (i = 0; i < s->num_extents; i++) {
   2094            length = bdrv_getlength(s->extents[i].file->bs);
   2095            if (length < 0) {
   2096                return length;
   2097            }
   2098            length = QEMU_ALIGN_UP(length, BDRV_SECTOR_SIZE);
   2099            ret = bdrv_truncate(s->extents[i].file, length, false,
   2100                                PREALLOC_MODE_OFF, 0, NULL);
   2101            if (ret < 0) {
   2102                return ret;
   2103            }
   2104        }
   2105        return 0;
   2106    }
   2107    return vmdk_co_pwritev(bs, offset, bytes, qiov, 0);
   2108}
   2109
   2110static int coroutine_fn vmdk_co_pwrite_zeroes(BlockDriverState *bs,
   2111                                              int64_t offset,
   2112                                              int64_t bytes,
   2113                                              BdrvRequestFlags flags)
   2114{
   2115    int ret;
   2116    BDRVVmdkState *s = bs->opaque;
   2117
   2118    qemu_co_mutex_lock(&s->lock);
   2119    /* write zeroes could fail if sectors not aligned to cluster, test it with
   2120     * dry_run == true before really updating image */
   2121    ret = vmdk_pwritev(bs, offset, bytes, NULL, true, true);
   2122    if (!ret) {
   2123        ret = vmdk_pwritev(bs, offset, bytes, NULL, true, false);
   2124    }
   2125    qemu_co_mutex_unlock(&s->lock);
   2126    return ret;
   2127}
   2128
   2129static int vmdk_init_extent(BlockBackend *blk,
   2130                            int64_t filesize, bool flat,
   2131                            bool compress, bool zeroed_grain,
   2132                            Error **errp)
   2133{
   2134    int ret, i;
   2135    VMDK4Header header;
   2136    uint32_t tmp, magic, grains, gd_sectors, gt_size, gt_count;
   2137    uint32_t *gd_buf = NULL;
   2138    int gd_buf_size;
   2139
   2140    if (flat) {
   2141        ret = blk_truncate(blk, filesize, false, PREALLOC_MODE_OFF, 0, errp);
   2142        goto exit;
   2143    }
   2144    magic = cpu_to_be32(VMDK4_MAGIC);
   2145    memset(&header, 0, sizeof(header));
   2146    if (compress) {
   2147        header.version = 3;
   2148    } else if (zeroed_grain) {
   2149        header.version = 2;
   2150    } else {
   2151        header.version = 1;
   2152    }
   2153    header.flags = VMDK4_FLAG_RGD | VMDK4_FLAG_NL_DETECT
   2154                   | (compress ? VMDK4_FLAG_COMPRESS | VMDK4_FLAG_MARKER : 0)
   2155                   | (zeroed_grain ? VMDK4_FLAG_ZERO_GRAIN : 0);
   2156    header.compressAlgorithm = compress ? VMDK4_COMPRESSION_DEFLATE : 0;
   2157    header.capacity = filesize / BDRV_SECTOR_SIZE;
   2158    header.granularity = 128;
   2159    header.num_gtes_per_gt = BDRV_SECTOR_SIZE;
   2160
   2161    grains = DIV_ROUND_UP(filesize / BDRV_SECTOR_SIZE, header.granularity);
   2162    gt_size = DIV_ROUND_UP(header.num_gtes_per_gt * sizeof(uint32_t),
   2163                           BDRV_SECTOR_SIZE);
   2164    gt_count = DIV_ROUND_UP(grains, header.num_gtes_per_gt);
   2165    gd_sectors = DIV_ROUND_UP(gt_count * sizeof(uint32_t), BDRV_SECTOR_SIZE);
   2166
   2167    header.desc_offset = 1;
   2168    header.desc_size = 20;
   2169    header.rgd_offset = header.desc_offset + header.desc_size;
   2170    header.gd_offset = header.rgd_offset + gd_sectors + (gt_size * gt_count);
   2171    header.grain_offset =
   2172        ROUND_UP(header.gd_offset + gd_sectors + (gt_size * gt_count),
   2173                 header.granularity);
   2174    /* swap endianness for all header fields */
   2175    header.version = cpu_to_le32(header.version);
   2176    header.flags = cpu_to_le32(header.flags);
   2177    header.capacity = cpu_to_le64(header.capacity);
   2178    header.granularity = cpu_to_le64(header.granularity);
   2179    header.num_gtes_per_gt = cpu_to_le32(header.num_gtes_per_gt);
   2180    header.desc_offset = cpu_to_le64(header.desc_offset);
   2181    header.desc_size = cpu_to_le64(header.desc_size);
   2182    header.rgd_offset = cpu_to_le64(header.rgd_offset);
   2183    header.gd_offset = cpu_to_le64(header.gd_offset);
   2184    header.grain_offset = cpu_to_le64(header.grain_offset);
   2185    header.compressAlgorithm = cpu_to_le16(header.compressAlgorithm);
   2186
   2187    header.check_bytes[0] = 0xa;
   2188    header.check_bytes[1] = 0x20;
   2189    header.check_bytes[2] = 0xd;
   2190    header.check_bytes[3] = 0xa;
   2191
   2192    /* write all the data */
   2193    ret = blk_pwrite(blk, 0, &magic, sizeof(magic), 0);
   2194    if (ret < 0) {
   2195        error_setg(errp, QERR_IO_ERROR);
   2196        goto exit;
   2197    }
   2198    ret = blk_pwrite(blk, sizeof(magic), &header, sizeof(header), 0);
   2199    if (ret < 0) {
   2200        error_setg(errp, QERR_IO_ERROR);
   2201        goto exit;
   2202    }
   2203
   2204    ret = blk_truncate(blk, le64_to_cpu(header.grain_offset) << 9, false,
   2205                       PREALLOC_MODE_OFF, 0, errp);
   2206    if (ret < 0) {
   2207        goto exit;
   2208    }
   2209
   2210    /* write grain directory */
   2211    gd_buf_size = gd_sectors * BDRV_SECTOR_SIZE;
   2212    gd_buf = g_malloc0(gd_buf_size);
   2213    for (i = 0, tmp = le64_to_cpu(header.rgd_offset) + gd_sectors;
   2214         i < gt_count; i++, tmp += gt_size) {
   2215        gd_buf[i] = cpu_to_le32(tmp);
   2216    }
   2217    ret = blk_pwrite(blk, le64_to_cpu(header.rgd_offset) * BDRV_SECTOR_SIZE,
   2218                     gd_buf, gd_buf_size, 0);
   2219    if (ret < 0) {
   2220        error_setg(errp, QERR_IO_ERROR);
   2221        goto exit;
   2222    }
   2223
   2224    /* write backup grain directory */
   2225    for (i = 0, tmp = le64_to_cpu(header.gd_offset) + gd_sectors;
   2226         i < gt_count; i++, tmp += gt_size) {
   2227        gd_buf[i] = cpu_to_le32(tmp);
   2228    }
   2229    ret = blk_pwrite(blk, le64_to_cpu(header.gd_offset) * BDRV_SECTOR_SIZE,
   2230                     gd_buf, gd_buf_size, 0);
   2231    if (ret < 0) {
   2232        error_setg(errp, QERR_IO_ERROR);
   2233    }
   2234
   2235    ret = 0;
   2236exit:
   2237    g_free(gd_buf);
   2238    return ret;
   2239}
   2240
   2241static int vmdk_create_extent(const char *filename, int64_t filesize,
   2242                              bool flat, bool compress, bool zeroed_grain,
   2243                              BlockBackend **pbb,
   2244                              QemuOpts *opts, Error **errp)
   2245{
   2246    int ret;
   2247    BlockBackend *blk = NULL;
   2248
   2249    ret = bdrv_create_file(filename, opts, errp);
   2250    if (ret < 0) {
   2251        goto exit;
   2252    }
   2253
   2254    blk = blk_new_open(filename, NULL, NULL,
   2255                       BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL,
   2256                       errp);
   2257    if (blk == NULL) {
   2258        ret = -EIO;
   2259        goto exit;
   2260    }
   2261
   2262    blk_set_allow_write_beyond_eof(blk, true);
   2263
   2264    ret = vmdk_init_extent(blk, filesize, flat, compress, zeroed_grain, errp);
   2265exit:
   2266    if (blk) {
   2267        if (pbb) {
   2268            *pbb = blk;
   2269        } else {
   2270            blk_unref(blk);
   2271            blk = NULL;
   2272        }
   2273    }
   2274    return ret;
   2275}
   2276
   2277static int filename_decompose(const char *filename, char *path, char *prefix,
   2278                              char *postfix, size_t buf_len, Error **errp)
   2279{
   2280    const char *p, *q;
   2281
   2282    if (filename == NULL || !strlen(filename)) {
   2283        error_setg(errp, "No filename provided");
   2284        return VMDK_ERROR;
   2285    }
   2286    p = strrchr(filename, '/');
   2287    if (p == NULL) {
   2288        p = strrchr(filename, '\\');
   2289    }
   2290    if (p == NULL) {
   2291        p = strrchr(filename, ':');
   2292    }
   2293    if (p != NULL) {
   2294        p++;
   2295        if (p - filename >= buf_len) {
   2296            return VMDK_ERROR;
   2297        }
   2298        pstrcpy(path, p - filename + 1, filename);
   2299    } else {
   2300        p = filename;
   2301        path[0] = '\0';
   2302    }
   2303    q = strrchr(p, '.');
   2304    if (q == NULL) {
   2305        pstrcpy(prefix, buf_len, p);
   2306        postfix[0] = '\0';
   2307    } else {
   2308        if (q - p >= buf_len) {
   2309            return VMDK_ERROR;
   2310        }
   2311        pstrcpy(prefix, q - p + 1, p);
   2312        pstrcpy(postfix, buf_len, q);
   2313    }
   2314    return VMDK_OK;
   2315}
   2316
   2317/*
   2318 * idx == 0: get or create the descriptor file (also the image file if in a
   2319 *           non-split format.
   2320 * idx >= 1: get the n-th extent if in a split subformat
   2321 */
   2322typedef BlockBackend *(*vmdk_create_extent_fn)(int64_t size,
   2323                                               int idx,
   2324                                               bool flat,
   2325                                               bool split,
   2326                                               bool compress,
   2327                                               bool zeroed_grain,
   2328                                               void *opaque,
   2329                                               Error **errp);
   2330
   2331static void vmdk_desc_add_extent(GString *desc,
   2332                                 const char *extent_line_fmt,
   2333                                 int64_t size, const char *filename)
   2334{
   2335    char *basename = g_path_get_basename(filename);
   2336
   2337    g_string_append_printf(desc, extent_line_fmt,
   2338                           DIV_ROUND_UP(size, BDRV_SECTOR_SIZE), basename);
   2339    g_free(basename);
   2340}
   2341
   2342static int coroutine_fn vmdk_co_do_create(int64_t size,
   2343                                          BlockdevVmdkSubformat subformat,
   2344                                          BlockdevVmdkAdapterType adapter_type,
   2345                                          const char *backing_file,
   2346                                          const char *hw_version,
   2347                                          bool compat6,
   2348                                          bool zeroed_grain,
   2349                                          vmdk_create_extent_fn extent_fn,
   2350                                          void *opaque,
   2351                                          Error **errp)
   2352{
   2353    int extent_idx;
   2354    BlockBackend *blk = NULL;
   2355    BlockBackend *extent_blk;
   2356    Error *local_err = NULL;
   2357    char *desc = NULL;
   2358    int ret = 0;
   2359    bool flat, split, compress;
   2360    GString *ext_desc_lines;
   2361    const int64_t split_size = 0x80000000;  /* VMDK has constant split size */
   2362    int64_t extent_size;
   2363    int64_t created_size = 0;
   2364    const char *extent_line_fmt;
   2365    char *parent_desc_line = g_malloc0(BUF_SIZE);
   2366    uint32_t parent_cid = 0xffffffff;
   2367    uint32_t number_heads = 16;
   2368    uint32_t desc_offset = 0, desc_len;
   2369    const char desc_template[] =
   2370        "# Disk DescriptorFile\n"
   2371        "version=1\n"
   2372        "CID=%" PRIx32 "\n"
   2373        "parentCID=%" PRIx32 "\n"
   2374        "createType=\"%s\"\n"
   2375        "%s"
   2376        "\n"
   2377        "# Extent description\n"
   2378        "%s"
   2379        "\n"
   2380        "# The Disk Data Base\n"
   2381        "#DDB\n"
   2382        "\n"
   2383        "ddb.virtualHWVersion = \"%s\"\n"
   2384        "ddb.geometry.cylinders = \"%" PRId64 "\"\n"
   2385        "ddb.geometry.heads = \"%" PRIu32 "\"\n"
   2386        "ddb.geometry.sectors = \"63\"\n"
   2387        "ddb.adapterType = \"%s\"\n";
   2388
   2389    ext_desc_lines = g_string_new(NULL);
   2390
   2391    /* Read out options */
   2392    if (compat6) {
   2393        if (hw_version) {
   2394            error_setg(errp,
   2395                       "compat6 cannot be enabled with hwversion set");
   2396            ret = -EINVAL;
   2397            goto exit;
   2398        }
   2399        hw_version = "6";
   2400    }
   2401    if (!hw_version) {
   2402        hw_version = "4";
   2403    }
   2404
   2405    if (adapter_type != BLOCKDEV_VMDK_ADAPTER_TYPE_IDE) {
   2406        /* that's the number of heads with which vmware operates when
   2407           creating, exporting, etc. vmdk files with a non-ide adapter type */
   2408        number_heads = 255;
   2409    }
   2410    split = (subformat == BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT) ||
   2411            (subformat == BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTSPARSE);
   2412    flat = (subformat == BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICFLAT) ||
   2413           (subformat == BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT);
   2414    compress = subformat == BLOCKDEV_VMDK_SUBFORMAT_STREAMOPTIMIZED;
   2415
   2416    if (flat) {
   2417        extent_line_fmt = "RW %" PRId64 " FLAT \"%s\" 0\n";
   2418    } else {
   2419        extent_line_fmt = "RW %" PRId64 " SPARSE \"%s\"\n";
   2420    }
   2421    if (flat && backing_file) {
   2422        error_setg(errp, "Flat image can't have backing file");
   2423        ret = -ENOTSUP;
   2424        goto exit;
   2425    }
   2426    if (flat && zeroed_grain) {
   2427        error_setg(errp, "Flat image can't enable zeroed grain");
   2428        ret = -ENOTSUP;
   2429        goto exit;
   2430    }
   2431
   2432    /* Create extents */
   2433    if (split) {
   2434        extent_size = split_size;
   2435    } else {
   2436        extent_size = size;
   2437    }
   2438    if (!split && !flat) {
   2439        created_size = extent_size;
   2440    } else {
   2441        created_size = 0;
   2442    }
   2443    /* Get the descriptor file BDS */
   2444    blk = extent_fn(created_size, 0, flat, split, compress, zeroed_grain,
   2445                    opaque, errp);
   2446    if (!blk) {
   2447        ret = -EIO;
   2448        goto exit;
   2449    }
   2450    if (!split && !flat) {
   2451        vmdk_desc_add_extent(ext_desc_lines, extent_line_fmt, created_size,
   2452                             blk_bs(blk)->filename);
   2453    }
   2454
   2455    if (backing_file) {
   2456        BlockBackend *backing;
   2457        char *full_backing =
   2458            bdrv_get_full_backing_filename_from_filename(blk_bs(blk)->filename,
   2459                                                         backing_file,
   2460                                                         &local_err);
   2461        if (local_err) {
   2462            error_propagate(errp, local_err);
   2463            ret = -ENOENT;
   2464            goto exit;
   2465        }
   2466        assert(full_backing);
   2467
   2468        backing = blk_new_open(full_backing, NULL, NULL,
   2469                               BDRV_O_NO_BACKING, errp);
   2470        g_free(full_backing);
   2471        if (backing == NULL) {
   2472            ret = -EIO;
   2473            goto exit;
   2474        }
   2475        if (strcmp(blk_bs(backing)->drv->format_name, "vmdk")) {
   2476            error_setg(errp, "Invalid backing file format: %s. Must be vmdk",
   2477                       blk_bs(backing)->drv->format_name);
   2478            blk_unref(backing);
   2479            ret = -EINVAL;
   2480            goto exit;
   2481        }
   2482        ret = vmdk_read_cid(blk_bs(backing), 0, &parent_cid);
   2483        blk_unref(backing);
   2484        if (ret) {
   2485            error_setg(errp, "Failed to read parent CID");
   2486            goto exit;
   2487        }
   2488        snprintf(parent_desc_line, BUF_SIZE,
   2489                "parentFileNameHint=\"%s\"", backing_file);
   2490    }
   2491    extent_idx = 1;
   2492    while (created_size < size) {
   2493        int64_t cur_size = MIN(size - created_size, extent_size);
   2494        extent_blk = extent_fn(cur_size, extent_idx, flat, split, compress,
   2495                               zeroed_grain, opaque, errp);
   2496        if (!extent_blk) {
   2497            ret = -EINVAL;
   2498            goto exit;
   2499        }
   2500        vmdk_desc_add_extent(ext_desc_lines, extent_line_fmt, cur_size,
   2501                             blk_bs(extent_blk)->filename);
   2502        created_size += cur_size;
   2503        extent_idx++;
   2504        blk_unref(extent_blk);
   2505    }
   2506
   2507    /* Check whether we got excess extents */
   2508    extent_blk = extent_fn(-1, extent_idx, flat, split, compress, zeroed_grain,
   2509                           opaque, NULL);
   2510    if (extent_blk) {
   2511        blk_unref(extent_blk);
   2512        error_setg(errp, "List of extents contains unused extents");
   2513        ret = -EINVAL;
   2514        goto exit;
   2515    }
   2516
   2517    /* generate descriptor file */
   2518    desc = g_strdup_printf(desc_template,
   2519                           g_random_int(),
   2520                           parent_cid,
   2521                           BlockdevVmdkSubformat_str(subformat),
   2522                           parent_desc_line,
   2523                           ext_desc_lines->str,
   2524                           hw_version,
   2525                           size /
   2526                               (int64_t)(63 * number_heads * BDRV_SECTOR_SIZE),
   2527                           number_heads,
   2528                           BlockdevVmdkAdapterType_str(adapter_type));
   2529    desc_len = strlen(desc);
   2530    /* the descriptor offset = 0x200 */
   2531    if (!split && !flat) {
   2532        desc_offset = 0x200;
   2533    }
   2534
   2535    ret = blk_pwrite(blk, desc_offset, desc, desc_len, 0);
   2536    if (ret < 0) {
   2537        error_setg_errno(errp, -ret, "Could not write description");
   2538        goto exit;
   2539    }
   2540    /* bdrv_pwrite write padding zeros to align to sector, we don't need that
   2541     * for description file */
   2542    if (desc_offset == 0) {
   2543        ret = blk_truncate(blk, desc_len, false, PREALLOC_MODE_OFF, 0, errp);
   2544        if (ret < 0) {
   2545            goto exit;
   2546        }
   2547    }
   2548    ret = 0;
   2549exit:
   2550    if (blk) {
   2551        blk_unref(blk);
   2552    }
   2553    g_free(desc);
   2554    g_free(parent_desc_line);
   2555    g_string_free(ext_desc_lines, true);
   2556    return ret;
   2557}
   2558
   2559typedef struct {
   2560    char *path;
   2561    char *prefix;
   2562    char *postfix;
   2563    QemuOpts *opts;
   2564} VMDKCreateOptsData;
   2565
   2566static BlockBackend *vmdk_co_create_opts_cb(int64_t size, int idx,
   2567                                            bool flat, bool split, bool compress,
   2568                                            bool zeroed_grain, void *opaque,
   2569                                            Error **errp)
   2570{
   2571    BlockBackend *blk = NULL;
   2572    BlockDriverState *bs = NULL;
   2573    VMDKCreateOptsData *data = opaque;
   2574    char *ext_filename = NULL;
   2575    char *rel_filename = NULL;
   2576
   2577    /* We're done, don't create excess extents. */
   2578    if (size == -1) {
   2579        assert(errp == NULL);
   2580        return NULL;
   2581    }
   2582
   2583    if (idx == 0) {
   2584        rel_filename = g_strdup_printf("%s%s", data->prefix, data->postfix);
   2585    } else if (split) {
   2586        rel_filename = g_strdup_printf("%s-%c%03d%s",
   2587                                       data->prefix,
   2588                                       flat ? 'f' : 's', idx, data->postfix);
   2589    } else {
   2590        assert(idx == 1);
   2591        rel_filename = g_strdup_printf("%s-flat%s", data->prefix, data->postfix);
   2592    }
   2593
   2594    ext_filename = g_strdup_printf("%s%s", data->path, rel_filename);
   2595    g_free(rel_filename);
   2596
   2597    if (vmdk_create_extent(ext_filename, size,
   2598                           flat, compress, zeroed_grain, &blk, data->opts,
   2599                           errp)) {
   2600        goto exit;
   2601    }
   2602    bdrv_unref(bs);
   2603exit:
   2604    g_free(ext_filename);
   2605    return blk;
   2606}
   2607
   2608static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
   2609                                            const char *filename,
   2610                                            QemuOpts *opts,
   2611                                            Error **errp)
   2612{
   2613    Error *local_err = NULL;
   2614    char *desc = NULL;
   2615    int64_t total_size = 0;
   2616    char *adapter_type = NULL;
   2617    BlockdevVmdkAdapterType adapter_type_enum;
   2618    char *backing_file = NULL;
   2619    char *hw_version = NULL;
   2620    char *fmt = NULL;
   2621    BlockdevVmdkSubformat subformat;
   2622    int ret = 0;
   2623    char *path = g_malloc0(PATH_MAX);
   2624    char *prefix = g_malloc0(PATH_MAX);
   2625    char *postfix = g_malloc0(PATH_MAX);
   2626    char *desc_line = g_malloc0(BUF_SIZE);
   2627    char *ext_filename = g_malloc0(PATH_MAX);
   2628    char *desc_filename = g_malloc0(PATH_MAX);
   2629    char *parent_desc_line = g_malloc0(BUF_SIZE);
   2630    bool zeroed_grain;
   2631    bool compat6;
   2632    VMDKCreateOptsData data;
   2633    char *backing_fmt = NULL;
   2634
   2635    backing_fmt = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FMT);
   2636    if (backing_fmt && strcmp(backing_fmt, "vmdk") != 0) {
   2637        error_setg(errp, "backing_file must be a vmdk image");
   2638        ret = -EINVAL;
   2639        goto exit;
   2640    }
   2641
   2642    if (filename_decompose(filename, path, prefix, postfix, PATH_MAX, errp)) {
   2643        ret = -EINVAL;
   2644        goto exit;
   2645    }
   2646    /* Read out options */
   2647    total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
   2648                          BDRV_SECTOR_SIZE);
   2649    adapter_type = qemu_opt_get_del(opts, BLOCK_OPT_ADAPTER_TYPE);
   2650    backing_file = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE);
   2651    hw_version = qemu_opt_get_del(opts, BLOCK_OPT_HWVERSION);
   2652    compat6 = qemu_opt_get_bool_del(opts, BLOCK_OPT_COMPAT6, false);
   2653    if (strcmp(hw_version, "undefined") == 0) {
   2654        g_free(hw_version);
   2655        hw_version = NULL;
   2656    }
   2657    fmt = qemu_opt_get_del(opts, BLOCK_OPT_SUBFMT);
   2658    zeroed_grain = qemu_opt_get_bool_del(opts, BLOCK_OPT_ZEROED_GRAIN, false);
   2659
   2660    if (adapter_type) {
   2661        adapter_type_enum = qapi_enum_parse(&BlockdevVmdkAdapterType_lookup,
   2662                                            adapter_type,
   2663                                            BLOCKDEV_VMDK_ADAPTER_TYPE_IDE,
   2664                                            &local_err);
   2665        if (local_err) {
   2666            error_propagate(errp, local_err);
   2667            ret = -EINVAL;
   2668            goto exit;
   2669        }
   2670    } else {
   2671        adapter_type_enum = BLOCKDEV_VMDK_ADAPTER_TYPE_IDE;
   2672    }
   2673
   2674    if (!fmt) {
   2675        /* Default format to monolithicSparse */
   2676        subformat = BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICSPARSE;
   2677    } else {
   2678        subformat = qapi_enum_parse(&BlockdevVmdkSubformat_lookup,
   2679                                    fmt,
   2680                                    BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICSPARSE,
   2681                                    &local_err);
   2682        if (local_err) {
   2683            error_propagate(errp, local_err);
   2684            ret = -EINVAL;
   2685            goto exit;
   2686        }
   2687    }
   2688    data = (VMDKCreateOptsData){
   2689        .prefix = prefix,
   2690        .postfix = postfix,
   2691        .path = path,
   2692        .opts = opts,
   2693    };
   2694    ret = vmdk_co_do_create(total_size, subformat, adapter_type_enum,
   2695                            backing_file, hw_version, compat6, zeroed_grain,
   2696                            vmdk_co_create_opts_cb, &data, errp);
   2697
   2698exit:
   2699    g_free(backing_fmt);
   2700    g_free(adapter_type);
   2701    g_free(backing_file);
   2702    g_free(hw_version);
   2703    g_free(fmt);
   2704    g_free(desc);
   2705    g_free(path);
   2706    g_free(prefix);
   2707    g_free(postfix);
   2708    g_free(desc_line);
   2709    g_free(ext_filename);
   2710    g_free(desc_filename);
   2711    g_free(parent_desc_line);
   2712    return ret;
   2713}
   2714
   2715static BlockBackend *vmdk_co_create_cb(int64_t size, int idx,
   2716                                       bool flat, bool split, bool compress,
   2717                                       bool zeroed_grain, void *opaque,
   2718                                       Error **errp)
   2719{
   2720    int ret;
   2721    BlockDriverState *bs;
   2722    BlockBackend *blk;
   2723    BlockdevCreateOptionsVmdk *opts = opaque;
   2724
   2725    if (idx == 0) {
   2726        bs = bdrv_open_blockdev_ref(opts->file, errp);
   2727    } else {
   2728        int i;
   2729        BlockdevRefList *list = opts->extents;
   2730        for (i = 1; i < idx; i++) {
   2731            if (!list || !list->next) {
   2732                error_setg(errp, "Extent [%d] not specified", i);
   2733                return NULL;
   2734            }
   2735            list = list->next;
   2736        }
   2737        if (!list) {
   2738            error_setg(errp, "Extent [%d] not specified", idx - 1);
   2739            return NULL;
   2740        }
   2741        bs = bdrv_open_blockdev_ref(list->value, errp);
   2742    }
   2743    if (!bs) {
   2744        return NULL;
   2745    }
   2746    blk = blk_new_with_bs(bs,
   2747                          BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE | BLK_PERM_RESIZE,
   2748                          BLK_PERM_ALL, errp);
   2749    if (!blk) {
   2750        return NULL;
   2751    }
   2752    blk_set_allow_write_beyond_eof(blk, true);
   2753    bdrv_unref(bs);
   2754
   2755    if (size != -1) {
   2756        ret = vmdk_init_extent(blk, size, flat, compress, zeroed_grain, errp);
   2757        if (ret) {
   2758            blk_unref(blk);
   2759            blk = NULL;
   2760        }
   2761    }
   2762    return blk;
   2763}
   2764
   2765static int coroutine_fn vmdk_co_create(BlockdevCreateOptions *create_options,
   2766                                       Error **errp)
   2767{
   2768    int ret;
   2769    BlockdevCreateOptionsVmdk *opts;
   2770
   2771    opts = &create_options->u.vmdk;
   2772
   2773    /* Validate options */
   2774    if (!QEMU_IS_ALIGNED(opts->size, BDRV_SECTOR_SIZE)) {
   2775        error_setg(errp, "Image size must be a multiple of 512 bytes");
   2776        ret = -EINVAL;
   2777        goto out;
   2778    }
   2779
   2780    ret = vmdk_co_do_create(opts->size,
   2781                            opts->subformat,
   2782                            opts->adapter_type,
   2783                            opts->backing_file,
   2784                            opts->hwversion,
   2785                            false,
   2786                            opts->zeroed_grain,
   2787                            vmdk_co_create_cb,
   2788                            opts, errp);
   2789    return ret;
   2790
   2791out:
   2792    return ret;
   2793}
   2794
   2795static void vmdk_close(BlockDriverState *bs)
   2796{
   2797    BDRVVmdkState *s = bs->opaque;
   2798
   2799    vmdk_free_extents(bs);
   2800    g_free(s->create_type);
   2801
   2802    migrate_del_blocker(s->migration_blocker);
   2803    error_free(s->migration_blocker);
   2804}
   2805
   2806static int64_t vmdk_get_allocated_file_size(BlockDriverState *bs)
   2807{
   2808    int i;
   2809    int64_t ret = 0;
   2810    int64_t r;
   2811    BDRVVmdkState *s = bs->opaque;
   2812
   2813    ret = bdrv_get_allocated_file_size(bs->file->bs);
   2814    if (ret < 0) {
   2815        return ret;
   2816    }
   2817    for (i = 0; i < s->num_extents; i++) {
   2818        if (s->extents[i].file == bs->file) {
   2819            continue;
   2820        }
   2821        r = bdrv_get_allocated_file_size(s->extents[i].file->bs);
   2822        if (r < 0) {
   2823            return r;
   2824        }
   2825        ret += r;
   2826    }
   2827    return ret;
   2828}
   2829
   2830static int vmdk_has_zero_init(BlockDriverState *bs)
   2831{
   2832    int i;
   2833    BDRVVmdkState *s = bs->opaque;
   2834
   2835    /* If has a flat extent and its underlying storage doesn't have zero init,
   2836     * return 0. */
   2837    for (i = 0; i < s->num_extents; i++) {
   2838        if (s->extents[i].flat) {
   2839            if (!bdrv_has_zero_init(s->extents[i].file->bs)) {
   2840                return 0;
   2841            }
   2842        }
   2843    }
   2844    return 1;
   2845}
   2846
   2847static ImageInfo *vmdk_get_extent_info(VmdkExtent *extent)
   2848{
   2849    ImageInfo *info = g_new0(ImageInfo, 1);
   2850
   2851    bdrv_refresh_filename(extent->file->bs);
   2852    *info = (ImageInfo){
   2853        .filename         = g_strdup(extent->file->bs->filename),
   2854        .format           = g_strdup(extent->type),
   2855        .virtual_size     = extent->sectors * BDRV_SECTOR_SIZE,
   2856        .compressed       = extent->compressed,
   2857        .has_compressed   = extent->compressed,
   2858        .cluster_size     = extent->cluster_sectors * BDRV_SECTOR_SIZE,
   2859        .has_cluster_size = !extent->flat,
   2860    };
   2861
   2862    return info;
   2863}
   2864
   2865static int coroutine_fn vmdk_co_check(BlockDriverState *bs,
   2866                                      BdrvCheckResult *result,
   2867                                      BdrvCheckMode fix)
   2868{
   2869    BDRVVmdkState *s = bs->opaque;
   2870    VmdkExtent *extent = NULL;
   2871    int64_t sector_num = 0;
   2872    int64_t total_sectors = bdrv_nb_sectors(bs);
   2873    int ret;
   2874    uint64_t cluster_offset;
   2875
   2876    if (fix) {
   2877        return -ENOTSUP;
   2878    }
   2879
   2880    for (;;) {
   2881        if (sector_num >= total_sectors) {
   2882            return 0;
   2883        }
   2884        extent = find_extent(s, sector_num, extent);
   2885        if (!extent) {
   2886            fprintf(stderr,
   2887                    "ERROR: could not find extent for sector %" PRId64 "\n",
   2888                    sector_num);
   2889            ret = -EINVAL;
   2890            break;
   2891        }
   2892        ret = get_cluster_offset(bs, extent, NULL,
   2893                                 sector_num << BDRV_SECTOR_BITS,
   2894                                 false, &cluster_offset, 0, 0);
   2895        if (ret == VMDK_ERROR) {
   2896            fprintf(stderr,
   2897                    "ERROR: could not get cluster_offset for sector %"
   2898                    PRId64 "\n", sector_num);
   2899            break;
   2900        }
   2901        if (ret == VMDK_OK) {
   2902            int64_t extent_len = bdrv_getlength(extent->file->bs);
   2903            if (extent_len < 0) {
   2904                fprintf(stderr,
   2905                        "ERROR: could not get extent file length for sector %"
   2906                        PRId64 "\n", sector_num);
   2907                ret = extent_len;
   2908                break;
   2909            }
   2910            if (cluster_offset >= extent_len) {
   2911                fprintf(stderr,
   2912                        "ERROR: cluster offset for sector %"
   2913                        PRId64 " points after EOF\n", sector_num);
   2914                ret = -EINVAL;
   2915                break;
   2916            }
   2917        }
   2918        sector_num += extent->cluster_sectors;
   2919    }
   2920
   2921    result->corruptions++;
   2922    return ret;
   2923}
   2924
   2925static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs,
   2926                                                 Error **errp)
   2927{
   2928    int i;
   2929    BDRVVmdkState *s = bs->opaque;
   2930    ImageInfoSpecific *spec_info = g_new0(ImageInfoSpecific, 1);
   2931    ImageInfoList **tail;
   2932
   2933    *spec_info = (ImageInfoSpecific){
   2934        .type = IMAGE_INFO_SPECIFIC_KIND_VMDK,
   2935        .u = {
   2936            .vmdk.data = g_new0(ImageInfoSpecificVmdk, 1),
   2937        },
   2938    };
   2939
   2940    *spec_info->u.vmdk.data = (ImageInfoSpecificVmdk) {
   2941        .create_type = g_strdup(s->create_type),
   2942        .cid = s->cid,
   2943        .parent_cid = s->parent_cid,
   2944    };
   2945
   2946    tail = &spec_info->u.vmdk.data->extents;
   2947    for (i = 0; i < s->num_extents; i++) {
   2948        QAPI_LIST_APPEND(tail, vmdk_get_extent_info(&s->extents[i]));
   2949    }
   2950
   2951    return spec_info;
   2952}
   2953
   2954static bool vmdk_extents_type_eq(const VmdkExtent *a, const VmdkExtent *b)
   2955{
   2956    return a->flat == b->flat &&
   2957           a->compressed == b->compressed &&
   2958           (a->flat || a->cluster_sectors == b->cluster_sectors);
   2959}
   2960
   2961static int vmdk_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
   2962{
   2963    int i;
   2964    BDRVVmdkState *s = bs->opaque;
   2965    assert(s->num_extents);
   2966
   2967    /* See if we have multiple extents but they have different cases */
   2968    for (i = 1; i < s->num_extents; i++) {
   2969        if (!vmdk_extents_type_eq(&s->extents[0], &s->extents[i])) {
   2970            return -ENOTSUP;
   2971        }
   2972    }
   2973    bdi->needs_compressed_writes = s->extents[0].compressed;
   2974    if (!s->extents[0].flat) {
   2975        bdi->cluster_size = s->extents[0].cluster_sectors << BDRV_SECTOR_BITS;
   2976    }
   2977    return 0;
   2978}
   2979
   2980static void vmdk_gather_child_options(BlockDriverState *bs, QDict *target,
   2981                                      bool backing_overridden)
   2982{
   2983    /* No children but file and backing can be explicitly specified (TODO) */
   2984    qdict_put(target, "file",
   2985              qobject_ref(bs->file->bs->full_open_options));
   2986
   2987    if (backing_overridden) {
   2988        if (bs->backing) {
   2989            qdict_put(target, "backing",
   2990                      qobject_ref(bs->backing->bs->full_open_options));
   2991        } else {
   2992            qdict_put_null(target, "backing");
   2993        }
   2994    }
   2995}
   2996
   2997static QemuOptsList vmdk_create_opts = {
   2998    .name = "vmdk-create-opts",
   2999    .head = QTAILQ_HEAD_INITIALIZER(vmdk_create_opts.head),
   3000    .desc = {
   3001        {
   3002            .name = BLOCK_OPT_SIZE,
   3003            .type = QEMU_OPT_SIZE,
   3004            .help = "Virtual disk size"
   3005        },
   3006        {
   3007            .name = BLOCK_OPT_ADAPTER_TYPE,
   3008            .type = QEMU_OPT_STRING,
   3009            .help = "Virtual adapter type, can be one of "
   3010                    "ide (default), lsilogic, buslogic or legacyESX"
   3011        },
   3012        {
   3013            .name = BLOCK_OPT_BACKING_FILE,
   3014            .type = QEMU_OPT_STRING,
   3015            .help = "File name of a base image"
   3016        },
   3017        {
   3018            .name = BLOCK_OPT_BACKING_FMT,
   3019            .type = QEMU_OPT_STRING,
   3020            .help = "Must be 'vmdk' if present",
   3021        },
   3022        {
   3023            .name = BLOCK_OPT_COMPAT6,
   3024            .type = QEMU_OPT_BOOL,
   3025            .help = "VMDK version 6 image",
   3026            .def_value_str = "off"
   3027        },
   3028        {
   3029            .name = BLOCK_OPT_HWVERSION,
   3030            .type = QEMU_OPT_STRING,
   3031            .help = "VMDK hardware version",
   3032            .def_value_str = "undefined"
   3033        },
   3034        {
   3035            .name = BLOCK_OPT_SUBFMT,
   3036            .type = QEMU_OPT_STRING,
   3037            .help =
   3038                "VMDK flat extent format, can be one of "
   3039                "{monolithicSparse (default) | monolithicFlat | twoGbMaxExtentSparse | twoGbMaxExtentFlat | streamOptimized} "
   3040        },
   3041        {
   3042            .name = BLOCK_OPT_ZEROED_GRAIN,
   3043            .type = QEMU_OPT_BOOL,
   3044            .help = "Enable efficient zero writes "
   3045                    "using the zeroed-grain GTE feature"
   3046        },
   3047        { /* end of list */ }
   3048    }
   3049};
   3050
   3051static BlockDriver bdrv_vmdk = {
   3052    .format_name                  = "vmdk",
   3053    .instance_size                = sizeof(BDRVVmdkState),
   3054    .bdrv_probe                   = vmdk_probe,
   3055    .bdrv_open                    = vmdk_open,
   3056    .bdrv_co_check                = vmdk_co_check,
   3057    .bdrv_reopen_prepare          = vmdk_reopen_prepare,
   3058    .bdrv_child_perm              = bdrv_default_perms,
   3059    .bdrv_co_preadv               = vmdk_co_preadv,
   3060    .bdrv_co_pwritev              = vmdk_co_pwritev,
   3061    .bdrv_co_pwritev_compressed   = vmdk_co_pwritev_compressed,
   3062    .bdrv_co_pwrite_zeroes        = vmdk_co_pwrite_zeroes,
   3063    .bdrv_close                   = vmdk_close,
   3064    .bdrv_co_create_opts          = vmdk_co_create_opts,
   3065    .bdrv_co_create               = vmdk_co_create,
   3066    .bdrv_co_block_status         = vmdk_co_block_status,
   3067    .bdrv_get_allocated_file_size = vmdk_get_allocated_file_size,
   3068    .bdrv_has_zero_init           = vmdk_has_zero_init,
   3069    .bdrv_get_specific_info       = vmdk_get_specific_info,
   3070    .bdrv_refresh_limits          = vmdk_refresh_limits,
   3071    .bdrv_get_info                = vmdk_get_info,
   3072    .bdrv_gather_child_options    = vmdk_gather_child_options,
   3073
   3074    .is_format                    = true,
   3075    .supports_backing             = true,
   3076    .create_opts                  = &vmdk_create_opts,
   3077};
   3078
   3079static void bdrv_vmdk_init(void)
   3080{
   3081    bdrv_register(&bdrv_vmdk);
   3082}
   3083
   3084block_init(bdrv_vmdk_init);