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