Annotation of qemu/block/qcow2-refcount.c, revision 1.1.1.9

1.1       root        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-common.h"
                     26: #include "block_int.h"
                     27: #include "block/qcow2.h"
                     28: 
                     29: static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size);
1.1.1.4   root       30: static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
1.1       root       31:                             int64_t offset, int64_t length,
                     32:                             int addend);
                     33: 
                     34: 
                     35: /*********************************************************/
                     36: /* refcount handling */
                     37: 
                     38: int qcow2_refcount_init(BlockDriverState *bs)
                     39: {
                     40:     BDRVQcowState *s = bs->opaque;
                     41:     int ret, refcount_table_size2, i;
                     42: 
                     43:     refcount_table_size2 = s->refcount_table_size * sizeof(uint64_t);
1.1.1.9 ! root       44:     s->refcount_table = g_malloc(refcount_table_size2);
1.1       root       45:     if (s->refcount_table_size > 0) {
1.1.1.6   root       46:         BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
                     47:         ret = bdrv_pread(bs->file, s->refcount_table_offset,
1.1       root       48:                          s->refcount_table, refcount_table_size2);
                     49:         if (ret != refcount_table_size2)
                     50:             goto fail;
                     51:         for(i = 0; i < s->refcount_table_size; i++)
                     52:             be64_to_cpus(&s->refcount_table[i]);
                     53:     }
                     54:     return 0;
                     55:  fail:
                     56:     return -ENOMEM;
                     57: }
                     58: 
                     59: void qcow2_refcount_close(BlockDriverState *bs)
                     60: {
                     61:     BDRVQcowState *s = bs->opaque;
1.1.1.9 ! root       62:     g_free(s->refcount_table);
1.1       root       63: }
                     64: 
                     65: 
                     66: static int load_refcount_block(BlockDriverState *bs,
1.1.1.7   root       67:                                int64_t refcount_block_offset,
                     68:                                void **refcount_block)
1.1       root       69: {
                     70:     BDRVQcowState *s = bs->opaque;
                     71:     int ret;
                     72: 
1.1.1.6   root       73:     BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_LOAD);
1.1.1.7   root       74:     ret = qcow2_cache_get(bs, s->refcount_block_cache, refcount_block_offset,
                     75:         refcount_block);
1.1.1.6   root       76: 
1.1.1.7   root       77:     return ret;
1.1       root       78: }
                     79: 
1.1.1.6   root       80: /*
                     81:  * Returns the refcount of the cluster given by its index. Any non-negative
                     82:  * return value is the refcount of the cluster, negative values are -errno
                     83:  * and indicate an error.
                     84:  */
1.1       root       85: static int get_refcount(BlockDriverState *bs, int64_t cluster_index)
                     86: {
                     87:     BDRVQcowState *s = bs->opaque;
                     88:     int refcount_table_index, block_index;
                     89:     int64_t refcount_block_offset;
1.1.1.6   root       90:     int ret;
1.1.1.7   root       91:     uint16_t *refcount_block;
                     92:     uint16_t refcount;
1.1       root       93: 
                     94:     refcount_table_index = cluster_index >> (s->cluster_bits - REFCOUNT_SHIFT);
                     95:     if (refcount_table_index >= s->refcount_table_size)
                     96:         return 0;
                     97:     refcount_block_offset = s->refcount_table[refcount_table_index];
                     98:     if (!refcount_block_offset)
                     99:         return 0;
1.1.1.7   root      100: 
                    101:     ret = qcow2_cache_get(bs, s->refcount_block_cache, refcount_block_offset,
                    102:         (void**) &refcount_block);
                    103:     if (ret < 0) {
                    104:         return ret;
1.1       root      105:     }
1.1.1.7   root      106: 
1.1       root      107:     block_index = cluster_index &
                    108:         ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
1.1.1.7   root      109:     refcount = be16_to_cpu(refcount_block[block_index]);
                    110: 
                    111:     ret = qcow2_cache_put(bs, s->refcount_block_cache,
                    112:         (void**) &refcount_block);
                    113:     if (ret < 0) {
                    114:         return ret;
                    115:     }
                    116: 
                    117:     return refcount;
1.1       root      118: }
                    119: 
1.1.1.4   root      120: /*
                    121:  * Rounds the refcount table size up to avoid growing the table for each single
                    122:  * refcount block that is allocated.
                    123:  */
                    124: static unsigned int next_refcount_table_size(BDRVQcowState *s,
                    125:     unsigned int min_size)
                    126: {
                    127:     unsigned int min_clusters = (min_size >> (s->cluster_bits - 3)) + 1;
                    128:     unsigned int refcount_table_clusters =
                    129:         MAX(1, s->refcount_table_size >> (s->cluster_bits - 3));
                    130: 
                    131:     while (min_clusters > refcount_table_clusters) {
                    132:         refcount_table_clusters = (refcount_table_clusters * 3 + 1) / 2;
                    133:     }
                    134: 
                    135:     return refcount_table_clusters << (s->cluster_bits - 3);
                    136: }
                    137: 
                    138: 
                    139: /* Checks if two offsets are described by the same refcount block */
                    140: static int in_same_refcount_block(BDRVQcowState *s, uint64_t offset_a,
                    141:     uint64_t offset_b)
                    142: {
                    143:     uint64_t block_a = offset_a >> (2 * s->cluster_bits - REFCOUNT_SHIFT);
                    144:     uint64_t block_b = offset_b >> (2 * s->cluster_bits - REFCOUNT_SHIFT);
                    145: 
                    146:     return (block_a == block_b);
                    147: }
                    148: 
                    149: /*
                    150:  * Loads a refcount block. If it doesn't exist yet, it is allocated first
                    151:  * (including growing the refcount table if needed).
                    152:  *
1.1.1.7   root      153:  * Returns 0 on success or -errno in error case
1.1.1.4   root      154:  */
1.1.1.7   root      155: static int alloc_refcount_block(BlockDriverState *bs,
                    156:     int64_t cluster_index, uint16_t **refcount_block)
1.1       root      157: {
                    158:     BDRVQcowState *s = bs->opaque;
1.1.1.4   root      159:     unsigned int refcount_table_index;
                    160:     int ret;
1.1       root      161: 
1.1.1.6   root      162:     BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC);
                    163: 
1.1.1.4   root      164:     /* Find the refcount block for the given cluster */
                    165:     refcount_table_index = cluster_index >> (s->cluster_bits - REFCOUNT_SHIFT);
                    166: 
                    167:     if (refcount_table_index < s->refcount_table_size) {
                    168: 
                    169:         uint64_t refcount_block_offset =
                    170:             s->refcount_table[refcount_table_index];
                    171: 
                    172:         /* If it's already there, we're done */
                    173:         if (refcount_block_offset) {
1.1.1.7   root      174:              return load_refcount_block(bs, refcount_block_offset,
                    175:                  (void**) refcount_block);
1.1.1.4   root      176:         }
                    177:     }
                    178: 
                    179:     /*
                    180:      * If we came here, we need to allocate something. Something is at least
                    181:      * a cluster for the new refcount block. It may also include a new refcount
                    182:      * table if the old refcount table is too small.
                    183:      *
                    184:      * Note that allocating clusters here needs some special care:
                    185:      *
                    186:      * - We can't use the normal qcow2_alloc_clusters(), it would try to
                    187:      *   increase the refcount and very likely we would end up with an endless
                    188:      *   recursion. Instead we must place the refcount blocks in a way that
                    189:      *   they can describe them themselves.
                    190:      *
                    191:      * - We need to consider that at this point we are inside update_refcounts
                    192:      *   and doing the initial refcount increase. This means that some clusters
                    193:      *   have already been allocated by the caller, but their refcount isn't
                    194:      *   accurate yet. free_cluster_index tells us where this allocation ends
                    195:      *   as long as we don't overwrite it by freeing clusters.
                    196:      *
                    197:      * - alloc_clusters_noref and qcow2_free_clusters may load a different
                    198:      *   refcount block into the cache
                    199:      */
                    200: 
1.1.1.7   root      201:     *refcount_block = NULL;
                    202: 
                    203:     /* We write to the refcount table, so we might depend on L2 tables */
                    204:     qcow2_cache_flush(bs, s->l2_table_cache);
1.1.1.4   root      205: 
                    206:     /* Allocate the refcount block itself and mark it as used */
1.1.1.6   root      207:     int64_t new_block = alloc_clusters_noref(bs, s->cluster_size);
                    208:     if (new_block < 0) {
                    209:         return new_block;
                    210:     }
1.1.1.4   root      211: 
                    212: #ifdef DEBUG_ALLOC2
                    213:     fprintf(stderr, "qcow2: Allocate refcount block %d for %" PRIx64
                    214:         " at %" PRIx64 "\n",
                    215:         refcount_table_index, cluster_index << s->cluster_bits, new_block);
                    216: #endif
                    217: 
                    218:     if (in_same_refcount_block(s, new_block, cluster_index << s->cluster_bits)) {
1.1.1.5   root      219:         /* Zero the new refcount block before updating it */
1.1.1.7   root      220:         ret = qcow2_cache_get_empty(bs, s->refcount_block_cache, new_block,
                    221:             (void**) refcount_block);
                    222:         if (ret < 0) {
                    223:             goto fail_block;
                    224:         }
                    225: 
                    226:         memset(*refcount_block, 0, s->cluster_size);
1.1.1.5   root      227: 
1.1.1.4   root      228:         /* The block describes itself, need to update the cache */
                    229:         int block_index = (new_block >> s->cluster_bits) &
                    230:             ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
1.1.1.7   root      231:         (*refcount_block)[block_index] = cpu_to_be16(1);
1.1.1.4   root      232:     } else {
                    233:         /* Described somewhere else. This can recurse at most twice before we
                    234:          * arrive at a block that describes itself. */
                    235:         ret = update_refcount(bs, new_block, s->cluster_size, 1);
                    236:         if (ret < 0) {
                    237:             goto fail_block;
                    238:         }
1.1.1.5   root      239: 
1.1.1.7   root      240:         bdrv_flush(bs->file);
                    241: 
1.1.1.5   root      242:         /* Initialize the new refcount block only after updating its refcount,
                    243:          * update_refcount uses the refcount cache itself */
1.1.1.7   root      244:         ret = qcow2_cache_get_empty(bs, s->refcount_block_cache, new_block,
                    245:             (void**) refcount_block);
                    246:         if (ret < 0) {
                    247:             goto fail_block;
                    248:         }
                    249: 
                    250:         memset(*refcount_block, 0, s->cluster_size);
1.1.1.4   root      251:     }
                    252: 
                    253:     /* Now the new refcount block needs to be written to disk */
1.1.1.6   root      254:     BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE);
1.1.1.7   root      255:     qcow2_cache_entry_mark_dirty(s->refcount_block_cache, *refcount_block);
                    256:     ret = qcow2_cache_flush(bs, s->refcount_block_cache);
1.1.1.4   root      257:     if (ret < 0) {
                    258:         goto fail_block;
                    259:     }
                    260: 
                    261:     /* If the refcount table is big enough, just hook the block up there */
                    262:     if (refcount_table_index < s->refcount_table_size) {
                    263:         uint64_t data64 = cpu_to_be64(new_block);
1.1.1.6   root      264:         BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_HOOKUP);
                    265:         ret = bdrv_pwrite_sync(bs->file,
1.1.1.4   root      266:             s->refcount_table_offset + refcount_table_index * sizeof(uint64_t),
                    267:             &data64, sizeof(data64));
                    268:         if (ret < 0) {
                    269:             goto fail_block;
1.1       root      270:         }
1.1.1.4   root      271: 
                    272:         s->refcount_table[refcount_table_index] = new_block;
1.1.1.7   root      273:         return 0;
                    274:     }
                    275: 
                    276:     ret = qcow2_cache_put(bs, s->refcount_block_cache, (void**) refcount_block);
                    277:     if (ret < 0) {
                    278:         goto fail_block;
1.1       root      279:     }
1.1.1.4   root      280: 
                    281:     /*
                    282:      * If we come here, we need to grow the refcount table. Again, a new
                    283:      * refcount table needs some space and we can't simply allocate to avoid
                    284:      * endless recursion.
                    285:      *
                    286:      * Therefore let's grab new refcount blocks at the end of the image, which
                    287:      * will describe themselves and the new refcount table. This way we can
                    288:      * reference them only in the new table and do the switch to the new
                    289:      * refcount table at once without producing an inconsistent state in
                    290:      * between.
                    291:      */
1.1.1.6   root      292:     BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_GROW);
                    293: 
1.1.1.4   root      294:     /* Calculate the number of refcount blocks needed so far */
                    295:     uint64_t refcount_block_clusters = 1 << (s->cluster_bits - REFCOUNT_SHIFT);
                    296:     uint64_t blocks_used = (s->free_cluster_index +
                    297:         refcount_block_clusters - 1) / refcount_block_clusters;
                    298: 
                    299:     /* And now we need at least one block more for the new metadata */
                    300:     uint64_t table_size = next_refcount_table_size(s, blocks_used + 1);
                    301:     uint64_t last_table_size;
                    302:     uint64_t blocks_clusters;
                    303:     do {
                    304:         uint64_t table_clusters = size_to_clusters(s, table_size);
                    305:         blocks_clusters = 1 +
                    306:             ((table_clusters + refcount_block_clusters - 1)
                    307:             / refcount_block_clusters);
                    308:         uint64_t meta_clusters = table_clusters + blocks_clusters;
                    309: 
                    310:         last_table_size = table_size;
                    311:         table_size = next_refcount_table_size(s, blocks_used +
                    312:             ((meta_clusters + refcount_block_clusters - 1)
                    313:             / refcount_block_clusters));
                    314: 
                    315:     } while (last_table_size != table_size);
                    316: 
1.1       root      317: #ifdef DEBUG_ALLOC2
1.1.1.4   root      318:     fprintf(stderr, "qcow2: Grow refcount table %" PRId32 " => %" PRId64 "\n",
                    319:         s->refcount_table_size, table_size);
1.1       root      320: #endif
1.1.1.4   root      321: 
                    322:     /* Create the new refcount table and blocks */
                    323:     uint64_t meta_offset = (blocks_used * refcount_block_clusters) *
                    324:         s->cluster_size;
                    325:     uint64_t table_offset = meta_offset + blocks_clusters * s->cluster_size;
1.1.1.9 ! root      326:     uint16_t *new_blocks = g_malloc0(blocks_clusters * s->cluster_size);
        !           327:     uint64_t *new_table = g_malloc0(table_size * sizeof(uint64_t));
1.1.1.4   root      328: 
                    329:     assert(meta_offset >= (s->free_cluster_index * s->cluster_size));
                    330: 
                    331:     /* Fill the new refcount table */
1.1       root      332:     memcpy(new_table, s->refcount_table,
1.1.1.4   root      333:         s->refcount_table_size * sizeof(uint64_t));
                    334:     new_table[refcount_table_index] = new_block;
                    335: 
                    336:     int i;
                    337:     for (i = 0; i < blocks_clusters; i++) {
                    338:         new_table[blocks_used + i] = meta_offset + (i * s->cluster_size);
                    339:     }
                    340: 
                    341:     /* Fill the refcount blocks */
                    342:     uint64_t table_clusters = size_to_clusters(s, table_size * sizeof(uint64_t));
                    343:     int block = 0;
                    344:     for (i = 0; i < table_clusters + blocks_clusters; i++) {
                    345:         new_blocks[block++] = cpu_to_be16(1);
                    346:     }
                    347: 
                    348:     /* Write refcount blocks to disk */
1.1.1.6   root      349:     BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_BLOCKS);
                    350:     ret = bdrv_pwrite_sync(bs->file, meta_offset, new_blocks,
1.1.1.4   root      351:         blocks_clusters * s->cluster_size);
1.1.1.9 ! root      352:     g_free(new_blocks);
1.1.1.4   root      353:     if (ret < 0) {
                    354:         goto fail_table;
                    355:     }
                    356: 
                    357:     /* Write refcount table to disk */
                    358:     for(i = 0; i < table_size; i++) {
1.1       root      359:         cpu_to_be64s(&new_table[i]);
1.1.1.4   root      360:     }
                    361: 
1.1.1.6   root      362:     BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_TABLE);
                    363:     ret = bdrv_pwrite_sync(bs->file, table_offset, new_table,
1.1.1.4   root      364:         table_size * sizeof(uint64_t));
                    365:     if (ret < 0) {
                    366:         goto fail_table;
                    367:     }
                    368: 
                    369:     for(i = 0; i < table_size; i++) {
                    370:         cpu_to_be64s(&new_table[i]);
                    371:     }
1.1       root      372: 
1.1.1.4   root      373:     /* Hook up the new refcount table in the qcow2 header */
                    374:     uint8_t data[12];
1.1       root      375:     cpu_to_be64w((uint64_t*)data, table_offset);
1.1.1.4   root      376:     cpu_to_be32w((uint32_t*)(data + 8), table_clusters);
1.1.1.6   root      377:     BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_SWITCH_TABLE);
                    378:     ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, refcount_table_offset),
1.1.1.4   root      379:         data, sizeof(data));
                    380:     if (ret < 0) {
                    381:         goto fail_table;
1.1.1.3   root      382:     }
                    383: 
1.1.1.4   root      384:     /* And switch it in memory */
                    385:     uint64_t old_table_offset = s->refcount_table_offset;
                    386:     uint64_t old_table_size = s->refcount_table_size;
                    387: 
1.1.1.9 ! root      388:     g_free(s->refcount_table);
1.1       root      389:     s->refcount_table = new_table;
1.1.1.4   root      390:     s->refcount_table_size = table_size;
1.1       root      391:     s->refcount_table_offset = table_offset;
                    392: 
1.1.1.4   root      393:     /* Free old table. Remember, we must not change free_cluster_index */
                    394:     uint64_t old_free_cluster_index = s->free_cluster_index;
1.1       root      395:     qcow2_free_clusters(bs, old_table_offset, old_table_size * sizeof(uint64_t));
1.1.1.4   root      396:     s->free_cluster_index = old_free_cluster_index;
1.1       root      397: 
1.1.1.7   root      398:     ret = load_refcount_block(bs, new_block, (void**) refcount_block);
1.1.1.4   root      399:     if (ret < 0) {
1.1.1.7   root      400:         return ret;
1.1       root      401:     }
                    402: 
1.1.1.4   root      403:     return new_block;
1.1       root      404: 
1.1.1.4   root      405: fail_table:
1.1.1.9 ! root      406:     g_free(new_table);
1.1.1.4   root      407: fail_block:
1.1.1.7   root      408:     if (*refcount_block != NULL) {
                    409:         qcow2_cache_put(bs, s->refcount_block_cache, (void**) refcount_block);
1.1.1.5   root      410:     }
1.1.1.7   root      411:     return ret;
1.1       root      412: }
                    413: 
                    414: /* XXX: cache several refcount block clusters ? */
1.1.1.3   root      415: static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
                    416:     int64_t offset, int64_t length, int addend)
1.1       root      417: {
                    418:     BDRVQcowState *s = bs->opaque;
                    419:     int64_t start, last, cluster_offset;
1.1.1.7   root      420:     uint16_t *refcount_block = NULL;
                    421:     int64_t old_table_index = -1;
1.1.1.3   root      422:     int ret;
1.1       root      423: 
                    424: #ifdef DEBUG_ALLOC2
1.1.1.9 ! root      425:     fprintf(stderr, "update_refcount: offset=%" PRId64 " size=%" PRId64 " addend=%d\n",
1.1       root      426:            offset, length, addend);
                    427: #endif
1.1.1.3   root      428:     if (length < 0) {
1.1       root      429:         return -EINVAL;
1.1.1.3   root      430:     } else if (length == 0) {
                    431:         return 0;
                    432:     }
                    433: 
1.1.1.7   root      434:     if (addend < 0) {
                    435:         qcow2_cache_set_dependency(bs, s->refcount_block_cache,
                    436:             s->l2_table_cache);
                    437:     }
                    438: 
1.1       root      439:     start = offset & ~(s->cluster_size - 1);
                    440:     last = (offset + length - 1) & ~(s->cluster_size - 1);
                    441:     for(cluster_offset = start; cluster_offset <= last;
                    442:         cluster_offset += s->cluster_size)
                    443:     {
                    444:         int block_index, refcount;
                    445:         int64_t cluster_index = cluster_offset >> s->cluster_bits;
1.1.1.7   root      446:         int64_t table_index =
                    447:             cluster_index >> (s->cluster_bits - REFCOUNT_SHIFT);
1.1       root      448: 
1.1.1.7   root      449:         /* Load the refcount block and allocate it if needed */
                    450:         if (table_index != old_table_index) {
                    451:             if (refcount_block) {
                    452:                 ret = qcow2_cache_put(bs, s->refcount_block_cache,
                    453:                     (void**) &refcount_block);
                    454:                 if (ret < 0) {
                    455:                     goto fail;
                    456:                 }
                    457:             }
1.1       root      458: 
1.1.1.7   root      459:             ret = alloc_refcount_block(bs, cluster_index, &refcount_block);
1.1.1.6   root      460:             if (ret < 0) {
1.1.1.7   root      461:                 goto fail;
1.1       root      462:             }
                    463:         }
1.1.1.7   root      464:         old_table_index = table_index;
1.1       root      465: 
1.1.1.7   root      466:         qcow2_cache_entry_mark_dirty(s->refcount_block_cache, refcount_block);
1.1       root      467: 
                    468:         /* we can update the count and save it */
                    469:         block_index = cluster_index &
                    470:             ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
                    471: 
1.1.1.7   root      472:         refcount = be16_to_cpu(refcount_block[block_index]);
1.1       root      473:         refcount += addend;
1.1.1.3   root      474:         if (refcount < 0 || refcount > 0xffff) {
                    475:             ret = -EINVAL;
                    476:             goto fail;
                    477:         }
1.1       root      478:         if (refcount == 0 && cluster_index < s->free_cluster_index) {
                    479:             s->free_cluster_index = cluster_index;
                    480:         }
1.1.1.7   root      481:         refcount_block[block_index] = cpu_to_be16(refcount);
1.1       root      482:     }
                    483: 
1.1.1.3   root      484:     ret = 0;
                    485: fail:
1.1       root      486:     /* Write last changed block to disk */
1.1.1.7   root      487:     if (refcount_block) {
1.1.1.6   root      488:         int wret;
1.1.1.7   root      489:         wret = qcow2_cache_put(bs, s->refcount_block_cache,
                    490:             (void**) &refcount_block);
1.1.1.6   root      491:         if (wret < 0) {
                    492:             return ret < 0 ? ret : wret;
1.1       root      493:         }
                    494:     }
                    495: 
1.1.1.3   root      496:     /*
                    497:      * Try do undo any updates if an error is returned (This may succeed in
                    498:      * some cases like ENOSPC for allocating a new refcount block)
                    499:      */
                    500:     if (ret < 0) {
                    501:         int dummy;
                    502:         dummy = update_refcount(bs, offset, cluster_offset - offset, -addend);
1.1.1.7   root      503:         (void)dummy;
1.1.1.3   root      504:     }
                    505: 
                    506:     return ret;
1.1       root      507: }
                    508: 
1.1.1.6   root      509: /*
                    510:  * Increases or decreases the refcount of a given cluster by one.
                    511:  * addend must be 1 or -1.
                    512:  *
                    513:  * If the return value is non-negative, it is the new refcount of the cluster.
                    514:  * If it is negative, it is -errno and indicates an error.
                    515:  */
1.1       root      516: static int update_cluster_refcount(BlockDriverState *bs,
                    517:                                    int64_t cluster_index,
                    518:                                    int addend)
                    519: {
                    520:     BDRVQcowState *s = bs->opaque;
                    521:     int ret;
                    522: 
                    523:     ret = update_refcount(bs, cluster_index << s->cluster_bits, 1, addend);
                    524:     if (ret < 0) {
                    525:         return ret;
                    526:     }
                    527: 
1.1.1.7   root      528:     bdrv_flush(bs->file);
                    529: 
1.1       root      530:     return get_refcount(bs, cluster_index);
                    531: }
                    532: 
                    533: 
                    534: 
                    535: /*********************************************************/
                    536: /* cluster allocation functions */
                    537: 
                    538: 
                    539: 
                    540: /* return < 0 if error */
                    541: static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size)
                    542: {
                    543:     BDRVQcowState *s = bs->opaque;
1.1.1.6   root      544:     int i, nb_clusters, refcount;
1.1       root      545: 
                    546:     nb_clusters = size_to_clusters(s, size);
                    547: retry:
                    548:     for(i = 0; i < nb_clusters; i++) {
1.1.1.6   root      549:         int64_t next_cluster_index = s->free_cluster_index++;
                    550:         refcount = get_refcount(bs, next_cluster_index);
                    551: 
                    552:         if (refcount < 0) {
                    553:             return refcount;
                    554:         } else if (refcount != 0) {
1.1       root      555:             goto retry;
1.1.1.6   root      556:         }
1.1       root      557:     }
                    558: #ifdef DEBUG_ALLOC2
1.1.1.9 ! root      559:     fprintf(stderr, "alloc_clusters: size=%" PRId64 " -> %" PRId64 "\n",
1.1       root      560:             size,
                    561:             (s->free_cluster_index - nb_clusters) << s->cluster_bits);
                    562: #endif
                    563:     return (s->free_cluster_index - nb_clusters) << s->cluster_bits;
                    564: }
                    565: 
                    566: int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size)
                    567: {
                    568:     int64_t offset;
1.1.1.3   root      569:     int ret;
1.1       root      570: 
1.1.1.6   root      571:     BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC);
1.1       root      572:     offset = alloc_clusters_noref(bs, size);
1.1.1.6   root      573:     if (offset < 0) {
                    574:         return offset;
                    575:     }
                    576: 
1.1.1.3   root      577:     ret = update_refcount(bs, offset, size, 1);
                    578:     if (ret < 0) {
                    579:         return ret;
                    580:     }
1.1.1.7   root      581: 
1.1       root      582:     return offset;
                    583: }
                    584: 
                    585: /* only used to allocate compressed sectors. We try to allocate
                    586:    contiguous sectors. size must be <= cluster_size */
                    587: int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
                    588: {
                    589:     BDRVQcowState *s = bs->opaque;
                    590:     int64_t offset, cluster_offset;
                    591:     int free_in_cluster;
                    592: 
1.1.1.6   root      593:     BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC_BYTES);
1.1       root      594:     assert(size > 0 && size <= s->cluster_size);
                    595:     if (s->free_byte_offset == 0) {
                    596:         s->free_byte_offset = qcow2_alloc_clusters(bs, s->cluster_size);
1.1.1.3   root      597:         if (s->free_byte_offset < 0) {
                    598:             return s->free_byte_offset;
                    599:         }
1.1       root      600:     }
                    601:  redo:
                    602:     free_in_cluster = s->cluster_size -
                    603:         (s->free_byte_offset & (s->cluster_size - 1));
                    604:     if (size <= free_in_cluster) {
                    605:         /* enough space in current cluster */
                    606:         offset = s->free_byte_offset;
                    607:         s->free_byte_offset += size;
                    608:         free_in_cluster -= size;
                    609:         if (free_in_cluster == 0)
                    610:             s->free_byte_offset = 0;
                    611:         if ((offset & (s->cluster_size - 1)) != 0)
                    612:             update_cluster_refcount(bs, offset >> s->cluster_bits, 1);
                    613:     } else {
                    614:         offset = qcow2_alloc_clusters(bs, s->cluster_size);
1.1.1.3   root      615:         if (offset < 0) {
                    616:             return offset;
                    617:         }
1.1       root      618:         cluster_offset = s->free_byte_offset & ~(s->cluster_size - 1);
                    619:         if ((cluster_offset + s->cluster_size) == offset) {
                    620:             /* we are lucky: contiguous data */
                    621:             offset = s->free_byte_offset;
                    622:             update_cluster_refcount(bs, offset >> s->cluster_bits, 1);
                    623:             s->free_byte_offset += size;
                    624:         } else {
                    625:             s->free_byte_offset = offset;
                    626:             goto redo;
                    627:         }
                    628:     }
1.1.1.7   root      629: 
                    630:     bdrv_flush(bs->file);
1.1       root      631:     return offset;
                    632: }
                    633: 
                    634: void qcow2_free_clusters(BlockDriverState *bs,
                    635:                           int64_t offset, int64_t size)
                    636: {
1.1.1.3   root      637:     int ret;
                    638: 
1.1.1.6   root      639:     BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_FREE);
1.1.1.3   root      640:     ret = update_refcount(bs, offset, size, -1);
                    641:     if (ret < 0) {
                    642:         fprintf(stderr, "qcow2_free_clusters failed: %s\n", strerror(-ret));
1.1.1.5   root      643:         /* TODO Remember the clusters to free them later and avoid leaking */
1.1.1.3   root      644:     }
1.1       root      645: }
                    646: 
                    647: /*
                    648:  * free_any_clusters
                    649:  *
                    650:  * free clusters according to its type: compressed or not
                    651:  *
                    652:  */
                    653: 
                    654: void qcow2_free_any_clusters(BlockDriverState *bs,
                    655:     uint64_t cluster_offset, int nb_clusters)
                    656: {
                    657:     BDRVQcowState *s = bs->opaque;
                    658: 
                    659:     /* free the cluster */
                    660: 
                    661:     if (cluster_offset & QCOW_OFLAG_COMPRESSED) {
                    662:         int nb_csectors;
                    663:         nb_csectors = ((cluster_offset >> s->csize_shift) &
                    664:                        s->csize_mask) + 1;
                    665:         qcow2_free_clusters(bs,
                    666:             (cluster_offset & s->cluster_offset_mask) & ~511,
                    667:             nb_csectors * 512);
                    668:         return;
                    669:     }
                    670: 
                    671:     qcow2_free_clusters(bs, cluster_offset, nb_clusters << s->cluster_bits);
                    672: 
                    673:     return;
                    674: }
                    675: 
                    676: 
                    677: 
                    678: /*********************************************************/
                    679: /* snapshots and image creation */
                    680: 
                    681: 
                    682: 
                    683: /* update the refcounts of snapshots and the copied flag */
                    684: int qcow2_update_snapshot_refcount(BlockDriverState *bs,
                    685:     int64_t l1_table_offset, int l1_size, int addend)
                    686: {
                    687:     BDRVQcowState *s = bs->opaque;
                    688:     uint64_t *l1_table, *l2_table, l2_offset, offset, l1_size2, l1_allocated;
                    689:     int64_t old_offset, old_l2_offset;
1.1.1.8   root      690:     int i, j, l1_modified = 0, nb_csectors, refcount;
1.1.1.7   root      691:     int ret;
1.1.1.8   root      692:     bool old_l2_writethrough, old_refcount_writethrough;
                    693: 
                    694:     /* Switch caches to writeback mode during update */
                    695:     old_l2_writethrough =
                    696:         qcow2_cache_set_writethrough(bs, s->l2_table_cache, false);
                    697:     old_refcount_writethrough =
                    698:         qcow2_cache_set_writethrough(bs, s->refcount_block_cache, false);
1.1       root      699: 
                    700:     l2_table = NULL;
                    701:     l1_table = NULL;
                    702:     l1_size2 = l1_size * sizeof(uint64_t);
                    703:     if (l1_table_offset != s->l1_table_offset) {
1.1.1.2   root      704:         if (l1_size2 != 0) {
1.1.1.9 ! root      705:             l1_table = g_malloc0(align_offset(l1_size2, 512));
1.1.1.2   root      706:         } else {
                    707:             l1_table = NULL;
                    708:         }
1.1       root      709:         l1_allocated = 1;
1.1.1.6   root      710:         if (bdrv_pread(bs->file, l1_table_offset,
1.1       root      711:                        l1_table, l1_size2) != l1_size2)
1.1.1.8   root      712:         {
                    713:             ret = -EIO;
1.1       root      714:             goto fail;
1.1.1.8   root      715:         }
                    716: 
1.1       root      717:         for(i = 0;i < l1_size; i++)
                    718:             be64_to_cpus(&l1_table[i]);
                    719:     } else {
                    720:         assert(l1_size == s->l1_size);
                    721:         l1_table = s->l1_table;
                    722:         l1_allocated = 0;
                    723:     }
                    724: 
                    725:     for(i = 0; i < l1_size; i++) {
                    726:         l2_offset = l1_table[i];
                    727:         if (l2_offset) {
                    728:             old_l2_offset = l2_offset;
                    729:             l2_offset &= ~QCOW_OFLAG_COPIED;
1.1.1.7   root      730: 
                    731:             ret = qcow2_cache_get(bs, s->l2_table_cache, l2_offset,
                    732:                 (void**) &l2_table);
                    733:             if (ret < 0) {
1.1       root      734:                 goto fail;
1.1.1.7   root      735:             }
                    736: 
1.1       root      737:             for(j = 0; j < s->l2_size; j++) {
                    738:                 offset = be64_to_cpu(l2_table[j]);
                    739:                 if (offset != 0) {
                    740:                     old_offset = offset;
                    741:                     offset &= ~QCOW_OFLAG_COPIED;
                    742:                     if (offset & QCOW_OFLAG_COMPRESSED) {
                    743:                         nb_csectors = ((offset >> s->csize_shift) &
                    744:                                        s->csize_mask) + 1;
1.1.1.3   root      745:                         if (addend != 0) {
                    746:                             int ret;
                    747:                             ret = update_refcount(bs,
                    748:                                 (offset & s->cluster_offset_mask) & ~511,
                    749:                                 nb_csectors * 512, addend);
                    750:                             if (ret < 0) {
                    751:                                 goto fail;
                    752:                             }
1.1.1.7   root      753: 
                    754:                             /* TODO Flushing once for the whole function should
                    755:                              * be enough */
                    756:                             bdrv_flush(bs->file);
1.1.1.3   root      757:                         }
1.1       root      758:                         /* compressed clusters are never modified */
                    759:                         refcount = 2;
                    760:                     } else {
                    761:                         if (addend != 0) {
                    762:                             refcount = update_cluster_refcount(bs, offset >> s->cluster_bits, addend);
                    763:                         } else {
                    764:                             refcount = get_refcount(bs, offset >> s->cluster_bits);
                    765:                         }
1.1.1.6   root      766: 
                    767:                         if (refcount < 0) {
1.1.1.8   root      768:                             ret = -EIO;
1.1.1.6   root      769:                             goto fail;
                    770:                         }
1.1       root      771:                     }
                    772: 
                    773:                     if (refcount == 1) {
                    774:                         offset |= QCOW_OFLAG_COPIED;
                    775:                     }
                    776:                     if (offset != old_offset) {
1.1.1.7   root      777:                         if (addend > 0) {
                    778:                             qcow2_cache_set_dependency(bs, s->l2_table_cache,
                    779:                                 s->refcount_block_cache);
                    780:                         }
1.1       root      781:                         l2_table[j] = cpu_to_be64(offset);
1.1.1.7   root      782:                         qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
1.1       root      783:                     }
                    784:                 }
                    785:             }
1.1.1.7   root      786: 
                    787:             ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    788:             if (ret < 0) {
                    789:                 goto fail;
1.1       root      790:             }
                    791: 
1.1.1.7   root      792: 
1.1       root      793:             if (addend != 0) {
                    794:                 refcount = update_cluster_refcount(bs, l2_offset >> s->cluster_bits, addend);
                    795:             } else {
                    796:                 refcount = get_refcount(bs, l2_offset >> s->cluster_bits);
                    797:             }
1.1.1.6   root      798:             if (refcount < 0) {
1.1.1.8   root      799:                 ret = -EIO;
1.1.1.6   root      800:                 goto fail;
                    801:             } else if (refcount == 1) {
1.1       root      802:                 l2_offset |= QCOW_OFLAG_COPIED;
                    803:             }
                    804:             if (l2_offset != old_l2_offset) {
                    805:                 l1_table[i] = l2_offset;
                    806:                 l1_modified = 1;
                    807:             }
                    808:         }
                    809:     }
1.1.1.8   root      810: 
                    811:     ret = 0;
                    812: fail:
                    813:     if (l2_table) {
                    814:         qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    815:     }
                    816: 
                    817:     /* Enable writethrough cache mode again */
                    818:     qcow2_cache_set_writethrough(bs, s->l2_table_cache, old_l2_writethrough);
                    819:     qcow2_cache_set_writethrough(bs, s->refcount_block_cache,
                    820:         old_refcount_writethrough);
                    821: 
1.1       root      822:     if (l1_modified) {
                    823:         for(i = 0; i < l1_size; i++)
                    824:             cpu_to_be64s(&l1_table[i]);
1.1.1.6   root      825:         if (bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table,
1.1.1.5   root      826:                         l1_size2) < 0)
1.1       root      827:             goto fail;
                    828:         for(i = 0; i < l1_size; i++)
                    829:             be64_to_cpus(&l1_table[i]);
                    830:     }
                    831:     if (l1_allocated)
1.1.1.9 ! root      832:         g_free(l1_table);
1.1.1.8   root      833:     return ret;
1.1       root      834: }
                    835: 
                    836: 
                    837: 
                    838: 
                    839: /*********************************************************/
                    840: /* refcount checking functions */
                    841: 
                    842: 
                    843: 
                    844: /*
                    845:  * Increases the refcount for a range of clusters in a given refcount table.
                    846:  * This is used to construct a temporary refcount table out of L1 and L2 tables
                    847:  * which can be compared the the refcount table saved in the image.
                    848:  *
1.1.1.6   root      849:  * Modifies the number of errors in res.
1.1       root      850:  */
1.1.1.6   root      851: static void inc_refcounts(BlockDriverState *bs,
                    852:                           BdrvCheckResult *res,
1.1       root      853:                           uint16_t *refcount_table,
                    854:                           int refcount_table_size,
                    855:                           int64_t offset, int64_t size)
                    856: {
                    857:     BDRVQcowState *s = bs->opaque;
                    858:     int64_t start, last, cluster_offset;
                    859:     int k;
                    860: 
                    861:     if (size <= 0)
1.1.1.6   root      862:         return;
1.1       root      863: 
                    864:     start = offset & ~(s->cluster_size - 1);
                    865:     last = (offset + size - 1) & ~(s->cluster_size - 1);
                    866:     for(cluster_offset = start; cluster_offset <= last;
                    867:         cluster_offset += s->cluster_size) {
                    868:         k = cluster_offset >> s->cluster_bits;
1.1.1.6   root      869:         if (k < 0) {
1.1       root      870:             fprintf(stderr, "ERROR: invalid cluster offset=0x%" PRIx64 "\n",
                    871:                 cluster_offset);
1.1.1.6   root      872:             res->corruptions++;
                    873:         } else if (k >= refcount_table_size) {
                    874:             fprintf(stderr, "Warning: cluster offset=0x%" PRIx64 " is after "
                    875:                 "the end of the image file, can't properly check refcounts.\n",
                    876:                 cluster_offset);
                    877:             res->check_errors++;
1.1       root      878:         } else {
                    879:             if (++refcount_table[k] == 0) {
                    880:                 fprintf(stderr, "ERROR: overflow cluster offset=0x%" PRIx64
                    881:                     "\n", cluster_offset);
1.1.1.6   root      882:                 res->corruptions++;
1.1       root      883:             }
                    884:         }
                    885:     }
                    886: }
                    887: 
                    888: /*
                    889:  * Increases the refcount in the given refcount table for the all clusters
                    890:  * referenced in the L2 table. While doing so, performs some checks on L2
                    891:  * entries.
                    892:  *
                    893:  * Returns the number of errors found by the checks or -errno if an internal
                    894:  * error occurred.
                    895:  */
1.1.1.6   root      896: static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
1.1       root      897:     uint16_t *refcount_table, int refcount_table_size, int64_t l2_offset,
                    898:     int check_copied)
                    899: {
                    900:     BDRVQcowState *s = bs->opaque;
                    901:     uint64_t *l2_table, offset;
                    902:     int i, l2_size, nb_csectors, refcount;
                    903: 
                    904:     /* Read L2 table from disk */
                    905:     l2_size = s->l2_size * sizeof(uint64_t);
1.1.1.9 ! root      906:     l2_table = g_malloc(l2_size);
1.1       root      907: 
1.1.1.6   root      908:     if (bdrv_pread(bs->file, l2_offset, l2_table, l2_size) != l2_size)
1.1       root      909:         goto fail;
                    910: 
                    911:     /* Do the actual checks */
                    912:     for(i = 0; i < s->l2_size; i++) {
                    913:         offset = be64_to_cpu(l2_table[i]);
                    914:         if (offset != 0) {
                    915:             if (offset & QCOW_OFLAG_COMPRESSED) {
                    916:                 /* Compressed clusters don't have QCOW_OFLAG_COPIED */
                    917:                 if (offset & QCOW_OFLAG_COPIED) {
                    918:                     fprintf(stderr, "ERROR: cluster %" PRId64 ": "
                    919:                         "copied flag must never be set for compressed "
                    920:                         "clusters\n", offset >> s->cluster_bits);
                    921:                     offset &= ~QCOW_OFLAG_COPIED;
1.1.1.6   root      922:                     res->corruptions++;
1.1       root      923:                 }
                    924: 
                    925:                 /* Mark cluster as used */
                    926:                 nb_csectors = ((offset >> s->csize_shift) &
                    927:                                s->csize_mask) + 1;
                    928:                 offset &= s->cluster_offset_mask;
1.1.1.6   root      929:                 inc_refcounts(bs, res, refcount_table, refcount_table_size,
                    930:                     offset & ~511, nb_csectors * 512);
1.1       root      931:             } else {
                    932:                 /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
                    933:                 if (check_copied) {
                    934:                     uint64_t entry = offset;
                    935:                     offset &= ~QCOW_OFLAG_COPIED;
                    936:                     refcount = get_refcount(bs, offset >> s->cluster_bits);
1.1.1.6   root      937:                     if (refcount < 0) {
                    938:                         fprintf(stderr, "Can't get refcount for offset %"
                    939:                             PRIx64 ": %s\n", entry, strerror(-refcount));
                    940:                         goto fail;
                    941:                     }
1.1       root      942:                     if ((refcount == 1) != ((entry & QCOW_OFLAG_COPIED) != 0)) {
                    943:                         fprintf(stderr, "ERROR OFLAG_COPIED: offset=%"
                    944:                             PRIx64 " refcount=%d\n", entry, refcount);
1.1.1.6   root      945:                         res->corruptions++;
1.1       root      946:                     }
                    947:                 }
                    948: 
                    949:                 /* Mark cluster as used */
                    950:                 offset &= ~QCOW_OFLAG_COPIED;
1.1.1.6   root      951:                 inc_refcounts(bs, res, refcount_table,refcount_table_size,
                    952:                     offset, s->cluster_size);
1.1       root      953: 
                    954:                 /* Correct offsets are cluster aligned */
                    955:                 if (offset & (s->cluster_size - 1)) {
                    956:                     fprintf(stderr, "ERROR offset=%" PRIx64 ": Cluster is not "
                    957:                         "properly aligned; L2 entry corrupted.\n", offset);
1.1.1.6   root      958:                     res->corruptions++;
1.1       root      959:                 }
                    960:             }
                    961:         }
                    962:     }
                    963: 
1.1.1.9 ! root      964:     g_free(l2_table);
1.1.1.6   root      965:     return 0;
1.1       root      966: 
                    967: fail:
1.1.1.6   root      968:     fprintf(stderr, "ERROR: I/O error in check_refcounts_l2\n");
1.1.1.9 ! root      969:     g_free(l2_table);
1.1       root      970:     return -EIO;
                    971: }
                    972: 
                    973: /*
                    974:  * Increases the refcount for the L1 table, its L2 tables and all referenced
                    975:  * clusters in the given refcount table. While doing so, performs some checks
                    976:  * on L1 and L2 entries.
                    977:  *
                    978:  * Returns the number of errors found by the checks or -errno if an internal
                    979:  * error occurred.
                    980:  */
                    981: static int check_refcounts_l1(BlockDriverState *bs,
1.1.1.6   root      982:                               BdrvCheckResult *res,
1.1       root      983:                               uint16_t *refcount_table,
                    984:                               int refcount_table_size,
                    985:                               int64_t l1_table_offset, int l1_size,
                    986:                               int check_copied)
                    987: {
                    988:     BDRVQcowState *s = bs->opaque;
                    989:     uint64_t *l1_table, l2_offset, l1_size2;
                    990:     int i, refcount, ret;
                    991: 
                    992:     l1_size2 = l1_size * sizeof(uint64_t);
                    993: 
                    994:     /* Mark L1 table as used */
1.1.1.6   root      995:     inc_refcounts(bs, res, refcount_table, refcount_table_size,
                    996:         l1_table_offset, l1_size2);
1.1       root      997: 
                    998:     /* Read L1 table entries from disk */
1.1.1.2   root      999:     if (l1_size2 == 0) {
                   1000:         l1_table = NULL;
                   1001:     } else {
1.1.1.9 ! root     1002:         l1_table = g_malloc(l1_size2);
1.1.1.6   root     1003:         if (bdrv_pread(bs->file, l1_table_offset,
1.1.1.2   root     1004:                        l1_table, l1_size2) != l1_size2)
                   1005:             goto fail;
                   1006:         for(i = 0;i < l1_size; i++)
                   1007:             be64_to_cpus(&l1_table[i]);
                   1008:     }
1.1       root     1009: 
                   1010:     /* Do the actual checks */
                   1011:     for(i = 0; i < l1_size; i++) {
                   1012:         l2_offset = l1_table[i];
                   1013:         if (l2_offset) {
                   1014:             /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
                   1015:             if (check_copied) {
                   1016:                 refcount = get_refcount(bs, (l2_offset & ~QCOW_OFLAG_COPIED)
                   1017:                     >> s->cluster_bits);
1.1.1.6   root     1018:                 if (refcount < 0) {
                   1019:                     fprintf(stderr, "Can't get refcount for l2_offset %"
                   1020:                         PRIx64 ": %s\n", l2_offset, strerror(-refcount));
                   1021:                     goto fail;
                   1022:                 }
1.1       root     1023:                 if ((refcount == 1) != ((l2_offset & QCOW_OFLAG_COPIED) != 0)) {
                   1024:                     fprintf(stderr, "ERROR OFLAG_COPIED: l2_offset=%" PRIx64
                   1025:                         " refcount=%d\n", l2_offset, refcount);
1.1.1.6   root     1026:                     res->corruptions++;
1.1       root     1027:                 }
                   1028:             }
                   1029: 
                   1030:             /* Mark L2 table as used */
                   1031:             l2_offset &= ~QCOW_OFLAG_COPIED;
1.1.1.6   root     1032:             inc_refcounts(bs, res, refcount_table, refcount_table_size,
                   1033:                 l2_offset, s->cluster_size);
1.1       root     1034: 
                   1035:             /* L2 tables are cluster aligned */
                   1036:             if (l2_offset & (s->cluster_size - 1)) {
                   1037:                 fprintf(stderr, "ERROR l2_offset=%" PRIx64 ": Table is not "
                   1038:                     "cluster aligned; L1 entry corrupted\n", l2_offset);
1.1.1.6   root     1039:                 res->corruptions++;
1.1       root     1040:             }
                   1041: 
                   1042:             /* Process and check L2 entries */
1.1.1.6   root     1043:             ret = check_refcounts_l2(bs, res, refcount_table,
                   1044:                 refcount_table_size, l2_offset, check_copied);
1.1       root     1045:             if (ret < 0) {
                   1046:                 goto fail;
                   1047:             }
                   1048:         }
                   1049:     }
1.1.1.9 ! root     1050:     g_free(l1_table);
1.1.1.6   root     1051:     return 0;
1.1       root     1052: 
                   1053: fail:
                   1054:     fprintf(stderr, "ERROR: I/O error in check_refcounts_l1\n");
1.1.1.6   root     1055:     res->check_errors++;
1.1.1.9 ! root     1056:     g_free(l1_table);
1.1       root     1057:     return -EIO;
                   1058: }
                   1059: 
                   1060: /*
                   1061:  * Checks an image for refcount consistency.
                   1062:  *
                   1063:  * Returns 0 if no errors are found, the number of errors in case the image is
1.1.1.8   root     1064:  * detected as corrupted, and -errno when an internal error occurred.
1.1       root     1065:  */
1.1.1.6   root     1066: int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res)
1.1       root     1067: {
                   1068:     BDRVQcowState *s = bs->opaque;
                   1069:     int64_t size;
                   1070:     int nb_clusters, refcount1, refcount2, i;
                   1071:     QCowSnapshot *sn;
                   1072:     uint16_t *refcount_table;
1.1.1.6   root     1073:     int ret;
1.1       root     1074: 
1.1.1.6   root     1075:     size = bdrv_getlength(bs->file);
1.1       root     1076:     nb_clusters = size_to_clusters(s, size);
1.1.1.9 ! root     1077:     refcount_table = g_malloc0(nb_clusters * sizeof(uint16_t));
1.1       root     1078: 
                   1079:     /* header */
1.1.1.6   root     1080:     inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1081:         0, s->cluster_size);
1.1       root     1082: 
                   1083:     /* current L1 table */
1.1.1.6   root     1084:     ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters,
1.1       root     1085:                        s->l1_table_offset, s->l1_size, 1);
                   1086:     if (ret < 0) {
1.1.1.8   root     1087:         goto fail;
1.1       root     1088:     }
                   1089: 
                   1090:     /* snapshots */
                   1091:     for(i = 0; i < s->nb_snapshots; i++) {
                   1092:         sn = s->snapshots + i;
1.1.1.6   root     1093:         ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters,
                   1094:             sn->l1_table_offset, sn->l1_size, 0);
                   1095:         if (ret < 0) {
1.1.1.8   root     1096:             goto fail;
1.1.1.6   root     1097:         }
1.1       root     1098:     }
1.1.1.6   root     1099:     inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1100:         s->snapshots_offset, s->snapshots_size);
1.1       root     1101: 
                   1102:     /* refcount data */
1.1.1.6   root     1103:     inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1104:         s->refcount_table_offset,
                   1105:         s->refcount_table_size * sizeof(uint64_t));
                   1106: 
1.1       root     1107:     for(i = 0; i < s->refcount_table_size; i++) {
1.1.1.6   root     1108:         uint64_t offset, cluster;
1.1       root     1109:         offset = s->refcount_table[i];
1.1.1.6   root     1110:         cluster = offset >> s->cluster_bits;
                   1111: 
                   1112:         /* Refcount blocks are cluster aligned */
                   1113:         if (offset & (s->cluster_size - 1)) {
                   1114:             fprintf(stderr, "ERROR refcount block %d is not "
                   1115:                 "cluster aligned; refcount table entry corrupted\n", i);
                   1116:             res->corruptions++;
                   1117:             continue;
                   1118:         }
                   1119: 
                   1120:         if (cluster >= nb_clusters) {
                   1121:             fprintf(stderr, "ERROR refcount block %d is outside image\n", i);
                   1122:             res->corruptions++;
                   1123:             continue;
                   1124:         }
                   1125: 
1.1       root     1126:         if (offset != 0) {
1.1.1.6   root     1127:             inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1128:                 offset, s->cluster_size);
                   1129:             if (refcount_table[cluster] != 1) {
                   1130:                 fprintf(stderr, "ERROR refcount block %d refcount=%d\n",
                   1131:                     i, refcount_table[cluster]);
                   1132:                 res->corruptions++;
                   1133:             }
1.1       root     1134:         }
                   1135:     }
                   1136: 
                   1137:     /* compare ref counts */
                   1138:     for(i = 0; i < nb_clusters; i++) {
                   1139:         refcount1 = get_refcount(bs, i);
1.1.1.6   root     1140:         if (refcount1 < 0) {
                   1141:             fprintf(stderr, "Can't get refcount for cluster %d: %s\n",
                   1142:                 i, strerror(-refcount1));
                   1143:             res->check_errors++;
                   1144:             continue;
                   1145:         }
                   1146: 
1.1       root     1147:         refcount2 = refcount_table[i];
                   1148:         if (refcount1 != refcount2) {
1.1.1.6   root     1149:             fprintf(stderr, "%s cluster %d refcount=%d reference=%d\n",
                   1150:                    refcount1 < refcount2 ? "ERROR" : "Leaked",
1.1       root     1151:                    i, refcount1, refcount2);
1.1.1.6   root     1152:             if (refcount1 < refcount2) {
                   1153:                 res->corruptions++;
                   1154:             } else {
                   1155:                 res->leaks++;
                   1156:             }
1.1       root     1157:         }
                   1158:     }
                   1159: 
1.1.1.8   root     1160:     ret = 0;
                   1161: 
                   1162: fail:
1.1.1.9 ! root     1163:     g_free(refcount_table);
1.1       root     1164: 
1.1.1.8   root     1165:     return ret;
1.1       root     1166: }
                   1167: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.