qemu/block/vmdk.c
<<
>>
Prefs
   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    int valid;
 184    uint32_t *l2_cache_entry;
 185} VmdkMetaData;
 186
 187typedef struct VmdkGrainMarker {
 188    uint64_t lba;
 189    uint32_t size;
 190    uint8_t  data[0];
 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;
 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;
 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;
 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            break;
1057        case VMDK4_MAGIC:
1058            return vmdk_open_vmdk4(bs, file, flags, options, errp);
1059            break;
1060        default:
1061            error_setg(errp, "Image not in VMDK format");
1062            return -EINVAL;
1063            break;
1064    }
1065}
1066
1067static const char *next_line(const char *s)
1068{
1069    while (*s) {
1070        if (*s == '\n') {
1071            return s + 1;
1072        }
1073        s++;
1074    }
1075    return s;
1076}
1077
1078static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
1079                              QDict *options, Error **errp)
1080{
1081    int ret;
1082    int matches;
1083    char access[11];
1084    char type[11];
1085    char fname[512];
1086    const char *p, *np;
1087    int64_t sectors = 0;
1088    int64_t flat_offset;
1089    char *desc_file_dir = NULL;
1090    char *extent_path;
1091    BdrvChild *extent_file;
1092    BDRVVmdkState *s = bs->opaque;
1093    VmdkExtent *extent;
1094    char extent_opt_prefix[32];
1095    Error *local_err = NULL;
1096
1097    for (p = desc; *p; p = next_line(p)) {
1098        /* parse extent line in one of below formats:
1099         *
1100         * RW [size in sectors] FLAT "file-name.vmdk" OFFSET
1101         * RW [size in sectors] SPARSE "file-name.vmdk"
1102         * RW [size in sectors] VMFS "file-name.vmdk"
1103         * RW [size in sectors] VMFSSPARSE "file-name.vmdk"
1104         * RW [size in sectors] SESPARSE "file-name.vmdk"
1105         */
1106        flat_offset = -1;
1107        matches = sscanf(p, "%10s %" SCNd64 " %10s \"%511[^\n\r\"]\" %" SCNd64,
1108                         access, &sectors, type, fname, &flat_offset);
1109        if (matches < 4 || strcmp(access, "RW")) {
1110            continue;
1111        } else if (!strcmp(type, "FLAT")) {
1112            if (matches != 5 || flat_offset < 0) {
1113                goto invalid;
1114            }
1115        } else if (!strcmp(type, "VMFS")) {
1116            if (matches == 4) {
1117                flat_offset = 0;
1118            } else {
1119                goto invalid;
1120            }
1121        } else if (matches != 4) {
1122            goto invalid;
1123        }
1124
1125        if (sectors <= 0 ||
1126            (strcmp(type, "FLAT") && strcmp(type, "SPARSE") &&
1127             strcmp(type, "VMFS") && strcmp(type, "VMFSSPARSE") &&
1128             strcmp(type, "SESPARSE")) ||
1129            (strcmp(access, "RW"))) {
1130            continue;
1131        }
1132
1133        if (path_is_absolute(fname)) {
1134            extent_path = g_strdup(fname);
1135        } else {
1136            if (!desc_file_dir) {
1137                desc_file_dir = bdrv_dirname(bs->file->bs, errp);
1138                if (!desc_file_dir) {
1139                    bdrv_refresh_filename(bs->file->bs);
1140                    error_prepend(errp, "Cannot use relative paths with VMDK "
1141                                  "descriptor file '%s': ",
1142                                  bs->file->bs->filename);
1143                    ret = -EINVAL;
1144                    goto out;
1145                }
1146            }
1147
1148            extent_path = g_strconcat(desc_file_dir, fname, NULL);
1149        }
1150
1151        ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
1152        assert(ret < 32);
1153
1154        extent_file = bdrv_open_child(extent_path, options, extent_opt_prefix,
1155                                      bs, &child_file, false, &local_err);
1156        g_free(extent_path);
1157        if (local_err) {
1158            error_propagate(errp, local_err);
1159            ret = -EINVAL;
1160            goto out;
1161        }
1162
1163        /* save to extents array */
1164        if (!strcmp(type, "FLAT") || !strcmp(type, "VMFS")) {
1165            /* FLAT extent */
1166
1167            ret = vmdk_add_extent(bs, extent_file, true, sectors,
1168                            0, 0, 0, 0, 0, &extent, errp);
1169            if (ret < 0) {
1170                bdrv_unref_child(bs, extent_file);
1171                goto out;
1172            }
1173            extent->flat_start_offset = flat_offset << 9;
1174        } else if (!strcmp(type, "SPARSE") || !strcmp(type, "VMFSSPARSE")) {
1175            /* SPARSE extent and VMFSSPARSE extent are both "COWD" sparse file*/
1176            char *buf = vmdk_read_desc(extent_file, 0, errp);
1177            if (!buf) {
1178                ret = -EINVAL;
1179            } else {
1180                ret = vmdk_open_sparse(bs, extent_file, bs->open_flags, buf,
1181                                       options, errp);
1182            }
1183            g_free(buf);
1184            if (ret) {
1185                bdrv_unref_child(bs, extent_file);
1186                goto out;
1187            }
1188            extent = &s->extents[s->num_extents - 1];
1189        } else if (!strcmp(type, "SESPARSE")) {
1190            ret = vmdk_open_se_sparse(bs, extent_file, bs->open_flags, errp);
1191            if (ret) {
1192                bdrv_unref_child(bs, extent_file);
1193                goto out;
1194            }
1195            extent = &s->extents[s->num_extents - 1];
1196        } else {
1197            error_setg(errp, "Unsupported extent type '%s'", type);
1198            bdrv_unref_child(bs, extent_file);
1199            ret = -ENOTSUP;
1200            goto out;
1201        }
1202        extent->type = g_strdup(type);
1203    }
1204
1205    ret = 0;
1206    goto out;
1207
1208invalid:
1209    np = next_line(p);
1210    assert(np != p);
1211    if (np[-1] == '\n') {
1212        np--;
1213    }
1214    error_setg(errp, "Invalid extent line: %.*s", (int)(np - p), p);
1215    ret = -EINVAL;
1216
1217out:
1218    g_free(desc_file_dir);
1219    return ret;
1220}
1221
1222static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
1223                               QDict *options, Error **errp)
1224{
1225    int ret;
1226    char ct[128];
1227    BDRVVmdkState *s = bs->opaque;
1228
1229    if (vmdk_parse_description(buf, "createType", ct, sizeof(ct))) {
1230        error_setg(errp, "invalid VMDK image descriptor");
1231        ret = -EINVAL;
1232        goto exit;
1233    }
1234    if (strcmp(ct, "monolithicFlat") &&
1235        strcmp(ct, "vmfs") &&
1236        strcmp(ct, "vmfsSparse") &&
1237        strcmp(ct, "seSparse") &&
1238        strcmp(ct, "twoGbMaxExtentSparse") &&
1239        strcmp(ct, "twoGbMaxExtentFlat")) {
1240        error_setg(errp, "Unsupported image type '%s'", ct);
1241        ret = -ENOTSUP;
1242        goto exit;
1243    }
1244    s->create_type = g_strdup(ct);
1245    s->desc_offset = 0;
1246    ret = vmdk_parse_extents(buf, bs, options, errp);
1247exit:
1248    return ret;
1249}
1250
1251static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
1252                     Error **errp)
1253{
1254    char *buf;
1255    int ret;
1256    BDRVVmdkState *s = bs->opaque;
1257    uint32_t magic;
1258    Error *local_err = NULL;
1259
1260    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
1261                               false, errp);
1262    if (!bs->file) {
1263        return -EINVAL;
1264    }
1265
1266    buf = vmdk_read_desc(bs->file, 0, errp);
1267    if (!buf) {
1268        return -EINVAL;
1269    }
1270
1271    magic = ldl_be_p(buf);
1272    switch (magic) {
1273        case VMDK3_MAGIC:
1274        case VMDK4_MAGIC:
1275            ret = vmdk_open_sparse(bs, bs->file, flags, buf, options,
1276                                   errp);
1277            s->desc_offset = 0x200;
1278            break;
1279        default:
1280            ret = vmdk_open_desc_file(bs, flags, buf, options, errp);
1281            break;
1282    }
1283    if (ret) {
1284        goto fail;
1285    }
1286
1287    /* try to open parent images, if exist */
1288    ret = vmdk_parent_open(bs);
1289    if (ret) {
1290        goto fail;
1291    }
1292    ret = vmdk_read_cid(bs, 0, &s->cid);
1293    if (ret) {
1294        goto fail;
1295    }
1296    ret = vmdk_read_cid(bs, 1, &s->parent_cid);
1297    if (ret) {
1298        goto fail;
1299    }
1300    qemu_co_mutex_init(&s->lock);
1301
1302    /* Disable migration when VMDK images are used */
1303    error_setg(&s->migration_blocker, "The vmdk format used by node '%s' "
1304               "does not support live migration",
1305               bdrv_get_device_or_node_name(bs));
1306    ret = migrate_add_blocker(s->migration_blocker, &local_err);
1307    if (local_err) {
1308        error_propagate(errp, local_err);
1309        error_free(s->migration_blocker);
1310        goto fail;
1311    }
1312
1313    g_free(buf);
1314    return 0;
1315
1316fail:
1317    g_free(buf);
1318    g_free(s->create_type);
1319    s->create_type = NULL;
1320    vmdk_free_extents(bs);
1321    return ret;
1322}
1323
1324
1325static void vmdk_refresh_limits(BlockDriverState *bs, Error **errp)
1326{
1327    BDRVVmdkState *s = bs->opaque;
1328    int i;
1329
1330    for (i = 0; i < s->num_extents; i++) {
1331        if (!s->extents[i].flat) {
1332            bs->bl.pwrite_zeroes_alignment =
1333                MAX(bs->bl.pwrite_zeroes_alignment,
1334                    s->extents[i].cluster_sectors << BDRV_SECTOR_BITS);
1335        }
1336    }
1337}
1338
1339/**
1340 * get_whole_cluster
1341 *
1342 * Copy backing file's cluster that covers @sector_num, otherwise write zero,
1343 * to the cluster at @cluster_sector_num.
1344 *
1345 * If @skip_start_sector < @skip_end_sector, the relative range
1346 * [@skip_start_sector, @skip_end_sector) is not copied or written, and leave
1347 * it for call to write user data in the request.
1348 */
1349static int get_whole_cluster(BlockDriverState *bs,
1350                             VmdkExtent *extent,
1351                             uint64_t cluster_offset,
1352                             uint64_t offset,
1353                             uint64_t skip_start_bytes,
1354                             uint64_t skip_end_bytes)
1355{
1356    int ret = VMDK_OK;
1357    int64_t cluster_bytes;
1358    uint8_t *whole_grain;
1359
1360    /* For COW, align request sector_num to cluster start */
1361    cluster_bytes = extent->cluster_sectors << BDRV_SECTOR_BITS;
1362    offset = QEMU_ALIGN_DOWN(offset, cluster_bytes);
1363    whole_grain = qemu_blockalign(bs, cluster_bytes);
1364
1365    if (!bs->backing) {
1366        memset(whole_grain, 0, skip_start_bytes);
1367        memset(whole_grain + skip_end_bytes, 0, cluster_bytes - skip_end_bytes);
1368    }
1369
1370    assert(skip_end_bytes <= cluster_bytes);
1371    /* we will be here if it's first write on non-exist grain(cluster).
1372     * try to read from parent image, if exist */
1373    if (bs->backing && !vmdk_is_cid_valid(bs)) {
1374        ret = VMDK_ERROR;
1375        goto exit;
1376    }
1377
1378    /* Read backing data before skip range */
1379    if (skip_start_bytes > 0) {
1380        if (bs->backing) {
1381            /* qcow2 emits this on bs->file instead of bs->backing */
1382            BLKDBG_EVENT(extent->file, BLKDBG_COW_READ);
1383            ret = bdrv_pread(bs->backing, offset, whole_grain,
1384                             skip_start_bytes);
1385            if (ret < 0) {
1386                ret = VMDK_ERROR;
1387                goto exit;
1388            }
1389        }
1390        BLKDBG_EVENT(extent->file, BLKDBG_COW_WRITE);
1391        ret = bdrv_pwrite(extent->file, cluster_offset, whole_grain,
1392                          skip_start_bytes);
1393        if (ret < 0) {
1394            ret = VMDK_ERROR;
1395            goto exit;
1396        }
1397    }
1398    /* Read backing data after skip range */
1399    if (skip_end_bytes < cluster_bytes) {
1400        if (bs->backing) {
1401            /* qcow2 emits this on bs->file instead of bs->backing */
1402            BLKDBG_EVENT(extent->file, BLKDBG_COW_READ);
1403            ret = bdrv_pread(bs->backing, offset + skip_end_bytes,
1404                             whole_grain + skip_end_bytes,
1405                             cluster_bytes - skip_end_bytes);
1406            if (ret < 0) {
1407                ret = VMDK_ERROR;
1408                goto exit;
1409            }
1410        }
1411        BLKDBG_EVENT(extent->file, BLKDBG_COW_WRITE);
1412        ret = bdrv_pwrite(extent->file, cluster_offset + skip_end_bytes,
1413                          whole_grain + skip_end_bytes,
1414                          cluster_bytes - skip_end_bytes);
1415        if (ret < 0) {
1416            ret = VMDK_ERROR;
1417            goto exit;
1418        }
1419    }
1420
1421    ret = VMDK_OK;
1422exit:
1423    qemu_vfree(whole_grain);
1424    return ret;
1425}
1426
1427static int vmdk_L2update(VmdkExtent *extent, VmdkMetaData *m_data,
1428                         uint32_t offset)
1429{
1430    offset = cpu_to_le32(offset);
1431    /* update L2 table */
1432    BLKDBG_EVENT(extent->file, BLKDBG_L2_UPDATE);
1433    if (bdrv_pwrite_sync(extent->file,
1434                ((int64_t)m_data->l2_offset * 512)
1435                    + (m_data->l2_index * sizeof(offset)),
1436                &offset, sizeof(offset)) < 0) {
1437        return VMDK_ERROR;
1438    }
1439    /* update backup L2 table */
1440    if (extent->l1_backup_table_offset != 0) {
1441        m_data->l2_offset = extent->l1_backup_table[m_data->l1_index];
1442        if (bdrv_pwrite_sync(extent->file,
1443                    ((int64_t)m_data->l2_offset * 512)
1444                        + (m_data->l2_index * sizeof(offset)),
1445                    &offset, sizeof(offset)) < 0) {
1446            return VMDK_ERROR;
1447        }
1448    }
1449    if (m_data->l2_cache_entry) {
1450        *m_data->l2_cache_entry = offset;
1451    }
1452
1453    return VMDK_OK;
1454}
1455
1456/**
1457 * get_cluster_offset
1458 *
1459 * Look up cluster offset in extent file by sector number, and store in
1460 * @cluster_offset.
1461 *
1462 * For flat extents, the start offset as parsed from the description file is
1463 * returned.
1464 *
1465 * For sparse extents, look up in L1, L2 table. If allocate is true, return an
1466 * offset for a new cluster and update L2 cache. If there is a backing file,
1467 * COW is done before returning; otherwise, zeroes are written to the allocated
1468 * cluster. Both COW and zero writing skips the sector range
1469 * [@skip_start_sector, @skip_end_sector) passed in by caller, because caller
1470 * has new data to write there.
1471 *
1472 * Returns: VMDK_OK if cluster exists and mapped in the image.
1473 *          VMDK_UNALLOC if cluster is not mapped and @allocate is false.
1474 *          VMDK_ERROR if failed.
1475 */
1476static int get_cluster_offset(BlockDriverState *bs,
1477                              VmdkExtent *extent,
1478                              VmdkMetaData *m_data,
1479                              uint64_t offset,
1480                              bool allocate,
1481                              uint64_t *cluster_offset,
1482                              uint64_t skip_start_bytes,
1483                              uint64_t skip_end_bytes)
1484{
1485    unsigned int l1_index, l2_offset, l2_index;
1486    int min_index, i, j;
1487    uint32_t min_count;
1488    void *l2_table;
1489    bool zeroed = false;
1490    int64_t ret;
1491    int64_t cluster_sector;
1492    unsigned int l2_size_bytes = extent->l2_size * extent->entry_size;
1493
1494    if (m_data) {
1495        m_data->valid = 0;
1496    }
1497    if (extent->flat) {
1498        *cluster_offset = extent->flat_start_offset;
1499        return VMDK_OK;
1500    }
1501
1502    offset -= (extent->end_sector - extent->sectors) * SECTOR_SIZE;
1503    l1_index = (offset >> 9) / extent->l1_entry_sectors;
1504    if (l1_index >= extent->l1_size) {
1505        return VMDK_ERROR;
1506    }
1507    if (extent->sesparse) {
1508        uint64_t l2_offset_u64;
1509
1510        assert(extent->entry_size == sizeof(uint64_t));
1511
1512        l2_offset_u64 = ((uint64_t *)extent->l1_table)[l1_index];
1513        if (l2_offset_u64 == 0) {
1514            l2_offset = 0;
1515        } else if ((l2_offset_u64 & 0xffffffff00000000) != 0x1000000000000000) {
1516            /*
1517             * Top most nibble is 0x1 if grain table is allocated.
1518             * strict check - top most 4 bytes must be 0x10000000 since max
1519             * supported size is 64TB for disk - so no more than 64TB / 16MB
1520             * grain directories which is smaller than uint32,
1521             * where 16MB is the only supported default grain table coverage.
1522             */
1523            return VMDK_ERROR;
1524        } else {
1525            l2_offset_u64 = l2_offset_u64 & 0x00000000ffffffff;
1526            l2_offset_u64 = extent->sesparse_l2_tables_offset +
1527                l2_offset_u64 * l2_size_bytes / SECTOR_SIZE;
1528            if (l2_offset_u64 > 0x00000000ffffffff) {
1529                return VMDK_ERROR;
1530            }
1531            l2_offset = (unsigned int)(l2_offset_u64);
1532        }
1533    } else {
1534        assert(extent->entry_size == sizeof(uint32_t));
1535        l2_offset = ((uint32_t *)extent->l1_table)[l1_index];
1536    }
1537    if (!l2_offset) {
1538        return VMDK_UNALLOC;
1539    }
1540    for (i = 0; i < L2_CACHE_SIZE; i++) {
1541        if (l2_offset == extent->l2_cache_offsets[i]) {
1542            /* increment the hit count */
1543            if (++extent->l2_cache_counts[i] == 0xffffffff) {
1544                for (j = 0; j < L2_CACHE_SIZE; j++) {
1545                    extent->l2_cache_counts[j] >>= 1;
1546                }
1547            }
1548            l2_table = (char *)extent->l2_cache + (i * l2_size_bytes);
1549            goto found;
1550        }
1551    }
1552    /* not found: load a new entry in the least used one */
1553    min_index = 0;
1554    min_count = 0xffffffff;
1555    for (i = 0; i < L2_CACHE_SIZE; i++) {
1556        if (extent->l2_cache_counts[i] < min_count) {
1557            min_count = extent->l2_cache_counts[i];
1558            min_index = i;
1559        }
1560    }
1561    l2_table = (char *)extent->l2_cache + (min_index * l2_size_bytes);
1562    BLKDBG_EVENT(extent->file, BLKDBG_L2_LOAD);
1563    if (bdrv_pread(extent->file,
1564                (int64_t)l2_offset * 512,
1565                l2_table,
1566                l2_size_bytes
1567            ) != l2_size_bytes) {
1568        return VMDK_ERROR;
1569    }
1570
1571    extent->l2_cache_offsets[min_index] = l2_offset;
1572    extent->l2_cache_counts[min_index] = 1;
1573 found:
1574    l2_index = ((offset >> 9) / extent->cluster_sectors) % extent->l2_size;
1575
1576    if (extent->sesparse) {
1577        cluster_sector = le64_to_cpu(((uint64_t *)l2_table)[l2_index]);
1578        switch (cluster_sector & 0xf000000000000000) {
1579        case 0x0000000000000000:
1580            /* unallocated grain */
1581            if (cluster_sector != 0) {
1582                return VMDK_ERROR;
1583            }
1584            break;
1585        case 0x1000000000000000:
1586            /* scsi-unmapped grain - fallthrough */
1587        case 0x2000000000000000:
1588            /* zero grain */
1589            zeroed = true;
1590            break;
1591        case 0x3000000000000000:
1592            /* allocated grain */
1593            cluster_sector = (((cluster_sector & 0x0fff000000000000) >> 48) |
1594                              ((cluster_sector & 0x0000ffffffffffff) << 12));
1595            cluster_sector = extent->sesparse_clusters_offset +
1596                cluster_sector * extent->cluster_sectors;
1597            break;
1598        default:
1599            return VMDK_ERROR;
1600        }
1601    } else {
1602        cluster_sector = le32_to_cpu(((uint32_t *)l2_table)[l2_index]);
1603
1604        if (extent->has_zero_grain && cluster_sector == VMDK_GTE_ZEROED) {
1605            zeroed = true;
1606        }
1607    }
1608
1609    if (!cluster_sector || zeroed) {
1610        if (!allocate) {
1611            return zeroed ? VMDK_ZEROED : VMDK_UNALLOC;
1612        }
1613        assert(!extent->sesparse);
1614
1615        if (extent->next_cluster_sector >= VMDK_EXTENT_MAX_SECTORS) {
1616            return VMDK_ERROR;
1617        }
1618
1619        cluster_sector = extent->next_cluster_sector;
1620        extent->next_cluster_sector += extent->cluster_sectors;
1621
1622        /* First of all we write grain itself, to avoid race condition
1623         * that may to corrupt the image.
1624         * This problem may occur because of insufficient space on host disk
1625         * or inappropriate VM shutdown.
1626         */
1627        ret = get_whole_cluster(bs, extent, cluster_sector * BDRV_SECTOR_SIZE,
1628                                offset, skip_start_bytes, skip_end_bytes);
1629        if (ret) {
1630            return ret;
1631        }
1632        if (m_data) {
1633            m_data->valid = 1;
1634            m_data->l1_index = l1_index;
1635            m_data->l2_index = l2_index;
1636            m_data->l2_offset = l2_offset;
1637            m_data->l2_cache_entry = ((uint32_t *)l2_table) + l2_index;
1638        }
1639    }
1640    *cluster_offset = cluster_sector << BDRV_SECTOR_BITS;
1641    return VMDK_OK;
1642}
1643
1644static VmdkExtent *find_extent(BDRVVmdkState *s,
1645                                int64_t sector_num, VmdkExtent *start_hint)
1646{
1647    VmdkExtent *extent = start_hint;
1648
1649    if (!extent) {
1650        extent = &s->extents[0];
1651    }
1652    while (extent < &s->extents[s->num_extents]) {
1653        if (sector_num < extent->end_sector) {
1654            return extent;
1655        }
1656        extent++;
1657    }
1658    return NULL;
1659}
1660
1661static inline uint64_t vmdk_find_offset_in_cluster(VmdkExtent *extent,
1662                                                   int64_t offset)
1663{
1664    uint64_t extent_begin_offset, extent_relative_offset;
1665    uint64_t cluster_size = extent->cluster_sectors * BDRV_SECTOR_SIZE;
1666
1667    extent_begin_offset =
1668        (extent->end_sector - extent->sectors) * BDRV_SECTOR_SIZE;
1669    extent_relative_offset = offset - extent_begin_offset;
1670    return extent_relative_offset % cluster_size;
1671}
1672
1673static int coroutine_fn vmdk_co_block_status(BlockDriverState *bs,
1674                                             bool want_zero,
1675                                             int64_t offset, int64_t bytes,
1676                                             int64_t *pnum, int64_t *map,
1677                                             BlockDriverState **file)
1678{
1679    BDRVVmdkState *s = bs->opaque;
1680    int64_t index_in_cluster, n, ret;
1681    uint64_t cluster_offset;
1682    VmdkExtent *extent;
1683
1684    extent = find_extent(s, offset >> BDRV_SECTOR_BITS, NULL);
1685    if (!extent) {
1686        return -EIO;
1687    }
1688    qemu_co_mutex_lock(&s->lock);
1689    ret = get_cluster_offset(bs, extent, NULL, offset, false, &cluster_offset,
1690                             0, 0);
1691    qemu_co_mutex_unlock(&s->lock);
1692
1693    index_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
1694    switch (ret) {
1695    case VMDK_ERROR:
1696        ret = -EIO;
1697        break;
1698    case VMDK_UNALLOC:
1699        ret = 0;
1700        break;
1701    case VMDK_ZEROED:
1702        ret = BDRV_BLOCK_ZERO;
1703        break;
1704    case VMDK_OK:
1705        ret = BDRV_BLOCK_DATA;
1706        if (!extent->compressed) {
1707            ret |= BDRV_BLOCK_OFFSET_VALID;
1708            *map = cluster_offset + index_in_cluster;
1709            if (extent->flat) {
1710                ret |= BDRV_BLOCK_RECURSE;
1711            }
1712        }
1713        *file = extent->file->bs;
1714        break;
1715    }
1716
1717    n = extent->cluster_sectors * BDRV_SECTOR_SIZE - index_in_cluster;
1718    *pnum = MIN(n, bytes);
1719    return ret;
1720}
1721
1722static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
1723                            int64_t offset_in_cluster, QEMUIOVector *qiov,
1724                            uint64_t qiov_offset, uint64_t n_bytes,
1725                            uint64_t offset)
1726{
1727    int ret;
1728    VmdkGrainMarker *data = NULL;
1729    uLongf buf_len;
1730    QEMUIOVector local_qiov;
1731    int64_t write_offset;
1732    int64_t write_end_sector;
1733
1734    if (extent->compressed) {
1735        void *compressed_data;
1736
1737        /* Only whole clusters */
1738        if (offset_in_cluster ||
1739            n_bytes > (extent->cluster_sectors * SECTOR_SIZE) ||
1740            (n_bytes < (extent->cluster_sectors * SECTOR_SIZE) &&
1741             offset + n_bytes != extent->end_sector * SECTOR_SIZE))
1742        {
1743            ret = -EINVAL;
1744            goto out;
1745        }
1746
1747        if (!extent->has_marker) {
1748            ret = -EINVAL;
1749            goto out;
1750        }
1751        buf_len = (extent->cluster_sectors << 9) * 2;
1752        data = g_malloc(buf_len + sizeof(VmdkGrainMarker));
1753
1754        compressed_data = g_malloc(n_bytes);
1755        qemu_iovec_to_buf(qiov, qiov_offset, compressed_data, n_bytes);
1756        ret = compress(data->data, &buf_len, compressed_data, n_bytes);
1757        g_free(compressed_data);
1758
1759        if (ret != Z_OK || buf_len == 0) {
1760            ret = -EINVAL;
1761            goto out;
1762        }
1763
1764        data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS);
1765        data->size = cpu_to_le32(buf_len);
1766
1767        n_bytes = buf_len + sizeof(VmdkGrainMarker);
1768        qemu_iovec_init_buf(&local_qiov, data, n_bytes);
1769
1770        BLKDBG_EVENT(extent->file, BLKDBG_WRITE_COMPRESSED);
1771    } else {
1772        qemu_iovec_init(&local_qiov, qiov->niov);
1773        qemu_iovec_concat(&local_qiov, qiov, qiov_offset, n_bytes);
1774
1775        BLKDBG_EVENT(extent->file, BLKDBG_WRITE_AIO);
1776    }
1777
1778    write_offset = cluster_offset + offset_in_cluster;
1779    ret = bdrv_co_pwritev(extent->file, write_offset, n_bytes,
1780                          &local_qiov, 0);
1781
1782    write_end_sector = DIV_ROUND_UP(write_offset + n_bytes, BDRV_SECTOR_SIZE);
1783
1784    if (extent->compressed) {
1785        extent->next_cluster_sector = write_end_sector;
1786    } else {
1787        extent->next_cluster_sector = MAX(extent->next_cluster_sector,
1788                                          write_end_sector);
1789    }
1790
1791    if (ret < 0) {
1792        goto out;
1793    }
1794    ret = 0;
1795 out:
1796    g_free(data);
1797    if (!extent->compressed) {
1798        qemu_iovec_destroy(&local_qiov);
1799    }
1800    return ret;
1801}
1802
1803static int vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset,
1804                            int64_t offset_in_cluster, QEMUIOVector *qiov,
1805                            int bytes)
1806{
1807    int ret;
1808    int cluster_bytes, buf_bytes;
1809    uint8_t *cluster_buf, *compressed_data;
1810    uint8_t *uncomp_buf;
1811    uint32_t data_len;
1812    VmdkGrainMarker *marker;
1813    uLongf buf_len;
1814
1815
1816    if (!extent->compressed) {
1817        BLKDBG_EVENT(extent->file, BLKDBG_READ_AIO);
1818        ret = bdrv_co_preadv(extent->file,
1819                             cluster_offset + offset_in_cluster, bytes,
1820                             qiov, 0);
1821        if (ret < 0) {
1822            return ret;
1823        }
1824        return 0;
1825    }
1826    cluster_bytes = extent->cluster_sectors * 512;
1827    /* Read two clusters in case GrainMarker + compressed data > one cluster */
1828    buf_bytes = cluster_bytes * 2;
1829    cluster_buf = g_malloc(buf_bytes);
1830    uncomp_buf = g_malloc(cluster_bytes);
1831    BLKDBG_EVENT(extent->file, BLKDBG_READ_COMPRESSED);
1832    ret = bdrv_pread(extent->file,
1833                cluster_offset,
1834                cluster_buf, buf_bytes);
1835    if (ret < 0) {
1836        goto out;
1837    }
1838    compressed_data = cluster_buf;
1839    buf_len = cluster_bytes;
1840    data_len = cluster_bytes;
1841    if (extent->has_marker) {
1842        marker = (VmdkGrainMarker *)cluster_buf;
1843        compressed_data = marker->data;
1844        data_len = le32_to_cpu(marker->size);
1845    }
1846    if (!data_len || data_len > buf_bytes) {
1847        ret = -EINVAL;
1848        goto out;
1849    }
1850    ret = uncompress(uncomp_buf, &buf_len, compressed_data, data_len);
1851    if (ret != Z_OK) {
1852        ret = -EINVAL;
1853        goto out;
1854
1855    }
1856    if (offset_in_cluster < 0 ||
1857            offset_in_cluster + bytes > buf_len) {
1858        ret = -EINVAL;
1859        goto out;
1860    }
1861    qemu_iovec_from_buf(qiov, 0, uncomp_buf + offset_in_cluster, bytes);
1862    ret = 0;
1863
1864 out:
1865    g_free(uncomp_buf);
1866    g_free(cluster_buf);
1867    return ret;
1868}
1869
1870static int coroutine_fn
1871vmdk_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
1872               QEMUIOVector *qiov, int flags)
1873{
1874    BDRVVmdkState *s = bs->opaque;
1875    int ret;
1876    uint64_t n_bytes, offset_in_cluster;
1877    VmdkExtent *extent = NULL;
1878    QEMUIOVector local_qiov;
1879    uint64_t cluster_offset;
1880    uint64_t bytes_done = 0;
1881
1882    qemu_iovec_init(&local_qiov, qiov->niov);
1883    qemu_co_mutex_lock(&s->lock);
1884
1885    while (bytes > 0) {
1886        extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent);
1887        if (!extent) {
1888            ret = -EIO;
1889            goto fail;
1890        }
1891        ret = get_cluster_offset(bs, extent, NULL,
1892                                 offset, false, &cluster_offset, 0, 0);
1893        offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
1894
1895        n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
1896                             - offset_in_cluster);
1897
1898        if (ret != VMDK_OK) {
1899            /* if not allocated, try to read from parent image, if exist */
1900            if (bs->backing && ret != VMDK_ZEROED) {
1901                if (!vmdk_is_cid_valid(bs)) {
1902                    ret = -EINVAL;
1903                    goto fail;
1904                }
1905
1906                qemu_iovec_reset(&local_qiov);
1907                qemu_iovec_concat(&local_qiov, qiov, bytes_done, n_bytes);
1908
1909                /* qcow2 emits this on bs->file instead of bs->backing */
1910                BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
1911                ret = bdrv_co_preadv(bs->backing, offset, n_bytes,
1912                                     &local_qiov, 0);
1913                if (ret < 0) {
1914                    goto fail;
1915                }
1916            } else {
1917                qemu_iovec_memset(qiov, bytes_done, 0, n_bytes);
1918            }
1919        } else {
1920            qemu_iovec_reset(&local_qiov);
1921            qemu_iovec_concat(&local_qiov, qiov, bytes_done, n_bytes);
1922
1923            ret = vmdk_read_extent(extent, cluster_offset, offset_in_cluster,
1924                                   &local_qiov, n_bytes);
1925            if (ret) {
1926                goto fail;
1927            }
1928        }
1929        bytes -= n_bytes;
1930        offset += n_bytes;
1931        bytes_done += n_bytes;
1932    }
1933
1934    ret = 0;
1935fail:
1936    qemu_co_mutex_unlock(&s->lock);
1937    qemu_iovec_destroy(&local_qiov);
1938
1939    return ret;
1940}
1941
1942/**
1943 * vmdk_write:
1944 * @zeroed:       buf is ignored (data is zero), use zeroed_grain GTE feature
1945 *                if possible, otherwise return -ENOTSUP.
1946 * @zero_dry_run: used for zeroed == true only, don't update L2 table, just try
1947 *                with each cluster. By dry run we can find if the zero write
1948 *                is possible without modifying image data.
1949 *
1950 * Returns: error code with 0 for success.
1951 */
1952static int vmdk_pwritev(BlockDriverState *bs, uint64_t offset,
1953                       uint64_t bytes, QEMUIOVector *qiov,
1954                       bool zeroed, bool zero_dry_run)
1955{
1956    BDRVVmdkState *s = bs->opaque;
1957    VmdkExtent *extent = NULL;
1958    int ret;
1959    int64_t offset_in_cluster, n_bytes;
1960    uint64_t cluster_offset;
1961    uint64_t bytes_done = 0;
1962    VmdkMetaData m_data;
1963
1964    if (DIV_ROUND_UP(offset, BDRV_SECTOR_SIZE) > bs->total_sectors) {
1965        error_report("Wrong offset: offset=0x%" PRIx64
1966                     " total_sectors=0x%" PRIx64,
1967                     offset, bs->total_sectors);
1968        return -EIO;
1969    }
1970
1971    while (bytes > 0) {
1972        extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent);
1973        if (!extent) {
1974            return -EIO;
1975        }
1976        if (extent->sesparse) {
1977            return -ENOTSUP;
1978        }
1979        offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
1980        n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
1981                             - offset_in_cluster);
1982
1983        ret = get_cluster_offset(bs, extent, &m_data, offset,
1984                                 !(extent->compressed || zeroed),
1985                                 &cluster_offset, offset_in_cluster,
1986                                 offset_in_cluster + n_bytes);
1987        if (extent->compressed) {
1988            if (ret == VMDK_OK) {
1989                /* Refuse write to allocated cluster for streamOptimized */
1990                error_report("Could not write to allocated cluster"
1991                              " for streamOptimized");
1992                return -EIO;
1993            } else {
1994                /* allocate */
1995                ret = get_cluster_offset(bs, extent, &m_data, offset,
1996                                         true, &cluster_offset, 0, 0);
1997            }
1998        }
1999        if (ret == VMDK_ERROR) {
2000            return -EINVAL;
2001        }
2002        if (zeroed) {
2003            /* Do zeroed write, buf is ignored */
2004            if (extent->has_zero_grain &&
2005                    offset_in_cluster == 0 &&
2006                    n_bytes >= extent->cluster_sectors * BDRV_SECTOR_SIZE) {
2007                n_bytes = extent->cluster_sectors * BDRV_SECTOR_SIZE;
2008                if (!zero_dry_run) {
2009                    /* update L2 tables */
2010                    if (vmdk_L2update(extent, &m_data, VMDK_GTE_ZEROED)
2011                            != VMDK_OK) {
2012                        return -EIO;
2013                    }
2014                }
2015            } else {
2016                return -ENOTSUP;
2017            }
2018        } else {
2019            ret = vmdk_write_extent(extent, cluster_offset, offset_in_cluster,
2020                                    qiov, bytes_done, n_bytes, offset);
2021            if (ret) {
2022                return ret;
2023            }
2024            if (m_data.valid) {
2025                /* update L2 tables */
2026                if (vmdk_L2update(extent, &m_data,
2027                                  cluster_offset >> BDRV_SECTOR_BITS)
2028                        != VMDK_OK) {
2029                    return -EIO;
2030                }
2031            }
2032        }
2033        bytes -= n_bytes;
2034        offset += n_bytes;
2035        bytes_done += n_bytes;
2036
2037        /* update CID on the first write every time the virtual disk is
2038         * opened */
2039        if (!s->cid_updated) {
2040            ret = vmdk_write_cid(bs, g_random_int());
2041            if (ret < 0) {
2042                return ret;
2043            }
2044            s->cid_updated = true;
2045        }
2046    }
2047    return 0;
2048}
2049
2050static int coroutine_fn
2051vmdk_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
2052                QEMUIOVector *qiov, int flags)
2053{
2054    int ret;
2055    BDRVVmdkState *s = bs->opaque;
2056    qemu_co_mutex_lock(&s->lock);
2057    ret = vmdk_pwritev(bs, offset, bytes, qiov, false, false);
2058    qemu_co_mutex_unlock(&s->lock);
2059    return ret;
2060}
2061
2062static int coroutine_fn
2063vmdk_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
2064                           uint64_t bytes, QEMUIOVector *qiov)
2065{
2066    if (bytes == 0) {
2067        /* The caller will write bytes 0 to signal EOF.
2068         * When receive it, we align EOF to a sector boundary. */
2069        BDRVVmdkState *s = bs->opaque;
2070        int i, ret;
2071        int64_t length;
2072
2073        for (i = 0; i < s->num_extents; i++) {
2074            length = bdrv_getlength(s->extents[i].file->bs);
2075            if (length < 0) {
2076                return length;
2077            }
2078            length = QEMU_ALIGN_UP(length, BDRV_SECTOR_SIZE);
2079            ret = bdrv_truncate(s->extents[i].file, length, false,
2080                                PREALLOC_MODE_OFF, NULL);
2081            if (ret < 0) {
2082                return ret;
2083            }
2084        }
2085        return 0;
2086    }
2087    return vmdk_co_pwritev(bs, offset, bytes, qiov, 0);
2088}
2089
2090static int coroutine_fn vmdk_co_pwrite_zeroes(BlockDriverState *bs,
2091                                              int64_t offset,
2092                                              int bytes,
2093                                              BdrvRequestFlags flags)
2094{
2095    int ret;
2096    BDRVVmdkState *s = bs->opaque;
2097
2098    qemu_co_mutex_lock(&s->lock);
2099    /* write zeroes could fail if sectors not aligned to cluster, test it with
2100     * dry_run == true before really updating image */
2101    ret = vmdk_pwritev(bs, offset, bytes, NULL, true, true);
2102    if (!ret) {
2103        ret = vmdk_pwritev(bs, offset, bytes, NULL, true, false);
2104    }
2105    qemu_co_mutex_unlock(&s->lock);
2106    return ret;
2107}
2108
2109static int vmdk_init_extent(BlockBackend *blk,
2110                            int64_t filesize, bool flat,
2111                            bool compress, bool zeroed_grain,
2112                            Error **errp)
2113{
2114    int ret, i;
2115    VMDK4Header header;
2116    uint32_t tmp, magic, grains, gd_sectors, gt_size, gt_count;
2117    uint32_t *gd_buf = NULL;
2118    int gd_buf_size;
2119
2120    if (flat) {
2121        ret = blk_truncate(blk, filesize, false, PREALLOC_MODE_OFF, errp);
2122        goto exit;
2123    }
2124    magic = cpu_to_be32(VMDK4_MAGIC);
2125    memset(&header, 0, sizeof(header));
2126    if (compress) {
2127        header.version = 3;
2128    } else if (zeroed_grain) {
2129        header.version = 2;
2130    } else {
2131        header.version = 1;
2132    }
2133    header.flags = VMDK4_FLAG_RGD | VMDK4_FLAG_NL_DETECT
2134                   | (compress ? VMDK4_FLAG_COMPRESS | VMDK4_FLAG_MARKER : 0)
2135                   | (zeroed_grain ? VMDK4_FLAG_ZERO_GRAIN : 0);
2136    header.compressAlgorithm = compress ? VMDK4_COMPRESSION_DEFLATE : 0;
2137    header.capacity = filesize / BDRV_SECTOR_SIZE;
2138    header.granularity = 128;
2139    header.num_gtes_per_gt = BDRV_SECTOR_SIZE;
2140
2141    grains = DIV_ROUND_UP(filesize / BDRV_SECTOR_SIZE, header.granularity);
2142    gt_size = DIV_ROUND_UP(header.num_gtes_per_gt * sizeof(uint32_t),
2143                           BDRV_SECTOR_SIZE);
2144    gt_count = DIV_ROUND_UP(grains, header.num_gtes_per_gt);
2145    gd_sectors = DIV_ROUND_UP(gt_count * sizeof(uint32_t), BDRV_SECTOR_SIZE);
2146
2147    header.desc_offset = 1;
2148    header.desc_size = 20;
2149    header.rgd_offset = header.desc_offset + header.desc_size;
2150    header.gd_offset = header.rgd_offset + gd_sectors + (gt_size * gt_count);
2151    header.grain_offset =
2152        ROUND_UP(header.gd_offset + gd_sectors + (gt_size * gt_count),
2153                 header.granularity);
2154    /* swap endianness for all header fields */
2155    header.version = cpu_to_le32(header.version);
2156    header.flags = cpu_to_le32(header.flags);
2157    header.capacity = cpu_to_le64(header.capacity);
2158    header.granularity = cpu_to_le64(header.granularity);
2159    header.num_gtes_per_gt = cpu_to_le32(header.num_gtes_per_gt);
2160    header.desc_offset = cpu_to_le64(header.desc_offset);
2161    header.desc_size = cpu_to_le64(header.desc_size);
2162    header.rgd_offset = cpu_to_le64(header.rgd_offset);
2163    header.gd_offset = cpu_to_le64(header.gd_offset);
2164    header.grain_offset = cpu_to_le64(header.grain_offset);
2165    header.compressAlgorithm = cpu_to_le16(header.compressAlgorithm);
2166
2167    header.check_bytes[0] = 0xa;
2168    header.check_bytes[1] = 0x20;
2169    header.check_bytes[2] = 0xd;
2170    header.check_bytes[3] = 0xa;
2171
2172    /* write all the data */
2173    ret = blk_pwrite(blk, 0, &magic, sizeof(magic), 0);
2174    if (ret < 0) {
2175        error_setg(errp, QERR_IO_ERROR);
2176        goto exit;
2177    }
2178    ret = blk_pwrite(blk, sizeof(magic), &header, sizeof(header), 0);
2179    if (ret < 0) {
2180        error_setg(errp, QERR_IO_ERROR);
2181        goto exit;
2182    }
2183
2184    ret = blk_truncate(blk, le64_to_cpu(header.grain_offset) << 9, false,
2185                       PREALLOC_MODE_OFF, errp);
2186    if (ret < 0) {
2187        goto exit;
2188    }
2189
2190    /* write grain directory */
2191    gd_buf_size = gd_sectors * BDRV_SECTOR_SIZE;
2192    gd_buf = g_malloc0(gd_buf_size);
2193    for (i = 0, tmp = le64_to_cpu(header.rgd_offset) + gd_sectors;
2194         i < gt_count; i++, tmp += gt_size) {
2195        gd_buf[i] = cpu_to_le32(tmp);
2196    }
2197    ret = blk_pwrite(blk, le64_to_cpu(header.rgd_offset) * BDRV_SECTOR_SIZE,
2198                     gd_buf, gd_buf_size, 0);
2199    if (ret < 0) {
2200        error_setg(errp, QERR_IO_ERROR);
2201        goto exit;
2202    }
2203
2204    /* write backup grain directory */
2205    for (i = 0, tmp = le64_to_cpu(header.gd_offset) + gd_sectors;
2206         i < gt_count; i++, tmp += gt_size) {
2207        gd_buf[i] = cpu_to_le32(tmp);
2208    }
2209    ret = blk_pwrite(blk, le64_to_cpu(header.gd_offset) * BDRV_SECTOR_SIZE,
2210                     gd_buf, gd_buf_size, 0);
2211    if (ret < 0) {
2212        error_setg(errp, QERR_IO_ERROR);
2213    }
2214
2215    ret = 0;
2216exit:
2217    g_free(gd_buf);
2218    return ret;
2219}
2220
2221static int vmdk_create_extent(const char *filename, int64_t filesize,
2222                              bool flat, bool compress, bool zeroed_grain,
2223                              BlockBackend **pbb,
2224                              QemuOpts *opts, Error **errp)
2225{
2226    int ret;
2227    BlockBackend *blk = NULL;
2228    Error *local_err = NULL;
2229
2230    ret = bdrv_create_file(filename, opts, &local_err);
2231    if (ret < 0) {
2232        error_propagate(errp, local_err);
2233        goto exit;
2234    }
2235
2236    blk = blk_new_open(filename, NULL, NULL,
2237                       BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL,
2238                       &local_err);
2239    if (blk == NULL) {
2240        error_propagate(errp, local_err);
2241        ret = -EIO;
2242        goto exit;
2243    }
2244
2245    blk_set_allow_write_beyond_eof(blk, true);
2246
2247    ret = vmdk_init_extent(blk, filesize, flat, compress, zeroed_grain, errp);
2248exit:
2249    if (blk) {
2250        if (pbb) {
2251            *pbb = blk;
2252        } else {
2253            blk_unref(blk);
2254            blk = NULL;
2255        }
2256    }
2257    return ret;
2258}
2259
2260static int filename_decompose(const char *filename, char *path, char *prefix,
2261                              char *postfix, size_t buf_len, Error **errp)
2262{
2263    const char *p, *q;
2264
2265    if (filename == NULL || !strlen(filename)) {
2266        error_setg(errp, "No filename provided");
2267        return VMDK_ERROR;
2268    }
2269    p = strrchr(filename, '/');
2270    if (p == NULL) {
2271        p = strrchr(filename, '\\');
2272    }
2273    if (p == NULL) {
2274        p = strrchr(filename, ':');
2275    }
2276    if (p != NULL) {
2277        p++;
2278        if (p - filename >= buf_len) {
2279            return VMDK_ERROR;
2280        }
2281        pstrcpy(path, p - filename + 1, filename);
2282    } else {
2283        p = filename;
2284        path[0] = '\0';
2285    }
2286    q = strrchr(p, '.');
2287    if (q == NULL) {
2288        pstrcpy(prefix, buf_len, p);
2289        postfix[0] = '\0';
2290    } else {
2291        if (q - p >= buf_len) {
2292            return VMDK_ERROR;
2293        }
2294        pstrcpy(prefix, q - p + 1, p);
2295        pstrcpy(postfix, buf_len, q);
2296    }
2297    return VMDK_OK;
2298}
2299
2300/*
2301 * idx == 0: get or create the descriptor file (also the image file if in a
2302 *           non-split format.
2303 * idx >= 1: get the n-th extent if in a split subformat
2304 */
2305typedef BlockBackend *(*vmdk_create_extent_fn)(int64_t size,
2306                                               int idx,
2307                                               bool flat,
2308                                               bool split,
2309                                               bool compress,
2310                                               bool zeroed_grain,
2311                                               void *opaque,
2312                                               Error **errp);
2313
2314static void vmdk_desc_add_extent(GString *desc,
2315                                 const char *extent_line_fmt,
2316                                 int64_t size, const char *filename)
2317{
2318    char *basename = g_path_get_basename(filename);
2319
2320    g_string_append_printf(desc, extent_line_fmt,
2321                           DIV_ROUND_UP(size, BDRV_SECTOR_SIZE), basename);
2322    g_free(basename);
2323}
2324
2325static int coroutine_fn vmdk_co_do_create(int64_t size,
2326                                          BlockdevVmdkSubformat subformat,
2327                                          BlockdevVmdkAdapterType adapter_type,
2328                                          const char *backing_file,
2329                                          const char *hw_version,
2330                                          bool compat6,
2331                                          bool zeroed_grain,
2332                                          vmdk_create_extent_fn extent_fn,
2333                                          void *opaque,
2334                                          Error **errp)
2335{
2336    int extent_idx;
2337    BlockBackend *blk = NULL;
2338    BlockBackend *extent_blk;
2339    Error *local_err = NULL;
2340    char *desc = NULL;
2341    int ret = 0;
2342    bool flat, split, compress;
2343    GString *ext_desc_lines;
2344    const int64_t split_size = 0x80000000;  /* VMDK has constant split size */
2345    int64_t extent_size;
2346    int64_t created_size = 0;
2347    const char *extent_line_fmt;
2348    char *parent_desc_line = g_malloc0(BUF_SIZE);
2349    uint32_t parent_cid = 0xffffffff;
2350    uint32_t number_heads = 16;
2351    uint32_t desc_offset = 0, desc_len;
2352    const char desc_template[] =
2353        "# Disk DescriptorFile\n"
2354        "version=1\n"
2355        "CID=%" PRIx32 "\n"
2356        "parentCID=%" PRIx32 "\n"
2357        "createType=\"%s\"\n"
2358        "%s"
2359        "\n"
2360        "# Extent description\n"
2361        "%s"
2362        "\n"
2363        "# The Disk Data Base\n"
2364        "#DDB\n"
2365        "\n"
2366        "ddb.virtualHWVersion = \"%s\"\n"
2367        "ddb.geometry.cylinders = \"%" PRId64 "\"\n"
2368        "ddb.geometry.heads = \"%" PRIu32 "\"\n"
2369        "ddb.geometry.sectors = \"63\"\n"
2370        "ddb.adapterType = \"%s\"\n";
2371
2372    ext_desc_lines = g_string_new(NULL);
2373
2374    /* Read out options */
2375    if (compat6) {
2376        if (hw_version) {
2377            error_setg(errp,
2378                       "compat6 cannot be enabled with hwversion set");
2379            ret = -EINVAL;
2380            goto exit;
2381        }
2382        hw_version = "6";
2383    }
2384    if (!hw_version) {
2385        hw_version = "4";
2386    }
2387
2388    if (adapter_type != BLOCKDEV_VMDK_ADAPTER_TYPE_IDE) {
2389        /* that's the number of heads with which vmware operates when
2390           creating, exporting, etc. vmdk files with a non-ide adapter type */
2391        number_heads = 255;
2392    }
2393    split = (subformat == BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT) ||
2394            (subformat == BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTSPARSE);
2395    flat = (subformat == BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICFLAT) ||
2396           (subformat == BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT);
2397    compress = subformat == BLOCKDEV_VMDK_SUBFORMAT_STREAMOPTIMIZED;
2398
2399    if (flat) {
2400        extent_line_fmt = "RW %" PRId64 " FLAT \"%s\" 0\n";
2401    } else {
2402        extent_line_fmt = "RW %" PRId64 " SPARSE \"%s\"\n";
2403    }
2404    if (flat && backing_file) {
2405        error_setg(errp, "Flat image can't have backing file");
2406        ret = -ENOTSUP;
2407        goto exit;
2408    }
2409    if (flat && zeroed_grain) {
2410        error_setg(errp, "Flat image can't enable zeroed grain");
2411        ret = -ENOTSUP;
2412        goto exit;
2413    }
2414
2415    /* Create extents */
2416    if (split) {
2417        extent_size = split_size;
2418    } else {
2419        extent_size = size;
2420    }
2421    if (!split && !flat) {
2422        created_size = extent_size;
2423    } else {
2424        created_size = 0;
2425    }
2426    /* Get the descriptor file BDS */
2427    blk = extent_fn(created_size, 0, flat, split, compress, zeroed_grain,
2428                    opaque, errp);
2429    if (!blk) {
2430        ret = -EIO;
2431        goto exit;
2432    }
2433    if (!split && !flat) {
2434        vmdk_desc_add_extent(ext_desc_lines, extent_line_fmt, created_size,
2435                             blk_bs(blk)->filename);
2436    }
2437
2438    if (backing_file) {
2439        BlockBackend *backing;
2440        char *full_backing =
2441            bdrv_get_full_backing_filename_from_filename(blk_bs(blk)->filename,
2442                                                         backing_file,
2443                                                         &local_err);
2444        if (local_err) {
2445            error_propagate(errp, local_err);
2446            ret = -ENOENT;
2447            goto exit;
2448        }
2449        assert(full_backing);
2450
2451        backing = blk_new_open(full_backing, NULL, NULL,
2452                               BDRV_O_NO_BACKING, errp);
2453        g_free(full_backing);
2454        if (backing == NULL) {
2455            ret = -EIO;
2456            goto exit;
2457        }
2458        if (strcmp(blk_bs(backing)->drv->format_name, "vmdk")) {
2459            error_setg(errp, "Invalid backing file format: %s. Must be vmdk",
2460                       blk_bs(backing)->drv->format_name);
2461            blk_unref(backing);
2462            ret = -EINVAL;
2463            goto exit;
2464        }
2465        ret = vmdk_read_cid(blk_bs(backing), 0, &parent_cid);
2466        blk_unref(backing);
2467        if (ret) {
2468            error_setg(errp, "Failed to read parent CID");
2469            goto exit;
2470        }
2471        snprintf(parent_desc_line, BUF_SIZE,
2472                "parentFileNameHint=\"%s\"", backing_file);
2473    }
2474    extent_idx = 1;
2475    while (created_size < size) {
2476        int64_t cur_size = MIN(size - created_size, extent_size);
2477        extent_blk = extent_fn(cur_size, extent_idx, flat, split, compress,
2478                               zeroed_grain, opaque, errp);
2479        if (!extent_blk) {
2480            ret = -EINVAL;
2481            goto exit;
2482        }
2483        vmdk_desc_add_extent(ext_desc_lines, extent_line_fmt, cur_size,
2484                             blk_bs(extent_blk)->filename);
2485        created_size += cur_size;
2486        extent_idx++;
2487        blk_unref(extent_blk);
2488    }
2489
2490    /* Check whether we got excess extents */
2491    extent_blk = extent_fn(-1, extent_idx, flat, split, compress, zeroed_grain,
2492                           opaque, NULL);
2493    if (extent_blk) {
2494        blk_unref(extent_blk);
2495        error_setg(errp, "List of extents contains unused extents");
2496        ret = -EINVAL;
2497        goto exit;
2498    }
2499
2500    /* generate descriptor file */
2501    desc = g_strdup_printf(desc_template,
2502                           g_random_int(),
2503                           parent_cid,
2504                           BlockdevVmdkSubformat_str(subformat),
2505                           parent_desc_line,
2506                           ext_desc_lines->str,
2507                           hw_version,
2508                           size /
2509                               (int64_t)(63 * number_heads * BDRV_SECTOR_SIZE),
2510                           number_heads,
2511                           BlockdevVmdkAdapterType_str(adapter_type));
2512    desc_len = strlen(desc);
2513    /* the descriptor offset = 0x200 */
2514    if (!split && !flat) {
2515        desc_offset = 0x200;
2516    }
2517
2518    ret = blk_pwrite(blk, desc_offset, desc, desc_len, 0);
2519    if (ret < 0) {
2520        error_setg_errno(errp, -ret, "Could not write description");
2521        goto exit;
2522    }
2523    /* bdrv_pwrite write padding zeros to align to sector, we don't need that
2524     * for description file */
2525    if (desc_offset == 0) {
2526        ret = blk_truncate(blk, desc_len, false, PREALLOC_MODE_OFF, errp);
2527        if (ret < 0) {
2528            goto exit;
2529        }
2530    }
2531    ret = 0;
2532exit:
2533    if (blk) {
2534        blk_unref(blk);
2535    }
2536    g_free(desc);
2537    g_free(parent_desc_line);
2538    g_string_free(ext_desc_lines, true);
2539    return ret;
2540}
2541
2542typedef struct {
2543    char *path;
2544    char *prefix;
2545    char *postfix;
2546    QemuOpts *opts;
2547} VMDKCreateOptsData;
2548
2549static BlockBackend *vmdk_co_create_opts_cb(int64_t size, int idx,
2550                                            bool flat, bool split, bool compress,
2551                                            bool zeroed_grain, void *opaque,
2552                                            Error **errp)
2553{
2554    BlockBackend *blk = NULL;
2555    BlockDriverState *bs = NULL;
2556    VMDKCreateOptsData *data = opaque;
2557    char *ext_filename = NULL;
2558    char *rel_filename = NULL;
2559
2560    /* We're done, don't create excess extents. */
2561    if (size == -1) {
2562        assert(errp == NULL);
2563        return NULL;
2564    }
2565
2566    if (idx == 0) {
2567        rel_filename = g_strdup_printf("%s%s", data->prefix, data->postfix);
2568    } else if (split) {
2569        rel_filename = g_strdup_printf("%s-%c%03d%s",
2570                                       data->prefix,
2571                                       flat ? 'f' : 's', idx, data->postfix);
2572    } else {
2573        assert(idx == 1);
2574        rel_filename = g_strdup_printf("%s-flat%s", data->prefix, data->postfix);
2575    }
2576
2577    ext_filename = g_strdup_printf("%s%s", data->path, rel_filename);
2578    g_free(rel_filename);
2579
2580    if (vmdk_create_extent(ext_filename, size,
2581                           flat, compress, zeroed_grain, &blk, data->opts,
2582                           errp)) {
2583        goto exit;
2584    }
2585    bdrv_unref(bs);
2586exit:
2587    g_free(ext_filename);
2588    return blk;
2589}
2590
2591static int coroutine_fn vmdk_co_create_opts(const char *filename, QemuOpts *opts,
2592                                            Error **errp)
2593{
2594    Error *local_err = NULL;
2595    char *desc = NULL;
2596    int64_t total_size = 0;
2597    char *adapter_type = NULL;
2598    BlockdevVmdkAdapterType adapter_type_enum;
2599    char *backing_file = NULL;
2600    char *hw_version = NULL;
2601    char *fmt = NULL;
2602    BlockdevVmdkSubformat subformat;
2603    int ret = 0;
2604    char *path = g_malloc0(PATH_MAX);
2605    char *prefix = g_malloc0(PATH_MAX);
2606    char *postfix = g_malloc0(PATH_MAX);
2607    char *desc_line = g_malloc0(BUF_SIZE);
2608    char *ext_filename = g_malloc0(PATH_MAX);
2609    char *desc_filename = g_malloc0(PATH_MAX);
2610    char *parent_desc_line = g_malloc0(BUF_SIZE);
2611    bool zeroed_grain;
2612    bool compat6;
2613    VMDKCreateOptsData data;
2614
2615    if (filename_decompose(filename, path, prefix, postfix, PATH_MAX, errp)) {
2616        ret = -EINVAL;
2617        goto exit;
2618    }
2619    /* Read out options */
2620    total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
2621                          BDRV_SECTOR_SIZE);
2622    adapter_type = qemu_opt_get_del(opts, BLOCK_OPT_ADAPTER_TYPE);
2623    backing_file = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE);
2624    hw_version = qemu_opt_get_del(opts, BLOCK_OPT_HWVERSION);
2625    compat6 = qemu_opt_get_bool_del(opts, BLOCK_OPT_COMPAT6, false);
2626    if (strcmp(hw_version, "undefined") == 0) {
2627        g_free(hw_version);
2628        hw_version = NULL;
2629    }
2630    fmt = qemu_opt_get_del(opts, BLOCK_OPT_SUBFMT);
2631    zeroed_grain = qemu_opt_get_bool_del(opts, BLOCK_OPT_ZEROED_GRAIN, false);
2632
2633    if (adapter_type) {
2634        adapter_type_enum = qapi_enum_parse(&BlockdevVmdkAdapterType_lookup,
2635                                            adapter_type,
2636                                            BLOCKDEV_VMDK_ADAPTER_TYPE_IDE,
2637                                            &local_err);
2638        if (local_err) {
2639            error_propagate(errp, local_err);
2640            ret = -EINVAL;
2641            goto exit;
2642        }
2643    } else {
2644        adapter_type_enum = BLOCKDEV_VMDK_ADAPTER_TYPE_IDE;
2645    }
2646
2647    if (!fmt) {
2648        /* Default format to monolithicSparse */
2649        subformat = BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICSPARSE;
2650    } else {
2651        subformat = qapi_enum_parse(&BlockdevVmdkSubformat_lookup,
2652                                    fmt,
2653                                    BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICSPARSE,
2654                                    &local_err);
2655        if (local_err) {
2656            error_propagate(errp, local_err);
2657            ret = -EINVAL;
2658            goto exit;
2659        }
2660    }
2661    data = (VMDKCreateOptsData){
2662        .prefix = prefix,
2663        .postfix = postfix,
2664        .path = path,
2665        .opts = opts,
2666    };
2667    ret = vmdk_co_do_create(total_size, subformat, adapter_type_enum,
2668                            backing_file, hw_version, compat6, zeroed_grain,
2669                            vmdk_co_create_opts_cb, &data, errp);
2670
2671exit:
2672    g_free(adapter_type);
2673    g_free(backing_file);
2674    g_free(hw_version);
2675    g_free(fmt);
2676    g_free(desc);
2677    g_free(path);
2678    g_free(prefix);
2679    g_free(postfix);
2680    g_free(desc_line);
2681    g_free(ext_filename);
2682    g_free(desc_filename);
2683    g_free(parent_desc_line);
2684    return ret;
2685}
2686
2687static BlockBackend *vmdk_co_create_cb(int64_t size, int idx,
2688                                       bool flat, bool split, bool compress,
2689                                       bool zeroed_grain, void *opaque,
2690                                       Error **errp)
2691{
2692    int ret;
2693    BlockDriverState *bs;
2694    BlockBackend *blk;
2695    BlockdevCreateOptionsVmdk *opts = opaque;
2696
2697    if (idx == 0) {
2698        bs = bdrv_open_blockdev_ref(opts->file, errp);
2699    } else {
2700        int i;
2701        BlockdevRefList *list = opts->extents;
2702        for (i = 1; i < idx; i++) {
2703            if (!list || !list->next) {
2704                error_setg(errp, "Extent [%d] not specified", i);
2705                return NULL;
2706            }
2707            list = list->next;
2708        }
2709        if (!list) {
2710            error_setg(errp, "Extent [%d] not specified", idx - 1);
2711            return NULL;
2712        }
2713        bs = bdrv_open_blockdev_ref(list->value, errp);
2714    }
2715    if (!bs) {
2716        return NULL;
2717    }
2718    blk = blk_new(bdrv_get_aio_context(bs),
2719                  BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE | BLK_PERM_RESIZE,
2720                  BLK_PERM_ALL);
2721    if (blk_insert_bs(blk, bs, errp)) {
2722        bdrv_unref(bs);
2723        return NULL;
2724    }
2725    blk_set_allow_write_beyond_eof(blk, true);
2726    bdrv_unref(bs);
2727
2728    if (size != -1) {
2729        ret = vmdk_init_extent(blk, size, flat, compress, zeroed_grain, errp);
2730        if (ret) {
2731            blk_unref(blk);
2732            blk = NULL;
2733        }
2734    }
2735    return blk;
2736}
2737
2738static int coroutine_fn vmdk_co_create(BlockdevCreateOptions *create_options,
2739                                       Error **errp)
2740{
2741    int ret;
2742    BlockdevCreateOptionsVmdk *opts;
2743
2744    opts = &create_options->u.vmdk;
2745
2746    /* Validate options */
2747    if (!QEMU_IS_ALIGNED(opts->size, BDRV_SECTOR_SIZE)) {
2748        error_setg(errp, "Image size must be a multiple of 512 bytes");
2749        ret = -EINVAL;
2750        goto out;
2751    }
2752
2753    ret = vmdk_co_do_create(opts->size,
2754                            opts->subformat,
2755                            opts->adapter_type,
2756                            opts->backing_file,
2757                            opts->hwversion,
2758                            false,
2759                            opts->zeroed_grain,
2760                            vmdk_co_create_cb,
2761                            opts, errp);
2762    return ret;
2763
2764out:
2765    return ret;
2766}
2767
2768static void vmdk_close(BlockDriverState *bs)
2769{
2770    BDRVVmdkState *s = bs->opaque;
2771
2772    vmdk_free_extents(bs);
2773    g_free(s->create_type);
2774
2775    migrate_del_blocker(s->migration_blocker);
2776    error_free(s->migration_blocker);
2777}
2778
2779static coroutine_fn int vmdk_co_flush(BlockDriverState *bs)
2780{
2781    BDRVVmdkState *s = bs->opaque;
2782    int i, err;
2783    int ret = 0;
2784
2785    for (i = 0; i < s->num_extents; i++) {
2786        err = bdrv_co_flush(s->extents[i].file->bs);
2787        if (err < 0) {
2788            ret = err;
2789        }
2790    }
2791    return ret;
2792}
2793
2794static int64_t vmdk_get_allocated_file_size(BlockDriverState *bs)
2795{
2796    int i;
2797    int64_t ret = 0;
2798    int64_t r;
2799    BDRVVmdkState *s = bs->opaque;
2800
2801    ret = bdrv_get_allocated_file_size(bs->file->bs);
2802    if (ret < 0) {
2803        return ret;
2804    }
2805    for (i = 0; i < s->num_extents; i++) {
2806        if (s->extents[i].file == bs->file) {
2807            continue;
2808        }
2809        r = bdrv_get_allocated_file_size(s->extents[i].file->bs);
2810        if (r < 0) {
2811            return r;
2812        }
2813        ret += r;
2814    }
2815    return ret;
2816}
2817
2818static int vmdk_has_zero_init(BlockDriverState *bs)
2819{
2820    int i;
2821    BDRVVmdkState *s = bs->opaque;
2822
2823    /* If has a flat extent and its underlying storage doesn't have zero init,
2824     * return 0. */
2825    for (i = 0; i < s->num_extents; i++) {
2826        if (s->extents[i].flat) {
2827            if (!bdrv_has_zero_init(s->extents[i].file->bs)) {
2828                return 0;
2829            }
2830        }
2831    }
2832    return 1;
2833}
2834
2835static ImageInfo *vmdk_get_extent_info(VmdkExtent *extent)
2836{
2837    ImageInfo *info = g_new0(ImageInfo, 1);
2838
2839    bdrv_refresh_filename(extent->file->bs);
2840    *info = (ImageInfo){
2841        .filename         = g_strdup(extent->file->bs->filename),
2842        .format           = g_strdup(extent->type),
2843        .virtual_size     = extent->sectors * BDRV_SECTOR_SIZE,
2844        .compressed       = extent->compressed,
2845        .has_compressed   = extent->compressed,
2846        .cluster_size     = extent->cluster_sectors * BDRV_SECTOR_SIZE,
2847        .has_cluster_size = !extent->flat,
2848    };
2849
2850    return info;
2851}
2852
2853static int coroutine_fn vmdk_co_check(BlockDriverState *bs,
2854                                      BdrvCheckResult *result,
2855                                      BdrvCheckMode fix)
2856{
2857    BDRVVmdkState *s = bs->opaque;
2858    VmdkExtent *extent = NULL;
2859    int64_t sector_num = 0;
2860    int64_t total_sectors = bdrv_nb_sectors(bs);
2861    int ret;
2862    uint64_t cluster_offset;
2863
2864    if (fix) {
2865        return -ENOTSUP;
2866    }
2867
2868    for (;;) {
2869        if (sector_num >= total_sectors) {
2870            return 0;
2871        }
2872        extent = find_extent(s, sector_num, extent);
2873        if (!extent) {
2874            fprintf(stderr,
2875                    "ERROR: could not find extent for sector %" PRId64 "\n",
2876                    sector_num);
2877            ret = -EINVAL;
2878            break;
2879        }
2880        ret = get_cluster_offset(bs, extent, NULL,
2881                                 sector_num << BDRV_SECTOR_BITS,
2882                                 false, &cluster_offset, 0, 0);
2883        if (ret == VMDK_ERROR) {
2884            fprintf(stderr,
2885                    "ERROR: could not get cluster_offset for sector %"
2886                    PRId64 "\n", sector_num);
2887            break;
2888        }
2889        if (ret == VMDK_OK) {
2890            int64_t extent_len = bdrv_getlength(extent->file->bs);
2891            if (extent_len < 0) {
2892                fprintf(stderr,
2893                        "ERROR: could not get extent file length for sector %"
2894                        PRId64 "\n", sector_num);
2895                ret = extent_len;
2896                break;
2897            }
2898            if (cluster_offset >= extent_len) {
2899                fprintf(stderr,
2900                        "ERROR: cluster offset for sector %"
2901                        PRId64 " points after EOF\n", sector_num);
2902                ret = -EINVAL;
2903                break;
2904            }
2905        }
2906        sector_num += extent->cluster_sectors;
2907    }
2908
2909    result->corruptions++;
2910    return ret;
2911}
2912
2913static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs,
2914                                                 Error **errp)
2915{
2916    int i;
2917    BDRVVmdkState *s = bs->opaque;
2918    ImageInfoSpecific *spec_info = g_new0(ImageInfoSpecific, 1);
2919    ImageInfoList **next;
2920
2921    *spec_info = (ImageInfoSpecific){
2922        .type = IMAGE_INFO_SPECIFIC_KIND_VMDK,
2923        .u = {
2924            .vmdk.data = g_new0(ImageInfoSpecificVmdk, 1),
2925        },
2926    };
2927
2928    *spec_info->u.vmdk.data = (ImageInfoSpecificVmdk) {
2929        .create_type = g_strdup(s->create_type),
2930        .cid = s->cid,
2931        .parent_cid = s->parent_cid,
2932    };
2933
2934    next = &spec_info->u.vmdk.data->extents;
2935    for (i = 0; i < s->num_extents; i++) {
2936        *next = g_new0(ImageInfoList, 1);
2937        (*next)->value = vmdk_get_extent_info(&s->extents[i]);
2938        (*next)->next = NULL;
2939        next = &(*next)->next;
2940    }
2941
2942    return spec_info;
2943}
2944
2945static bool vmdk_extents_type_eq(const VmdkExtent *a, const VmdkExtent *b)
2946{
2947    return a->flat == b->flat &&
2948           a->compressed == b->compressed &&
2949           (a->flat || a->cluster_sectors == b->cluster_sectors);
2950}
2951
2952static int vmdk_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
2953{
2954    int i;
2955    BDRVVmdkState *s = bs->opaque;
2956    assert(s->num_extents);
2957
2958    /* See if we have multiple extents but they have different cases */
2959    for (i = 1; i < s->num_extents; i++) {
2960        if (!vmdk_extents_type_eq(&s->extents[0], &s->extents[i])) {
2961            return -ENOTSUP;
2962        }
2963    }
2964    bdi->needs_compressed_writes = s->extents[0].compressed;
2965    if (!s->extents[0].flat) {
2966        bdi->cluster_size = s->extents[0].cluster_sectors << BDRV_SECTOR_BITS;
2967    }
2968    return 0;
2969}
2970
2971static void vmdk_gather_child_options(BlockDriverState *bs, QDict *target,
2972                                      bool backing_overridden)
2973{
2974    /* No children but file and backing can be explicitly specified (TODO) */
2975    qdict_put(target, "file",
2976              qobject_ref(bs->file->bs->full_open_options));
2977
2978    if (backing_overridden) {
2979        if (bs->backing) {
2980            qdict_put(target, "backing",
2981                      qobject_ref(bs->backing->bs->full_open_options));
2982        } else {
2983            qdict_put_null(target, "backing");
2984        }
2985    }
2986}
2987
2988static QemuOptsList vmdk_create_opts = {
2989    .name = "vmdk-create-opts",
2990    .head = QTAILQ_HEAD_INITIALIZER(vmdk_create_opts.head),
2991    .desc = {
2992        {
2993            .name = BLOCK_OPT_SIZE,
2994            .type = QEMU_OPT_SIZE,
2995            .help = "Virtual disk size"
2996        },
2997        {
2998            .name = BLOCK_OPT_ADAPTER_TYPE,
2999            .type = QEMU_OPT_STRING,
3000            .help = "Virtual adapter type, can be one of "
3001                    "ide (default), lsilogic, buslogic or legacyESX"
3002        },
3003        {
3004            .name = BLOCK_OPT_BACKING_FILE,
3005            .type = QEMU_OPT_STRING,
3006            .help = "File name of a base image"
3007        },
3008        {
3009            .name = BLOCK_OPT_COMPAT6,
3010            .type = QEMU_OPT_BOOL,
3011            .help = "VMDK version 6 image",
3012            .def_value_str = "off"
3013        },
3014        {
3015            .name = BLOCK_OPT_HWVERSION,
3016            .type = QEMU_OPT_STRING,
3017            .help = "VMDK hardware version",
3018            .def_value_str = "undefined"
3019        },
3020        {
3021            .name = BLOCK_OPT_SUBFMT,
3022            .type = QEMU_OPT_STRING,
3023            .help =
3024                "VMDK flat extent format, can be one of "
3025                "{monolithicSparse (default) | monolithicFlat | twoGbMaxExtentSparse | twoGbMaxExtentFlat | streamOptimized} "
3026        },
3027        {
3028            .name = BLOCK_OPT_ZEROED_GRAIN,
3029            .type = QEMU_OPT_BOOL,
3030            .help = "Enable efficient zero writes "
3031                    "using the zeroed-grain GTE feature"
3032        },
3033        { /* end of list */ }
3034    }
3035};
3036
3037static BlockDriver bdrv_vmdk = {
3038    .format_name                  = "vmdk",
3039    .instance_size                = sizeof(BDRVVmdkState),
3040    .bdrv_probe                   = vmdk_probe,
3041    .bdrv_open                    = vmdk_open,
3042    .bdrv_co_check                = vmdk_co_check,
3043    .bdrv_reopen_prepare          = vmdk_reopen_prepare,
3044    .bdrv_child_perm              = bdrv_format_default_perms,
3045    .bdrv_co_preadv               = vmdk_co_preadv,
3046    .bdrv_co_pwritev              = vmdk_co_pwritev,
3047    .bdrv_co_pwritev_compressed   = vmdk_co_pwritev_compressed,
3048    .bdrv_co_pwrite_zeroes        = vmdk_co_pwrite_zeroes,
3049    .bdrv_close                   = vmdk_close,
3050    .bdrv_co_create_opts          = vmdk_co_create_opts,
3051    .bdrv_co_create               = vmdk_co_create,
3052    .bdrv_co_flush_to_disk        = vmdk_co_flush,
3053    .bdrv_co_block_status         = vmdk_co_block_status,
3054    .bdrv_get_allocated_file_size = vmdk_get_allocated_file_size,
3055    .bdrv_has_zero_init           = vmdk_has_zero_init,
3056    .bdrv_get_specific_info       = vmdk_get_specific_info,
3057    .bdrv_refresh_limits          = vmdk_refresh_limits,
3058    .bdrv_get_info                = vmdk_get_info,
3059    .bdrv_gather_child_options    = vmdk_gather_child_options,
3060
3061    .supports_backing             = true,
3062    .create_opts                  = &vmdk_create_opts,
3063};
3064
3065static void bdrv_vmdk_init(void)
3066{
3067    bdrv_register(&bdrv_vmdk);
3068}
3069
3070block_init(bdrv_vmdk_init);
3071