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

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 =
1.1.1.10! root      170:             s->refcount_table[refcount_table_index] & REFT_OFFSET_MASK;
1.1.1.4   root      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++) {
1.1.1.10! root      370:         be64_to_cpus(&new_table[i]);
1.1.1.4   root      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.10! root      403:     return 0;
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: 
1.1.1.10! root      585: int qcow2_alloc_clusters_at(BlockDriverState *bs, uint64_t offset,
        !           586:     int nb_clusters)
        !           587: {
        !           588:     BDRVQcowState *s = bs->opaque;
        !           589:     uint64_t cluster_index;
        !           590:     uint64_t old_free_cluster_index;
        !           591:     int i, refcount, ret;
        !           592: 
        !           593:     /* Check how many clusters there are free */
        !           594:     cluster_index = offset >> s->cluster_bits;
        !           595:     for(i = 0; i < nb_clusters; i++) {
        !           596:         refcount = get_refcount(bs, cluster_index++);
        !           597: 
        !           598:         if (refcount < 0) {
        !           599:             return refcount;
        !           600:         } else if (refcount != 0) {
        !           601:             break;
        !           602:         }
        !           603:     }
        !           604: 
        !           605:     /* And then allocate them */
        !           606:     old_free_cluster_index = s->free_cluster_index;
        !           607:     s->free_cluster_index = cluster_index + i;
        !           608: 
        !           609:     ret = update_refcount(bs, offset, i << s->cluster_bits, 1);
        !           610:     if (ret < 0) {
        !           611:         return ret;
        !           612:     }
        !           613: 
        !           614:     s->free_cluster_index = old_free_cluster_index;
        !           615: 
        !           616:     return i;
        !           617: }
        !           618: 
1.1       root      619: /* only used to allocate compressed sectors. We try to allocate
                    620:    contiguous sectors. size must be <= cluster_size */
                    621: int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
                    622: {
                    623:     BDRVQcowState *s = bs->opaque;
                    624:     int64_t offset, cluster_offset;
                    625:     int free_in_cluster;
                    626: 
1.1.1.6   root      627:     BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC_BYTES);
1.1       root      628:     assert(size > 0 && size <= s->cluster_size);
                    629:     if (s->free_byte_offset == 0) {
                    630:         s->free_byte_offset = qcow2_alloc_clusters(bs, s->cluster_size);
1.1.1.3   root      631:         if (s->free_byte_offset < 0) {
                    632:             return s->free_byte_offset;
                    633:         }
1.1       root      634:     }
                    635:  redo:
                    636:     free_in_cluster = s->cluster_size -
                    637:         (s->free_byte_offset & (s->cluster_size - 1));
                    638:     if (size <= free_in_cluster) {
                    639:         /* enough space in current cluster */
                    640:         offset = s->free_byte_offset;
                    641:         s->free_byte_offset += size;
                    642:         free_in_cluster -= size;
                    643:         if (free_in_cluster == 0)
                    644:             s->free_byte_offset = 0;
                    645:         if ((offset & (s->cluster_size - 1)) != 0)
                    646:             update_cluster_refcount(bs, offset >> s->cluster_bits, 1);
                    647:     } else {
                    648:         offset = qcow2_alloc_clusters(bs, s->cluster_size);
1.1.1.3   root      649:         if (offset < 0) {
                    650:             return offset;
                    651:         }
1.1       root      652:         cluster_offset = s->free_byte_offset & ~(s->cluster_size - 1);
                    653:         if ((cluster_offset + s->cluster_size) == offset) {
                    654:             /* we are lucky: contiguous data */
                    655:             offset = s->free_byte_offset;
                    656:             update_cluster_refcount(bs, offset >> s->cluster_bits, 1);
                    657:             s->free_byte_offset += size;
                    658:         } else {
                    659:             s->free_byte_offset = offset;
                    660:             goto redo;
                    661:         }
                    662:     }
1.1.1.7   root      663: 
                    664:     bdrv_flush(bs->file);
1.1       root      665:     return offset;
                    666: }
                    667: 
                    668: void qcow2_free_clusters(BlockDriverState *bs,
                    669:                           int64_t offset, int64_t size)
                    670: {
1.1.1.3   root      671:     int ret;
                    672: 
1.1.1.6   root      673:     BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_FREE);
1.1.1.3   root      674:     ret = update_refcount(bs, offset, size, -1);
                    675:     if (ret < 0) {
                    676:         fprintf(stderr, "qcow2_free_clusters failed: %s\n", strerror(-ret));
1.1.1.5   root      677:         /* TODO Remember the clusters to free them later and avoid leaking */
1.1.1.3   root      678:     }
1.1       root      679: }
                    680: 
                    681: /*
1.1.1.10! root      682:  * Free a cluster using its L2 entry (handles clusters of all types, e.g.
        !           683:  * normal cluster, compressed cluster, etc.)
1.1       root      684:  */
                    685: void qcow2_free_any_clusters(BlockDriverState *bs,
1.1.1.10! root      686:     uint64_t l2_entry, int nb_clusters)
1.1       root      687: {
                    688:     BDRVQcowState *s = bs->opaque;
                    689: 
1.1.1.10! root      690:     switch (qcow2_get_cluster_type(l2_entry)) {
        !           691:     case QCOW2_CLUSTER_COMPRESSED:
        !           692:         {
        !           693:             int nb_csectors;
        !           694:             nb_csectors = ((l2_entry >> s->csize_shift) &
        !           695:                            s->csize_mask) + 1;
        !           696:             qcow2_free_clusters(bs,
        !           697:                 (l2_entry & s->cluster_offset_mask) & ~511,
        !           698:                 nb_csectors * 512);
        !           699:         }
        !           700:         break;
        !           701:     case QCOW2_CLUSTER_NORMAL:
        !           702:         qcow2_free_clusters(bs, l2_entry & L2E_OFFSET_MASK,
        !           703:                             nb_clusters << s->cluster_bits);
        !           704:         break;
        !           705:     case QCOW2_CLUSTER_UNALLOCATED:
        !           706:     case QCOW2_CLUSTER_ZERO:
        !           707:         break;
        !           708:     default:
        !           709:         abort();
1.1       root      710:     }
                    711: }
                    712: 
                    713: 
                    714: 
                    715: /*********************************************************/
                    716: /* snapshots and image creation */
                    717: 
                    718: 
                    719: 
                    720: /* update the refcounts of snapshots and the copied flag */
                    721: int qcow2_update_snapshot_refcount(BlockDriverState *bs,
                    722:     int64_t l1_table_offset, int l1_size, int addend)
                    723: {
                    724:     BDRVQcowState *s = bs->opaque;
                    725:     uint64_t *l1_table, *l2_table, l2_offset, offset, l1_size2, l1_allocated;
                    726:     int64_t old_offset, old_l2_offset;
1.1.1.8   root      727:     int i, j, l1_modified = 0, nb_csectors, refcount;
1.1.1.7   root      728:     int ret;
1.1.1.8   root      729:     bool old_l2_writethrough, old_refcount_writethrough;
                    730: 
                    731:     /* Switch caches to writeback mode during update */
                    732:     old_l2_writethrough =
                    733:         qcow2_cache_set_writethrough(bs, s->l2_table_cache, false);
                    734:     old_refcount_writethrough =
                    735:         qcow2_cache_set_writethrough(bs, s->refcount_block_cache, false);
1.1       root      736: 
                    737:     l2_table = NULL;
                    738:     l1_table = NULL;
                    739:     l1_size2 = l1_size * sizeof(uint64_t);
1.1.1.10! root      740: 
        !           741:     /* WARNING: qcow2_snapshot_goto relies on this function not using the
        !           742:      * l1_table_offset when it is the current s->l1_table_offset! Be careful
        !           743:      * when changing this! */
1.1       root      744:     if (l1_table_offset != s->l1_table_offset) {
1.1.1.2   root      745:         if (l1_size2 != 0) {
1.1.1.9   root      746:             l1_table = g_malloc0(align_offset(l1_size2, 512));
1.1.1.2   root      747:         } else {
                    748:             l1_table = NULL;
                    749:         }
1.1       root      750:         l1_allocated = 1;
1.1.1.6   root      751:         if (bdrv_pread(bs->file, l1_table_offset,
1.1       root      752:                        l1_table, l1_size2) != l1_size2)
1.1.1.8   root      753:         {
                    754:             ret = -EIO;
1.1       root      755:             goto fail;
1.1.1.8   root      756:         }
                    757: 
1.1       root      758:         for(i = 0;i < l1_size; i++)
                    759:             be64_to_cpus(&l1_table[i]);
                    760:     } else {
                    761:         assert(l1_size == s->l1_size);
                    762:         l1_table = s->l1_table;
                    763:         l1_allocated = 0;
                    764:     }
                    765: 
                    766:     for(i = 0; i < l1_size; i++) {
                    767:         l2_offset = l1_table[i];
                    768:         if (l2_offset) {
                    769:             old_l2_offset = l2_offset;
1.1.1.10! root      770:             l2_offset &= L1E_OFFSET_MASK;
1.1.1.7   root      771: 
                    772:             ret = qcow2_cache_get(bs, s->l2_table_cache, l2_offset,
                    773:                 (void**) &l2_table);
                    774:             if (ret < 0) {
1.1       root      775:                 goto fail;
1.1.1.7   root      776:             }
                    777: 
1.1       root      778:             for(j = 0; j < s->l2_size; j++) {
                    779:                 offset = be64_to_cpu(l2_table[j]);
                    780:                 if (offset != 0) {
                    781:                     old_offset = offset;
                    782:                     offset &= ~QCOW_OFLAG_COPIED;
                    783:                     if (offset & QCOW_OFLAG_COMPRESSED) {
                    784:                         nb_csectors = ((offset >> s->csize_shift) &
                    785:                                        s->csize_mask) + 1;
1.1.1.3   root      786:                         if (addend != 0) {
                    787:                             int ret;
                    788:                             ret = update_refcount(bs,
                    789:                                 (offset & s->cluster_offset_mask) & ~511,
                    790:                                 nb_csectors * 512, addend);
                    791:                             if (ret < 0) {
                    792:                                 goto fail;
                    793:                             }
1.1.1.7   root      794: 
                    795:                             /* TODO Flushing once for the whole function should
                    796:                              * be enough */
                    797:                             bdrv_flush(bs->file);
1.1.1.3   root      798:                         }
1.1       root      799:                         /* compressed clusters are never modified */
                    800:                         refcount = 2;
                    801:                     } else {
1.1.1.10! root      802:                         uint64_t cluster_index = (offset & L2E_OFFSET_MASK) >> s->cluster_bits;
1.1       root      803:                         if (addend != 0) {
1.1.1.10! root      804:                             refcount = update_cluster_refcount(bs, cluster_index, addend);
1.1       root      805:                         } else {
1.1.1.10! root      806:                             refcount = get_refcount(bs, cluster_index);
1.1       root      807:                         }
1.1.1.6   root      808: 
                    809:                         if (refcount < 0) {
1.1.1.8   root      810:                             ret = -EIO;
1.1.1.6   root      811:                             goto fail;
                    812:                         }
1.1       root      813:                     }
                    814: 
                    815:                     if (refcount == 1) {
                    816:                         offset |= QCOW_OFLAG_COPIED;
                    817:                     }
                    818:                     if (offset != old_offset) {
1.1.1.7   root      819:                         if (addend > 0) {
                    820:                             qcow2_cache_set_dependency(bs, s->l2_table_cache,
                    821:                                 s->refcount_block_cache);
                    822:                         }
1.1       root      823:                         l2_table[j] = cpu_to_be64(offset);
1.1.1.7   root      824:                         qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
1.1       root      825:                     }
                    826:                 }
                    827:             }
1.1.1.7   root      828: 
                    829:             ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    830:             if (ret < 0) {
                    831:                 goto fail;
1.1       root      832:             }
                    833: 
1.1.1.7   root      834: 
1.1       root      835:             if (addend != 0) {
                    836:                 refcount = update_cluster_refcount(bs, l2_offset >> s->cluster_bits, addend);
                    837:             } else {
                    838:                 refcount = get_refcount(bs, l2_offset >> s->cluster_bits);
                    839:             }
1.1.1.6   root      840:             if (refcount < 0) {
1.1.1.8   root      841:                 ret = -EIO;
1.1.1.6   root      842:                 goto fail;
                    843:             } else if (refcount == 1) {
1.1       root      844:                 l2_offset |= QCOW_OFLAG_COPIED;
                    845:             }
                    846:             if (l2_offset != old_l2_offset) {
                    847:                 l1_table[i] = l2_offset;
                    848:                 l1_modified = 1;
                    849:             }
                    850:         }
                    851:     }
1.1.1.8   root      852: 
                    853:     ret = 0;
                    854: fail:
                    855:     if (l2_table) {
                    856:         qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    857:     }
                    858: 
                    859:     /* Enable writethrough cache mode again */
                    860:     qcow2_cache_set_writethrough(bs, s->l2_table_cache, old_l2_writethrough);
                    861:     qcow2_cache_set_writethrough(bs, s->refcount_block_cache,
                    862:         old_refcount_writethrough);
                    863: 
1.1.1.10! root      864:     /* Update L1 only if it isn't deleted anyway (addend = -1) */
        !           865:     if (addend >= 0 && l1_modified) {
1.1       root      866:         for(i = 0; i < l1_size; i++)
                    867:             cpu_to_be64s(&l1_table[i]);
1.1.1.6   root      868:         if (bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table,
1.1.1.5   root      869:                         l1_size2) < 0)
1.1       root      870:             goto fail;
                    871:         for(i = 0; i < l1_size; i++)
                    872:             be64_to_cpus(&l1_table[i]);
                    873:     }
                    874:     if (l1_allocated)
1.1.1.9   root      875:         g_free(l1_table);
1.1.1.8   root      876:     return ret;
1.1       root      877: }
                    878: 
                    879: 
                    880: 
                    881: 
                    882: /*********************************************************/
                    883: /* refcount checking functions */
                    884: 
                    885: 
                    886: 
                    887: /*
                    888:  * Increases the refcount for a range of clusters in a given refcount table.
                    889:  * This is used to construct a temporary refcount table out of L1 and L2 tables
                    890:  * which can be compared the the refcount table saved in the image.
                    891:  *
1.1.1.6   root      892:  * Modifies the number of errors in res.
1.1       root      893:  */
1.1.1.6   root      894: static void inc_refcounts(BlockDriverState *bs,
                    895:                           BdrvCheckResult *res,
1.1       root      896:                           uint16_t *refcount_table,
                    897:                           int refcount_table_size,
                    898:                           int64_t offset, int64_t size)
                    899: {
                    900:     BDRVQcowState *s = bs->opaque;
                    901:     int64_t start, last, cluster_offset;
                    902:     int k;
                    903: 
                    904:     if (size <= 0)
1.1.1.6   root      905:         return;
1.1       root      906: 
                    907:     start = offset & ~(s->cluster_size - 1);
                    908:     last = (offset + size - 1) & ~(s->cluster_size - 1);
                    909:     for(cluster_offset = start; cluster_offset <= last;
                    910:         cluster_offset += s->cluster_size) {
                    911:         k = cluster_offset >> s->cluster_bits;
1.1.1.6   root      912:         if (k < 0) {
1.1       root      913:             fprintf(stderr, "ERROR: invalid cluster offset=0x%" PRIx64 "\n",
                    914:                 cluster_offset);
1.1.1.6   root      915:             res->corruptions++;
                    916:         } else if (k >= refcount_table_size) {
                    917:             fprintf(stderr, "Warning: cluster offset=0x%" PRIx64 " is after "
                    918:                 "the end of the image file, can't properly check refcounts.\n",
                    919:                 cluster_offset);
                    920:             res->check_errors++;
1.1       root      921:         } else {
                    922:             if (++refcount_table[k] == 0) {
                    923:                 fprintf(stderr, "ERROR: overflow cluster offset=0x%" PRIx64
                    924:                     "\n", cluster_offset);
1.1.1.6   root      925:                 res->corruptions++;
1.1       root      926:             }
                    927:         }
                    928:     }
                    929: }
                    930: 
                    931: /*
                    932:  * Increases the refcount in the given refcount table for the all clusters
                    933:  * referenced in the L2 table. While doing so, performs some checks on L2
                    934:  * entries.
                    935:  *
                    936:  * Returns the number of errors found by the checks or -errno if an internal
                    937:  * error occurred.
                    938:  */
1.1.1.6   root      939: static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
1.1       root      940:     uint16_t *refcount_table, int refcount_table_size, int64_t l2_offset,
                    941:     int check_copied)
                    942: {
                    943:     BDRVQcowState *s = bs->opaque;
1.1.1.10! root      944:     uint64_t *l2_table, l2_entry;
1.1       root      945:     int i, l2_size, nb_csectors, refcount;
                    946: 
                    947:     /* Read L2 table from disk */
                    948:     l2_size = s->l2_size * sizeof(uint64_t);
1.1.1.9   root      949:     l2_table = g_malloc(l2_size);
1.1       root      950: 
1.1.1.6   root      951:     if (bdrv_pread(bs->file, l2_offset, l2_table, l2_size) != l2_size)
1.1       root      952:         goto fail;
                    953: 
                    954:     /* Do the actual checks */
                    955:     for(i = 0; i < s->l2_size; i++) {
1.1.1.10! root      956:         l2_entry = be64_to_cpu(l2_table[i]);
1.1       root      957: 
1.1.1.10! root      958:         switch (qcow2_get_cluster_type(l2_entry)) {
        !           959:         case QCOW2_CLUSTER_COMPRESSED:
        !           960:             /* Compressed clusters don't have QCOW_OFLAG_COPIED */
        !           961:             if (l2_entry & QCOW_OFLAG_COPIED) {
        !           962:                 fprintf(stderr, "ERROR: cluster %" PRId64 ": "
        !           963:                     "copied flag must never be set for compressed "
        !           964:                     "clusters\n", l2_entry >> s->cluster_bits);
        !           965:                 l2_entry &= ~QCOW_OFLAG_COPIED;
        !           966:                 res->corruptions++;
        !           967:             }
        !           968: 
        !           969:             /* Mark cluster as used */
        !           970:             nb_csectors = ((l2_entry >> s->csize_shift) &
        !           971:                            s->csize_mask) + 1;
        !           972:             l2_entry &= s->cluster_offset_mask;
        !           973:             inc_refcounts(bs, res, refcount_table, refcount_table_size,
        !           974:                 l2_entry & ~511, nb_csectors * 512);
        !           975:             break;
        !           976: 
        !           977:         case QCOW2_CLUSTER_ZERO:
        !           978:             if ((l2_entry & L2E_OFFSET_MASK) == 0) {
        !           979:                 break;
        !           980:             }
        !           981:             /* fall through */
1.1       root      982: 
1.1.1.10! root      983:         case QCOW2_CLUSTER_NORMAL:
        !           984:         {
        !           985:             /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
        !           986:             uint64_t offset = l2_entry & L2E_OFFSET_MASK;
        !           987: 
        !           988:             if (check_copied) {
        !           989:                 refcount = get_refcount(bs, offset >> s->cluster_bits);
        !           990:                 if (refcount < 0) {
        !           991:                     fprintf(stderr, "Can't get refcount for offset %"
        !           992:                         PRIx64 ": %s\n", l2_entry, strerror(-refcount));
        !           993:                     goto fail;
        !           994:                 }
        !           995:                 if ((refcount == 1) != ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
        !           996:                     fprintf(stderr, "ERROR OFLAG_COPIED: offset=%"
        !           997:                         PRIx64 " refcount=%d\n", l2_entry, refcount);
1.1.1.6   root      998:                     res->corruptions++;
1.1       root      999:                 }
                   1000:             }
1.1.1.10! root     1001: 
        !          1002:             /* Mark cluster as used */
        !          1003:             inc_refcounts(bs, res, refcount_table,refcount_table_size,
        !          1004:                 offset, s->cluster_size);
        !          1005: 
        !          1006:             /* Correct offsets are cluster aligned */
        !          1007:             if (offset & (s->cluster_size - 1)) {
        !          1008:                 fprintf(stderr, "ERROR offset=%" PRIx64 ": Cluster is not "
        !          1009:                     "properly aligned; L2 entry corrupted.\n", offset);
        !          1010:                 res->corruptions++;
        !          1011:             }
        !          1012:             break;
        !          1013:         }
        !          1014: 
        !          1015:         case QCOW2_CLUSTER_UNALLOCATED:
        !          1016:             break;
        !          1017: 
        !          1018:         default:
        !          1019:             abort();
1.1       root     1020:         }
                   1021:     }
                   1022: 
1.1.1.9   root     1023:     g_free(l2_table);
1.1.1.6   root     1024:     return 0;
1.1       root     1025: 
                   1026: fail:
1.1.1.6   root     1027:     fprintf(stderr, "ERROR: I/O error in check_refcounts_l2\n");
1.1.1.9   root     1028:     g_free(l2_table);
1.1       root     1029:     return -EIO;
                   1030: }
                   1031: 
                   1032: /*
                   1033:  * Increases the refcount for the L1 table, its L2 tables and all referenced
                   1034:  * clusters in the given refcount table. While doing so, performs some checks
                   1035:  * on L1 and L2 entries.
                   1036:  *
                   1037:  * Returns the number of errors found by the checks or -errno if an internal
                   1038:  * error occurred.
                   1039:  */
                   1040: static int check_refcounts_l1(BlockDriverState *bs,
1.1.1.6   root     1041:                               BdrvCheckResult *res,
1.1       root     1042:                               uint16_t *refcount_table,
                   1043:                               int refcount_table_size,
                   1044:                               int64_t l1_table_offset, int l1_size,
                   1045:                               int check_copied)
                   1046: {
                   1047:     BDRVQcowState *s = bs->opaque;
                   1048:     uint64_t *l1_table, l2_offset, l1_size2;
                   1049:     int i, refcount, ret;
                   1050: 
                   1051:     l1_size2 = l1_size * sizeof(uint64_t);
                   1052: 
                   1053:     /* Mark L1 table as used */
1.1.1.6   root     1054:     inc_refcounts(bs, res, refcount_table, refcount_table_size,
                   1055:         l1_table_offset, l1_size2);
1.1       root     1056: 
                   1057:     /* Read L1 table entries from disk */
1.1.1.2   root     1058:     if (l1_size2 == 0) {
                   1059:         l1_table = NULL;
                   1060:     } else {
1.1.1.9   root     1061:         l1_table = g_malloc(l1_size2);
1.1.1.6   root     1062:         if (bdrv_pread(bs->file, l1_table_offset,
1.1.1.2   root     1063:                        l1_table, l1_size2) != l1_size2)
                   1064:             goto fail;
                   1065:         for(i = 0;i < l1_size; i++)
                   1066:             be64_to_cpus(&l1_table[i]);
                   1067:     }
1.1       root     1068: 
                   1069:     /* Do the actual checks */
                   1070:     for(i = 0; i < l1_size; i++) {
                   1071:         l2_offset = l1_table[i];
                   1072:         if (l2_offset) {
                   1073:             /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
                   1074:             if (check_copied) {
                   1075:                 refcount = get_refcount(bs, (l2_offset & ~QCOW_OFLAG_COPIED)
                   1076:                     >> s->cluster_bits);
1.1.1.6   root     1077:                 if (refcount < 0) {
                   1078:                     fprintf(stderr, "Can't get refcount for l2_offset %"
                   1079:                         PRIx64 ": %s\n", l2_offset, strerror(-refcount));
                   1080:                     goto fail;
                   1081:                 }
1.1       root     1082:                 if ((refcount == 1) != ((l2_offset & QCOW_OFLAG_COPIED) != 0)) {
                   1083:                     fprintf(stderr, "ERROR OFLAG_COPIED: l2_offset=%" PRIx64
                   1084:                         " refcount=%d\n", l2_offset, refcount);
1.1.1.6   root     1085:                     res->corruptions++;
1.1       root     1086:                 }
                   1087:             }
                   1088: 
                   1089:             /* Mark L2 table as used */
1.1.1.10! root     1090:             l2_offset &= L1E_OFFSET_MASK;
1.1.1.6   root     1091:             inc_refcounts(bs, res, refcount_table, refcount_table_size,
                   1092:                 l2_offset, s->cluster_size);
1.1       root     1093: 
                   1094:             /* L2 tables are cluster aligned */
                   1095:             if (l2_offset & (s->cluster_size - 1)) {
                   1096:                 fprintf(stderr, "ERROR l2_offset=%" PRIx64 ": Table is not "
                   1097:                     "cluster aligned; L1 entry corrupted\n", l2_offset);
1.1.1.6   root     1098:                 res->corruptions++;
1.1       root     1099:             }
                   1100: 
                   1101:             /* Process and check L2 entries */
1.1.1.6   root     1102:             ret = check_refcounts_l2(bs, res, refcount_table,
                   1103:                 refcount_table_size, l2_offset, check_copied);
1.1       root     1104:             if (ret < 0) {
                   1105:                 goto fail;
                   1106:             }
                   1107:         }
                   1108:     }
1.1.1.9   root     1109:     g_free(l1_table);
1.1.1.6   root     1110:     return 0;
1.1       root     1111: 
                   1112: fail:
                   1113:     fprintf(stderr, "ERROR: I/O error in check_refcounts_l1\n");
1.1.1.6   root     1114:     res->check_errors++;
1.1.1.9   root     1115:     g_free(l1_table);
1.1       root     1116:     return -EIO;
                   1117: }
                   1118: 
                   1119: /*
                   1120:  * Checks an image for refcount consistency.
                   1121:  *
                   1122:  * Returns 0 if no errors are found, the number of errors in case the image is
1.1.1.8   root     1123:  * detected as corrupted, and -errno when an internal error occurred.
1.1       root     1124:  */
1.1.1.6   root     1125: int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res)
1.1       root     1126: {
                   1127:     BDRVQcowState *s = bs->opaque;
                   1128:     int64_t size;
                   1129:     int nb_clusters, refcount1, refcount2, i;
                   1130:     QCowSnapshot *sn;
                   1131:     uint16_t *refcount_table;
1.1.1.6   root     1132:     int ret;
1.1       root     1133: 
1.1.1.6   root     1134:     size = bdrv_getlength(bs->file);
1.1       root     1135:     nb_clusters = size_to_clusters(s, size);
1.1.1.9   root     1136:     refcount_table = g_malloc0(nb_clusters * sizeof(uint16_t));
1.1       root     1137: 
                   1138:     /* header */
1.1.1.6   root     1139:     inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1140:         0, s->cluster_size);
1.1       root     1141: 
                   1142:     /* current L1 table */
1.1.1.6   root     1143:     ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters,
1.1       root     1144:                        s->l1_table_offset, s->l1_size, 1);
                   1145:     if (ret < 0) {
1.1.1.8   root     1146:         goto fail;
1.1       root     1147:     }
                   1148: 
                   1149:     /* snapshots */
                   1150:     for(i = 0; i < s->nb_snapshots; i++) {
                   1151:         sn = s->snapshots + i;
1.1.1.6   root     1152:         ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters,
                   1153:             sn->l1_table_offset, sn->l1_size, 0);
                   1154:         if (ret < 0) {
1.1.1.8   root     1155:             goto fail;
1.1.1.6   root     1156:         }
1.1       root     1157:     }
1.1.1.6   root     1158:     inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1159:         s->snapshots_offset, s->snapshots_size);
1.1       root     1160: 
                   1161:     /* refcount data */
1.1.1.6   root     1162:     inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1163:         s->refcount_table_offset,
                   1164:         s->refcount_table_size * sizeof(uint64_t));
                   1165: 
1.1       root     1166:     for(i = 0; i < s->refcount_table_size; i++) {
1.1.1.6   root     1167:         uint64_t offset, cluster;
1.1       root     1168:         offset = s->refcount_table[i];
1.1.1.6   root     1169:         cluster = offset >> s->cluster_bits;
                   1170: 
                   1171:         /* Refcount blocks are cluster aligned */
                   1172:         if (offset & (s->cluster_size - 1)) {
                   1173:             fprintf(stderr, "ERROR refcount block %d is not "
                   1174:                 "cluster aligned; refcount table entry corrupted\n", i);
                   1175:             res->corruptions++;
                   1176:             continue;
                   1177:         }
                   1178: 
                   1179:         if (cluster >= nb_clusters) {
                   1180:             fprintf(stderr, "ERROR refcount block %d is outside image\n", i);
                   1181:             res->corruptions++;
                   1182:             continue;
                   1183:         }
                   1184: 
1.1       root     1185:         if (offset != 0) {
1.1.1.6   root     1186:             inc_refcounts(bs, res, refcount_table, nb_clusters,
                   1187:                 offset, s->cluster_size);
                   1188:             if (refcount_table[cluster] != 1) {
                   1189:                 fprintf(stderr, "ERROR refcount block %d refcount=%d\n",
                   1190:                     i, refcount_table[cluster]);
                   1191:                 res->corruptions++;
                   1192:             }
1.1       root     1193:         }
                   1194:     }
                   1195: 
                   1196:     /* compare ref counts */
                   1197:     for(i = 0; i < nb_clusters; i++) {
                   1198:         refcount1 = get_refcount(bs, i);
1.1.1.6   root     1199:         if (refcount1 < 0) {
                   1200:             fprintf(stderr, "Can't get refcount for cluster %d: %s\n",
                   1201:                 i, strerror(-refcount1));
                   1202:             res->check_errors++;
                   1203:             continue;
                   1204:         }
                   1205: 
1.1       root     1206:         refcount2 = refcount_table[i];
                   1207:         if (refcount1 != refcount2) {
1.1.1.6   root     1208:             fprintf(stderr, "%s cluster %d refcount=%d reference=%d\n",
                   1209:                    refcount1 < refcount2 ? "ERROR" : "Leaked",
1.1       root     1210:                    i, refcount1, refcount2);
1.1.1.6   root     1211:             if (refcount1 < refcount2) {
                   1212:                 res->corruptions++;
                   1213:             } else {
                   1214:                 res->leaks++;
                   1215:             }
1.1       root     1216:         }
                   1217:     }
                   1218: 
1.1.1.8   root     1219:     ret = 0;
                   1220: 
                   1221: fail:
1.1.1.9   root     1222:     g_free(refcount_table);
1.1       root     1223: 
1.1.1.8   root     1224:     return ret;
1.1       root     1225: }
                   1226: 

unix.superglobalmegacorp.com

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