xref: /openbmc/qemu/block/qcow2-snapshot.c (revision 243975c0)
1 /*
2  * Block driver for the QCOW version 2 format
3  *
4  * Copyright (c) 2004-2006 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 
25 #include "qemu/osdep.h"
26 #include "sysemu/block-backend.h"
27 #include "qapi/error.h"
28 #include "qcow2.h"
29 #include "qemu/bswap.h"
30 #include "qemu/error-report.h"
31 #include "qemu/cutils.h"
32 #include "qemu/memalign.h"
33 
34 static void qcow2_free_single_snapshot(BlockDriverState *bs, int i)
35 {
36     BDRVQcow2State *s = bs->opaque;
37 
38     assert(i >= 0 && i < s->nb_snapshots);
39     g_free(s->snapshots[i].name);
40     g_free(s->snapshots[i].id_str);
41     g_free(s->snapshots[i].unknown_extra_data);
42     memset(&s->snapshots[i], 0, sizeof(s->snapshots[i]));
43 }
44 
45 void qcow2_free_snapshots(BlockDriverState *bs)
46 {
47     BDRVQcow2State *s = bs->opaque;
48     int i;
49 
50     for(i = 0; i < s->nb_snapshots; i++) {
51         qcow2_free_single_snapshot(bs, i);
52     }
53     g_free(s->snapshots);
54     s->snapshots = NULL;
55     s->nb_snapshots = 0;
56 }
57 
58 /*
59  * If @repair is true, try to repair a broken snapshot table instead
60  * of just returning an error:
61  *
62  * - If the snapshot table was too long, set *nb_clusters_reduced to
63  *   the number of snapshots removed off the end.
64  *   The caller will update the on-disk nb_snapshots accordingly;
65  *   this leaks clusters, but is safe.
66  *   (The on-disk information must be updated before
67  *   qcow2_check_refcounts(), because that function relies on
68  *   s->nb_snapshots to reflect the on-disk value.)
69  *
70  * - If there were snapshots with too much extra metadata, increment
71  *   *extra_data_dropped for each.
72  *   This requires the caller to eventually rewrite the whole snapshot
73  *   table, which requires cluster allocation.  Therefore, this should
74  *   be done only after qcow2_check_refcounts() made sure the refcount
75  *   structures are valid.
76  *   (In the meantime, the image is still valid because
77  *   qcow2_check_refcounts() does not do anything with snapshots'
78  *   extra data.)
79  */
80 static coroutine_fn GRAPH_RDLOCK
81 int qcow2_do_read_snapshots(BlockDriverState *bs, bool repair,
82                             int *nb_clusters_reduced,
83                             int *extra_data_dropped,
84                             Error **errp)
85 {
86     BDRVQcow2State *s = bs->opaque;
87     QCowSnapshotHeader h;
88     QCowSnapshotExtraData extra;
89     QCowSnapshot *sn;
90     int i, id_str_size, name_size;
91     int64_t offset, pre_sn_offset;
92     uint64_t table_length = 0;
93     int ret;
94 
95     if (!s->nb_snapshots) {
96         s->snapshots = NULL;
97         s->snapshots_size = 0;
98         return 0;
99     }
100 
101     offset = s->snapshots_offset;
102     s->snapshots = g_new0(QCowSnapshot, s->nb_snapshots);
103 
104     for(i = 0; i < s->nb_snapshots; i++) {
105         bool truncate_unknown_extra_data = false;
106 
107         pre_sn_offset = offset;
108         table_length = ROUND_UP(table_length, 8);
109 
110         /* Read statically sized part of the snapshot header */
111         offset = ROUND_UP(offset, 8);
112         ret = bdrv_co_pread(bs->file, offset, sizeof(h), &h, 0);
113         if (ret < 0) {
114             error_setg_errno(errp, -ret, "Failed to read snapshot table");
115             goto fail;
116         }
117 
118         offset += sizeof(h);
119         sn = s->snapshots + i;
120         sn->l1_table_offset = be64_to_cpu(h.l1_table_offset);
121         sn->l1_size = be32_to_cpu(h.l1_size);
122         sn->vm_state_size = be32_to_cpu(h.vm_state_size);
123         sn->date_sec = be32_to_cpu(h.date_sec);
124         sn->date_nsec = be32_to_cpu(h.date_nsec);
125         sn->vm_clock_nsec = be64_to_cpu(h.vm_clock_nsec);
126         sn->extra_data_size = be32_to_cpu(h.extra_data_size);
127 
128         id_str_size = be16_to_cpu(h.id_str_size);
129         name_size = be16_to_cpu(h.name_size);
130 
131         if (sn->extra_data_size > QCOW_MAX_SNAPSHOT_EXTRA_DATA) {
132             if (!repair) {
133                 ret = -EFBIG;
134                 error_setg(errp, "Too much extra metadata in snapshot table "
135                            "entry %i", i);
136                 error_append_hint(errp, "You can force-remove this extra "
137                                   "metadata with qemu-img check -r all\n");
138                 goto fail;
139             }
140 
141             fprintf(stderr, "Discarding too much extra metadata in snapshot "
142                     "table entry %i (%" PRIu32 " > %u)\n",
143                     i, sn->extra_data_size, QCOW_MAX_SNAPSHOT_EXTRA_DATA);
144 
145             (*extra_data_dropped)++;
146             truncate_unknown_extra_data = true;
147         }
148 
149         /* Read known extra data */
150         ret = bdrv_co_pread(bs->file, offset,
151                             MIN(sizeof(extra), sn->extra_data_size), &extra, 0);
152         if (ret < 0) {
153             error_setg_errno(errp, -ret, "Failed to read snapshot table");
154             goto fail;
155         }
156         offset += MIN(sizeof(extra), sn->extra_data_size);
157 
158         if (sn->extra_data_size >= endof(QCowSnapshotExtraData,
159                                          vm_state_size_large)) {
160             sn->vm_state_size = be64_to_cpu(extra.vm_state_size_large);
161         }
162 
163         if (sn->extra_data_size >= endof(QCowSnapshotExtraData, disk_size)) {
164             sn->disk_size = be64_to_cpu(extra.disk_size);
165         } else {
166             sn->disk_size = bs->total_sectors * BDRV_SECTOR_SIZE;
167         }
168 
169         if (sn->extra_data_size >= endof(QCowSnapshotExtraData, icount)) {
170             sn->icount = be64_to_cpu(extra.icount);
171         } else {
172             sn->icount = -1ULL;
173         }
174 
175         if (sn->extra_data_size > sizeof(extra)) {
176             uint64_t extra_data_end;
177             size_t unknown_extra_data_size;
178 
179             extra_data_end = offset + sn->extra_data_size - sizeof(extra);
180 
181             if (truncate_unknown_extra_data) {
182                 sn->extra_data_size = QCOW_MAX_SNAPSHOT_EXTRA_DATA;
183             }
184 
185             /* Store unknown extra data */
186             unknown_extra_data_size = sn->extra_data_size - sizeof(extra);
187             sn->unknown_extra_data = g_malloc(unknown_extra_data_size);
188             ret = bdrv_co_pread(bs->file, offset, unknown_extra_data_size,
189                                 sn->unknown_extra_data, 0);
190             if (ret < 0) {
191                 error_setg_errno(errp, -ret,
192                                  "Failed to read snapshot table");
193                 goto fail;
194             }
195             offset = extra_data_end;
196         }
197 
198         /* Read snapshot ID */
199         sn->id_str = g_malloc(id_str_size + 1);
200         ret = bdrv_co_pread(bs->file, offset, id_str_size, sn->id_str, 0);
201         if (ret < 0) {
202             error_setg_errno(errp, -ret, "Failed to read snapshot table");
203             goto fail;
204         }
205         offset += id_str_size;
206         sn->id_str[id_str_size] = '\0';
207 
208         /* Read snapshot name */
209         sn->name = g_malloc(name_size + 1);
210         ret = bdrv_co_pread(bs->file, offset, name_size, sn->name, 0);
211         if (ret < 0) {
212             error_setg_errno(errp, -ret, "Failed to read snapshot table");
213             goto fail;
214         }
215         offset += name_size;
216         sn->name[name_size] = '\0';
217 
218         /* Note that the extra data may have been truncated */
219         table_length += sizeof(h) + sn->extra_data_size + id_str_size +
220                         name_size;
221         if (!repair) {
222             assert(table_length == offset - s->snapshots_offset);
223         }
224 
225         if (table_length > QCOW_MAX_SNAPSHOTS_SIZE ||
226             offset - s->snapshots_offset > INT_MAX)
227         {
228             if (!repair) {
229                 ret = -EFBIG;
230                 error_setg(errp, "Snapshot table is too big");
231                 error_append_hint(errp, "You can force-remove all %u "
232                                   "overhanging snapshots with qemu-img check "
233                                   "-r all\n", s->nb_snapshots - i);
234                 goto fail;
235             }
236 
237             fprintf(stderr, "Discarding %u overhanging snapshots (snapshot "
238                     "table is too big)\n", s->nb_snapshots - i);
239 
240             *nb_clusters_reduced += (s->nb_snapshots - i);
241 
242             /* Discard current snapshot also */
243             qcow2_free_single_snapshot(bs, i);
244 
245             /*
246              * This leaks all the rest of the snapshot table and the
247              * snapshots' clusters, but we run in check -r all mode,
248              * so qcow2_check_refcounts() will take care of it.
249              */
250             s->nb_snapshots = i;
251             offset = pre_sn_offset;
252             break;
253         }
254     }
255 
256     assert(offset - s->snapshots_offset <= INT_MAX);
257     s->snapshots_size = offset - s->snapshots_offset;
258     return 0;
259 
260 fail:
261     qcow2_free_snapshots(bs);
262     return ret;
263 }
264 
265 int coroutine_fn qcow2_read_snapshots(BlockDriverState *bs, Error **errp)
266 {
267     return qcow2_do_read_snapshots(bs, false, NULL, NULL, errp);
268 }
269 
270 /* add at the end of the file a new list of snapshots */
271 int qcow2_write_snapshots(BlockDriverState *bs)
272 {
273     BDRVQcow2State *s = bs->opaque;
274     QCowSnapshot *sn;
275     QCowSnapshotHeader h;
276     QCowSnapshotExtraData extra;
277     int i, name_size, id_str_size, snapshots_size;
278     struct {
279         uint32_t nb_snapshots;
280         uint64_t snapshots_offset;
281     } QEMU_PACKED header_data;
282     int64_t offset, snapshots_offset = 0;
283     int ret;
284 
285     /* compute the size of the snapshots */
286     offset = 0;
287     for(i = 0; i < s->nb_snapshots; i++) {
288         sn = s->snapshots + i;
289         offset = ROUND_UP(offset, 8);
290         offset += sizeof(h);
291         offset += MAX(sizeof(extra), sn->extra_data_size);
292         offset += strlen(sn->id_str);
293         offset += strlen(sn->name);
294 
295         if (offset > QCOW_MAX_SNAPSHOTS_SIZE) {
296             ret = -EFBIG;
297             goto fail;
298         }
299     }
300 
301     assert(offset <= INT_MAX);
302     snapshots_size = offset;
303 
304     /* Allocate space for the new snapshot list */
305     snapshots_offset = qcow2_alloc_clusters(bs, snapshots_size);
306     offset = snapshots_offset;
307     if (offset < 0) {
308         ret = offset;
309         goto fail;
310     }
311     ret = bdrv_flush(bs);
312     if (ret < 0) {
313         goto fail;
314     }
315 
316     /* The snapshot list position has not yet been updated, so these clusters
317      * must indeed be completely free */
318     ret = qcow2_pre_write_overlap_check(bs, 0, offset, snapshots_size, false);
319     if (ret < 0) {
320         goto fail;
321     }
322 
323 
324     /* Write all snapshots to the new list */
325     for(i = 0; i < s->nb_snapshots; i++) {
326         sn = s->snapshots + i;
327         memset(&h, 0, sizeof(h));
328         h.l1_table_offset = cpu_to_be64(sn->l1_table_offset);
329         h.l1_size = cpu_to_be32(sn->l1_size);
330         /* If it doesn't fit in 32 bit, older implementations should treat it
331          * as a disk-only snapshot rather than truncate the VM state */
332         if (sn->vm_state_size <= 0xffffffff) {
333             h.vm_state_size = cpu_to_be32(sn->vm_state_size);
334         }
335         h.date_sec = cpu_to_be32(sn->date_sec);
336         h.date_nsec = cpu_to_be32(sn->date_nsec);
337         h.vm_clock_nsec = cpu_to_be64(sn->vm_clock_nsec);
338         h.extra_data_size = cpu_to_be32(MAX(sizeof(extra),
339                                             sn->extra_data_size));
340 
341         memset(&extra, 0, sizeof(extra));
342         extra.vm_state_size_large = cpu_to_be64(sn->vm_state_size);
343         extra.disk_size = cpu_to_be64(sn->disk_size);
344         extra.icount = cpu_to_be64(sn->icount);
345 
346         id_str_size = strlen(sn->id_str);
347         name_size = strlen(sn->name);
348         assert(id_str_size <= UINT16_MAX && name_size <= UINT16_MAX);
349         h.id_str_size = cpu_to_be16(id_str_size);
350         h.name_size = cpu_to_be16(name_size);
351         offset = ROUND_UP(offset, 8);
352 
353         ret = bdrv_pwrite(bs->file, offset, sizeof(h), &h, 0);
354         if (ret < 0) {
355             goto fail;
356         }
357         offset += sizeof(h);
358 
359         ret = bdrv_pwrite(bs->file, offset, sizeof(extra), &extra, 0);
360         if (ret < 0) {
361             goto fail;
362         }
363         offset += sizeof(extra);
364 
365         if (sn->extra_data_size > sizeof(extra)) {
366             size_t unknown_extra_data_size =
367                 sn->extra_data_size - sizeof(extra);
368 
369             /* qcow2_read_snapshots() ensures no unbounded allocation */
370             assert(unknown_extra_data_size <= BDRV_REQUEST_MAX_BYTES);
371             assert(sn->unknown_extra_data);
372 
373             ret = bdrv_pwrite(bs->file, offset, unknown_extra_data_size,
374                               sn->unknown_extra_data, 0);
375             if (ret < 0) {
376                 goto fail;
377             }
378             offset += unknown_extra_data_size;
379         }
380 
381         ret = bdrv_pwrite(bs->file, offset, id_str_size, sn->id_str, 0);
382         if (ret < 0) {
383             goto fail;
384         }
385         offset += id_str_size;
386 
387         ret = bdrv_pwrite(bs->file, offset, name_size, sn->name, 0);
388         if (ret < 0) {
389             goto fail;
390         }
391         offset += name_size;
392     }
393 
394     /*
395      * Update the header to point to the new snapshot table. This requires the
396      * new table and its refcounts to be stable on disk.
397      */
398     ret = bdrv_flush(bs);
399     if (ret < 0) {
400         goto fail;
401     }
402 
403     QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) !=
404                       endof(QCowHeader, nb_snapshots));
405 
406     header_data.nb_snapshots        = cpu_to_be32(s->nb_snapshots);
407     header_data.snapshots_offset    = cpu_to_be64(snapshots_offset);
408 
409     ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
410                            sizeof(header_data), &header_data, 0);
411     if (ret < 0) {
412         goto fail;
413     }
414 
415     /* free the old snapshot table */
416     qcow2_free_clusters(bs, s->snapshots_offset, s->snapshots_size,
417                         QCOW2_DISCARD_SNAPSHOT);
418     s->snapshots_offset = snapshots_offset;
419     s->snapshots_size = snapshots_size;
420     return 0;
421 
422 fail:
423     if (snapshots_offset > 0) {
424         qcow2_free_clusters(bs, snapshots_offset, snapshots_size,
425                             QCOW2_DISCARD_ALWAYS);
426     }
427     return ret;
428 }
429 
430 int coroutine_fn qcow2_check_read_snapshot_table(BlockDriverState *bs,
431                                                  BdrvCheckResult *result,
432                                                  BdrvCheckMode fix)
433 {
434     BDRVQcow2State *s = bs->opaque;
435     Error *local_err = NULL;
436     int nb_clusters_reduced = 0;
437     int extra_data_dropped = 0;
438     int ret;
439     struct {
440         uint32_t nb_snapshots;
441         uint64_t snapshots_offset;
442     } QEMU_PACKED snapshot_table_pointer;
443 
444     /* qcow2_do_open() discards this information in check mode */
445     ret = bdrv_co_pread(bs->file, offsetof(QCowHeader, nb_snapshots),
446                         sizeof(snapshot_table_pointer), &snapshot_table_pointer,
447                         0);
448     if (ret < 0) {
449         result->check_errors++;
450         fprintf(stderr, "ERROR failed to read the snapshot table pointer from "
451                 "the image header: %s\n", strerror(-ret));
452         return ret;
453     }
454 
455     s->snapshots_offset = be64_to_cpu(snapshot_table_pointer.snapshots_offset);
456     s->nb_snapshots = be32_to_cpu(snapshot_table_pointer.nb_snapshots);
457 
458     if (s->nb_snapshots > QCOW_MAX_SNAPSHOTS && (fix & BDRV_FIX_ERRORS)) {
459         fprintf(stderr, "Discarding %u overhanging snapshots\n",
460                 s->nb_snapshots - QCOW_MAX_SNAPSHOTS);
461 
462         nb_clusters_reduced += s->nb_snapshots - QCOW_MAX_SNAPSHOTS;
463         s->nb_snapshots = QCOW_MAX_SNAPSHOTS;
464     }
465 
466     ret = qcow2_validate_table(bs, s->snapshots_offset, s->nb_snapshots,
467                                sizeof(QCowSnapshotHeader),
468                                sizeof(QCowSnapshotHeader) * QCOW_MAX_SNAPSHOTS,
469                                "snapshot table", &local_err);
470     if (ret < 0) {
471         result->check_errors++;
472         error_reportf_err(local_err, "ERROR ");
473 
474         if (s->nb_snapshots > QCOW_MAX_SNAPSHOTS) {
475             fprintf(stderr, "You can force-remove all %u overhanging snapshots "
476                     "with qemu-img check -r all\n",
477                     s->nb_snapshots - QCOW_MAX_SNAPSHOTS);
478         }
479 
480         /* We did not read the snapshot table, so invalidate this information */
481         s->snapshots_offset = 0;
482         s->nb_snapshots = 0;
483 
484         return ret;
485     }
486 
487     qemu_co_mutex_unlock(&s->lock);
488     ret = qcow2_do_read_snapshots(bs, fix & BDRV_FIX_ERRORS,
489                                   &nb_clusters_reduced, &extra_data_dropped,
490                                   &local_err);
491     qemu_co_mutex_lock(&s->lock);
492     if (ret < 0) {
493         result->check_errors++;
494         error_reportf_err(local_err,
495                           "ERROR failed to read the snapshot table: ");
496 
497         /* We did not read the snapshot table, so invalidate this information */
498         s->snapshots_offset = 0;
499         s->nb_snapshots = 0;
500 
501         return ret;
502     }
503     result->corruptions += nb_clusters_reduced + extra_data_dropped;
504 
505     if (nb_clusters_reduced) {
506         /*
507          * Update image header now, because:
508          * (1) qcow2_check_refcounts() relies on s->nb_snapshots to be
509          *     the same as what the image header says,
510          * (2) this leaks clusters, but qcow2_check_refcounts() will
511          *     fix that.
512          */
513         assert(fix & BDRV_FIX_ERRORS);
514 
515         snapshot_table_pointer.nb_snapshots = cpu_to_be32(s->nb_snapshots);
516         ret = bdrv_co_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
517                                   sizeof(snapshot_table_pointer.nb_snapshots),
518                                   &snapshot_table_pointer.nb_snapshots, 0);
519         if (ret < 0) {
520             result->check_errors++;
521             fprintf(stderr, "ERROR failed to update the snapshot count in the "
522                     "image header: %s\n", strerror(-ret));
523             return ret;
524         }
525 
526         result->corruptions_fixed += nb_clusters_reduced;
527         result->corruptions -= nb_clusters_reduced;
528     }
529 
530     /*
531      * All of v3 images' snapshot table entries need to have at least
532      * 16 bytes of extra data.
533      */
534     if (s->qcow_version >= 3) {
535         int i;
536         for (i = 0; i < s->nb_snapshots; i++) {
537             if (s->snapshots[i].extra_data_size <
538                 sizeof_field(QCowSnapshotExtraData, vm_state_size_large) +
539                 sizeof_field(QCowSnapshotExtraData, disk_size))
540             {
541                 result->corruptions++;
542                 fprintf(stderr, "%s snapshot table entry %i is incomplete\n",
543                         fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
544             }
545         }
546     }
547 
548     return 0;
549 }
550 
551 int coroutine_fn qcow2_check_fix_snapshot_table(BlockDriverState *bs,
552                                                 BdrvCheckResult *result,
553                                                 BdrvCheckMode fix)
554 {
555     BDRVQcow2State *s = bs->opaque;
556     int ret;
557 
558     if (result->corruptions && (fix & BDRV_FIX_ERRORS)) {
559         qemu_co_mutex_unlock(&s->lock);
560         ret = qcow2_write_snapshots(bs);
561         qemu_co_mutex_lock(&s->lock);
562         if (ret < 0) {
563             result->check_errors++;
564             fprintf(stderr, "ERROR failed to update snapshot table: %s\n",
565                     strerror(-ret));
566             return ret;
567         }
568 
569         result->corruptions_fixed += result->corruptions;
570         result->corruptions = 0;
571     }
572 
573     return 0;
574 }
575 
576 static void find_new_snapshot_id(BlockDriverState *bs,
577                                  char *id_str, int id_str_size)
578 {
579     BDRVQcow2State *s = bs->opaque;
580     QCowSnapshot *sn;
581     int i;
582     unsigned long id, id_max = 0;
583 
584     for(i = 0; i < s->nb_snapshots; i++) {
585         sn = s->snapshots + i;
586         id = strtoul(sn->id_str, NULL, 10);
587         if (id > id_max)
588             id_max = id;
589     }
590     snprintf(id_str, id_str_size, "%lu", id_max + 1);
591 }
592 
593 static int find_snapshot_by_id_and_name(BlockDriverState *bs,
594                                         const char *id,
595                                         const char *name)
596 {
597     BDRVQcow2State *s = bs->opaque;
598     int i;
599 
600     if (id && name) {
601         for (i = 0; i < s->nb_snapshots; i++) {
602             if (!strcmp(s->snapshots[i].id_str, id) &&
603                 !strcmp(s->snapshots[i].name, name)) {
604                 return i;
605             }
606         }
607     } else if (id) {
608         for (i = 0; i < s->nb_snapshots; i++) {
609             if (!strcmp(s->snapshots[i].id_str, id)) {
610                 return i;
611             }
612         }
613     } else if (name) {
614         for (i = 0; i < s->nb_snapshots; i++) {
615             if (!strcmp(s->snapshots[i].name, name)) {
616                 return i;
617             }
618         }
619     }
620 
621     return -1;
622 }
623 
624 static int find_snapshot_by_id_or_name(BlockDriverState *bs,
625                                        const char *id_or_name)
626 {
627     int ret;
628 
629     ret = find_snapshot_by_id_and_name(bs, id_or_name, NULL);
630     if (ret >= 0) {
631         return ret;
632     }
633     return find_snapshot_by_id_and_name(bs, NULL, id_or_name);
634 }
635 
636 /* if no id is provided, a new one is constructed */
637 int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
638 {
639     BDRVQcow2State *s = bs->opaque;
640     QCowSnapshot *new_snapshot_list = NULL;
641     QCowSnapshot *old_snapshot_list = NULL;
642     QCowSnapshot sn1, *sn = &sn1;
643     int i, ret;
644     uint64_t *l1_table = NULL;
645     int64_t l1_table_offset;
646 
647     if (s->nb_snapshots >= QCOW_MAX_SNAPSHOTS) {
648         return -EFBIG;
649     }
650 
651     if (has_data_file(bs)) {
652         return -ENOTSUP;
653     }
654 
655     memset(sn, 0, sizeof(*sn));
656 
657     /* Generate an ID */
658     find_new_snapshot_id(bs, sn_info->id_str, sizeof(sn_info->id_str));
659 
660     /* Populate sn with passed data */
661     sn->id_str = g_strdup(sn_info->id_str);
662     sn->name = g_strdup(sn_info->name);
663 
664     sn->disk_size = bs->total_sectors * BDRV_SECTOR_SIZE;
665     sn->vm_state_size = sn_info->vm_state_size;
666     sn->date_sec = sn_info->date_sec;
667     sn->date_nsec = sn_info->date_nsec;
668     sn->vm_clock_nsec = sn_info->vm_clock_nsec;
669     sn->icount = sn_info->icount;
670     sn->extra_data_size = sizeof(QCowSnapshotExtraData);
671 
672     /* Allocate the L1 table of the snapshot and copy the current one there. */
673     l1_table_offset = qcow2_alloc_clusters(bs, s->l1_size * L1E_SIZE);
674     if (l1_table_offset < 0) {
675         ret = l1_table_offset;
676         goto fail;
677     }
678 
679     sn->l1_table_offset = l1_table_offset;
680     sn->l1_size = s->l1_size;
681 
682     l1_table = g_try_new(uint64_t, s->l1_size);
683     if (s->l1_size && l1_table == NULL) {
684         ret = -ENOMEM;
685         goto fail;
686     }
687 
688     for(i = 0; i < s->l1_size; i++) {
689         l1_table[i] = cpu_to_be64(s->l1_table[i]);
690     }
691 
692     ret = qcow2_pre_write_overlap_check(bs, 0, sn->l1_table_offset,
693                                         s->l1_size * L1E_SIZE, false);
694     if (ret < 0) {
695         goto fail;
696     }
697 
698     ret = bdrv_pwrite(bs->file, sn->l1_table_offset, s->l1_size * L1E_SIZE,
699                       l1_table, 0);
700     if (ret < 0) {
701         goto fail;
702     }
703 
704     g_free(l1_table);
705     l1_table = NULL;
706 
707     /*
708      * Increase the refcounts of all clusters and make sure everything is
709      * stable on disk before updating the snapshot table to contain a pointer
710      * to the new L1 table.
711      */
712     ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 1);
713     if (ret < 0) {
714         goto fail;
715     }
716 
717     /* Append the new snapshot to the snapshot list */
718     new_snapshot_list = g_new(QCowSnapshot, s->nb_snapshots + 1);
719     if (s->snapshots) {
720         memcpy(new_snapshot_list, s->snapshots,
721                s->nb_snapshots * sizeof(QCowSnapshot));
722         old_snapshot_list = s->snapshots;
723     }
724     s->snapshots = new_snapshot_list;
725     s->snapshots[s->nb_snapshots++] = *sn;
726 
727     ret = qcow2_write_snapshots(bs);
728     if (ret < 0) {
729         g_free(s->snapshots);
730         s->snapshots = old_snapshot_list;
731         s->nb_snapshots--;
732         goto fail;
733     }
734 
735     g_free(old_snapshot_list);
736 
737     /* The VM state isn't needed any more in the active L1 table; in fact, it
738      * hurts by causing expensive COW for the next snapshot. */
739     qcow2_cluster_discard(bs, qcow2_vm_state_offset(s),
740                           ROUND_UP(sn->vm_state_size, s->cluster_size),
741                           QCOW2_DISCARD_NEVER, false);
742 
743 #ifdef DEBUG_ALLOC
744     {
745       BdrvCheckResult result = {0};
746       qcow2_check_refcounts(bs, &result, 0);
747     }
748 #endif
749     return 0;
750 
751 fail:
752     g_free(sn->id_str);
753     g_free(sn->name);
754     g_free(l1_table);
755 
756     return ret;
757 }
758 
759 /* copy the snapshot 'snapshot_name' into the current disk image */
760 int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
761 {
762     BDRVQcow2State *s = bs->opaque;
763     QCowSnapshot *sn;
764     Error *local_err = NULL;
765     int i, snapshot_index;
766     int cur_l1_bytes, sn_l1_bytes;
767     int ret;
768     uint64_t *sn_l1_table = NULL;
769 
770     if (has_data_file(bs)) {
771         return -ENOTSUP;
772     }
773 
774     /* Search the snapshot */
775     snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
776     if (snapshot_index < 0) {
777         return -ENOENT;
778     }
779     sn = &s->snapshots[snapshot_index];
780 
781     ret = qcow2_validate_table(bs, sn->l1_table_offset, sn->l1_size,
782                                L1E_SIZE, QCOW_MAX_L1_SIZE,
783                                "Snapshot L1 table", &local_err);
784     if (ret < 0) {
785         error_report_err(local_err);
786         goto fail;
787     }
788 
789     if (sn->disk_size != bs->total_sectors * BDRV_SECTOR_SIZE) {
790         BlockBackend *blk = blk_new_with_bs(bs, BLK_PERM_RESIZE, BLK_PERM_ALL,
791                                             &local_err);
792         if (!blk) {
793             error_report_err(local_err);
794             ret = -ENOTSUP;
795             goto fail;
796         }
797 
798         ret = blk_truncate(blk, sn->disk_size, true, PREALLOC_MODE_OFF, 0,
799                            &local_err);
800         blk_unref(blk);
801         if (ret < 0) {
802             error_report_err(local_err);
803             goto fail;
804         }
805     }
806 
807     /*
808      * Make sure that the current L1 table is big enough to contain the whole
809      * L1 table of the snapshot. If the snapshot L1 table is smaller, the
810      * current one must be padded with zeros.
811      */
812     ret = qcow2_grow_l1_table(bs, sn->l1_size, true);
813     if (ret < 0) {
814         goto fail;
815     }
816 
817     cur_l1_bytes = s->l1_size * L1E_SIZE;
818     sn_l1_bytes = sn->l1_size * L1E_SIZE;
819 
820     /*
821      * Copy the snapshot L1 table to the current L1 table.
822      *
823      * Before overwriting the old current L1 table on disk, make sure to
824      * increase all refcounts for the clusters referenced by the new one.
825      * Decrease the refcount referenced by the old one only when the L1
826      * table is overwritten.
827      */
828     sn_l1_table = g_try_malloc0(cur_l1_bytes);
829     if (cur_l1_bytes && sn_l1_table == NULL) {
830         ret = -ENOMEM;
831         goto fail;
832     }
833 
834     ret = bdrv_pread(bs->file, sn->l1_table_offset, sn_l1_bytes, sn_l1_table,
835                      0);
836     if (ret < 0) {
837         goto fail;
838     }
839 
840     ret = qcow2_update_snapshot_refcount(bs, sn->l1_table_offset,
841                                          sn->l1_size, 1);
842     if (ret < 0) {
843         goto fail;
844     }
845 
846     ret = qcow2_pre_write_overlap_check(bs, QCOW2_OL_ACTIVE_L1,
847                                         s->l1_table_offset, cur_l1_bytes,
848                                         false);
849     if (ret < 0) {
850         goto fail;
851     }
852 
853     ret = bdrv_pwrite_sync(bs->file, s->l1_table_offset, cur_l1_bytes,
854                            sn_l1_table, 0);
855     if (ret < 0) {
856         goto fail;
857     }
858 
859     /*
860      * Decrease refcount of clusters of current L1 table.
861      *
862      * At this point, the in-memory s->l1_table points to the old L1 table,
863      * whereas on disk we already have the new one.
864      *
865      * qcow2_update_snapshot_refcount special cases the current L1 table to use
866      * the in-memory data instead of really using the offset to load a new one,
867      * which is why this works.
868      */
869     ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset,
870                                          s->l1_size, -1);
871 
872     /*
873      * Now update the in-memory L1 table to be in sync with the on-disk one. We
874      * need to do this even if updating refcounts failed.
875      */
876     for(i = 0;i < s->l1_size; i++) {
877         s->l1_table[i] = be64_to_cpu(sn_l1_table[i]);
878     }
879 
880     if (ret < 0) {
881         goto fail;
882     }
883 
884     g_free(sn_l1_table);
885     sn_l1_table = NULL;
886 
887     /*
888      * Update QCOW_OFLAG_COPIED in the active L1 table (it may have changed
889      * when we decreased the refcount of the old snapshot.
890      */
891     ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
892     if (ret < 0) {
893         goto fail;
894     }
895 
896 #ifdef DEBUG_ALLOC
897     {
898         BdrvCheckResult result = {0};
899         qcow2_check_refcounts(bs, &result, 0);
900     }
901 #endif
902     return 0;
903 
904 fail:
905     g_free(sn_l1_table);
906     return ret;
907 }
908 
909 int qcow2_snapshot_delete(BlockDriverState *bs,
910                           const char *snapshot_id,
911                           const char *name,
912                           Error **errp)
913 {
914     BDRVQcow2State *s = bs->opaque;
915     QCowSnapshot sn;
916     int snapshot_index, ret;
917 
918     if (has_data_file(bs)) {
919         return -ENOTSUP;
920     }
921 
922     /* Search the snapshot */
923     snapshot_index = find_snapshot_by_id_and_name(bs, snapshot_id, name);
924     if (snapshot_index < 0) {
925         error_setg(errp, "Can't find the snapshot");
926         return -ENOENT;
927     }
928     sn = s->snapshots[snapshot_index];
929 
930     ret = qcow2_validate_table(bs, sn.l1_table_offset, sn.l1_size,
931                                L1E_SIZE, QCOW_MAX_L1_SIZE,
932                                "Snapshot L1 table", errp);
933     if (ret < 0) {
934         return ret;
935     }
936 
937     /* Remove it from the snapshot list */
938     memmove(s->snapshots + snapshot_index,
939             s->snapshots + snapshot_index + 1,
940             (s->nb_snapshots - snapshot_index - 1) * sizeof(sn));
941     s->nb_snapshots--;
942     ret = qcow2_write_snapshots(bs);
943     if (ret < 0) {
944         error_setg_errno(errp, -ret,
945                          "Failed to remove snapshot from snapshot list");
946         return ret;
947     }
948 
949     /*
950      * The snapshot is now unused, clean up. If we fail after this point, we
951      * won't recover but just leak clusters.
952      */
953     g_free(sn.unknown_extra_data);
954     g_free(sn.id_str);
955     g_free(sn.name);
956 
957     /*
958      * Now decrease the refcounts of clusters referenced by the snapshot and
959      * free the L1 table.
960      */
961     ret = qcow2_update_snapshot_refcount(bs, sn.l1_table_offset,
962                                          sn.l1_size, -1);
963     if (ret < 0) {
964         error_setg_errno(errp, -ret, "Failed to free the cluster and L1 table");
965         return ret;
966     }
967     qcow2_free_clusters(bs, sn.l1_table_offset, sn.l1_size * L1E_SIZE,
968                         QCOW2_DISCARD_SNAPSHOT);
969 
970     /* must update the copied flag on the current cluster offsets */
971     ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
972     if (ret < 0) {
973         error_setg_errno(errp, -ret,
974                          "Failed to update snapshot status in disk");
975         return ret;
976     }
977 
978 #ifdef DEBUG_ALLOC
979     {
980         BdrvCheckResult result = {0};
981         qcow2_check_refcounts(bs, &result, 0);
982     }
983 #endif
984     return 0;
985 }
986 
987 int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
988 {
989     BDRVQcow2State *s = bs->opaque;
990     QEMUSnapshotInfo *sn_tab, *sn_info;
991     QCowSnapshot *sn;
992     int i;
993 
994     if (has_data_file(bs)) {
995         return -ENOTSUP;
996     }
997     if (!s->nb_snapshots) {
998         *psn_tab = NULL;
999         return s->nb_snapshots;
1000     }
1001 
1002     sn_tab = g_new0(QEMUSnapshotInfo, s->nb_snapshots);
1003     for(i = 0; i < s->nb_snapshots; i++) {
1004         sn_info = sn_tab + i;
1005         sn = s->snapshots + i;
1006         pstrcpy(sn_info->id_str, sizeof(sn_info->id_str),
1007                 sn->id_str);
1008         pstrcpy(sn_info->name, sizeof(sn_info->name),
1009                 sn->name);
1010         sn_info->vm_state_size = sn->vm_state_size;
1011         sn_info->date_sec = sn->date_sec;
1012         sn_info->date_nsec = sn->date_nsec;
1013         sn_info->vm_clock_nsec = sn->vm_clock_nsec;
1014         sn_info->icount = sn->icount;
1015     }
1016     *psn_tab = sn_tab;
1017     return s->nb_snapshots;
1018 }
1019 
1020 int qcow2_snapshot_load_tmp(BlockDriverState *bs,
1021                             const char *snapshot_id,
1022                             const char *name,
1023                             Error **errp)
1024 {
1025     int i, snapshot_index;
1026     BDRVQcow2State *s = bs->opaque;
1027     QCowSnapshot *sn;
1028     uint64_t *new_l1_table;
1029     int new_l1_bytes;
1030     int ret;
1031 
1032     assert(bdrv_is_read_only(bs));
1033 
1034     /* Search the snapshot */
1035     snapshot_index = find_snapshot_by_id_and_name(bs, snapshot_id, name);
1036     if (snapshot_index < 0) {
1037         error_setg(errp,
1038                    "Can't find snapshot");
1039         return -ENOENT;
1040     }
1041     sn = &s->snapshots[snapshot_index];
1042 
1043     /* Allocate and read in the snapshot's L1 table */
1044     ret = qcow2_validate_table(bs, sn->l1_table_offset, sn->l1_size,
1045                                L1E_SIZE, QCOW_MAX_L1_SIZE,
1046                                "Snapshot L1 table", errp);
1047     if (ret < 0) {
1048         return ret;
1049     }
1050     new_l1_bytes = sn->l1_size * L1E_SIZE;
1051     new_l1_table = qemu_try_blockalign(bs->file->bs, new_l1_bytes);
1052     if (new_l1_table == NULL) {
1053         return -ENOMEM;
1054     }
1055 
1056     ret = bdrv_pread(bs->file, sn->l1_table_offset, new_l1_bytes,
1057                      new_l1_table, 0);
1058     if (ret < 0) {
1059         error_setg(errp, "Failed to read l1 table for snapshot");
1060         qemu_vfree(new_l1_table);
1061         return ret;
1062     }
1063 
1064     /* Switch the L1 table */
1065     qemu_vfree(s->l1_table);
1066 
1067     s->l1_size = sn->l1_size;
1068     s->l1_table_offset = sn->l1_table_offset;
1069     s->l1_table = new_l1_table;
1070 
1071     for(i = 0;i < s->l1_size; i++) {
1072         be64_to_cpus(&s->l1_table[i]);
1073     }
1074 
1075     return 0;
1076 }
1077