Annotation of qemu/block/qcow2-cluster.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 <zlib.h>
                     26: 
                     27: #include "qemu-common.h"
                     28: #include "block_int.h"
                     29: #include "block/qcow2.h"
1.1.1.10! root       30: #include "trace.h"
1.1       root       31: 
1.1.1.7   root       32: int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size)
1.1       root       33: {
                     34:     BDRVQcowState *s = bs->opaque;
                     35:     int new_l1_size, new_l1_size2, ret, i;
                     36:     uint64_t *new_l1_table;
1.1.1.3   root       37:     int64_t new_l1_table_offset;
1.1       root       38:     uint8_t data[12];
                     39: 
1.1.1.7   root       40:     if (min_size <= s->l1_size)
1.1       root       41:         return 0;
1.1.1.7   root       42: 
                     43:     if (exact_size) {
                     44:         new_l1_size = min_size;
                     45:     } else {
                     46:         /* Bump size up to reduce the number of times we have to grow */
                     47:         new_l1_size = s->l1_size;
                     48:         if (new_l1_size == 0) {
                     49:             new_l1_size = 1;
                     50:         }
                     51:         while (min_size > new_l1_size) {
                     52:             new_l1_size = (new_l1_size * 3 + 1) / 2;
                     53:         }
1.1       root       54:     }
1.1.1.7   root       55: 
1.1       root       56: #ifdef DEBUG_ALLOC2
1.1.1.9   root       57:     fprintf(stderr, "grow l1_table from %d to %d\n", s->l1_size, new_l1_size);
1.1       root       58: #endif
                     59: 
                     60:     new_l1_size2 = sizeof(uint64_t) * new_l1_size;
1.1.1.9   root       61:     new_l1_table = g_malloc0(align_offset(new_l1_size2, 512));
1.1       root       62:     memcpy(new_l1_table, s->l1_table, s->l1_size * sizeof(uint64_t));
                     63: 
                     64:     /* write new table (align to cluster) */
1.1.1.6   root       65:     BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_ALLOC_TABLE);
1.1       root       66:     new_l1_table_offset = qcow2_alloc_clusters(bs, new_l1_size2);
1.1.1.3   root       67:     if (new_l1_table_offset < 0) {
1.1.1.9   root       68:         g_free(new_l1_table);
1.1.1.3   root       69:         return new_l1_table_offset;
                     70:     }
1.1       root       71: 
1.1.1.7   root       72:     ret = qcow2_cache_flush(bs, s->refcount_block_cache);
                     73:     if (ret < 0) {
1.1.1.8   root       74:         goto fail;
1.1.1.7   root       75:     }
                     76: 
1.1.1.6   root       77:     BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_WRITE_TABLE);
1.1       root       78:     for(i = 0; i < s->l1_size; i++)
                     79:         new_l1_table[i] = cpu_to_be64(new_l1_table[i]);
1.1.1.6   root       80:     ret = bdrv_pwrite_sync(bs->file, new_l1_table_offset, new_l1_table, new_l1_size2);
1.1.1.5   root       81:     if (ret < 0)
1.1       root       82:         goto fail;
                     83:     for(i = 0; i < s->l1_size; i++)
                     84:         new_l1_table[i] = be64_to_cpu(new_l1_table[i]);
                     85: 
                     86:     /* set new table */
1.1.1.6   root       87:     BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_ACTIVATE_TABLE);
1.1       root       88:     cpu_to_be32w((uint32_t*)data, new_l1_size);
1.1.1.7   root       89:     cpu_to_be64wu((uint64_t*)(data + 4), new_l1_table_offset);
1.1.1.6   root       90:     ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_size), data,sizeof(data));
1.1.1.5   root       91:     if (ret < 0) {
1.1       root       92:         goto fail;
1.1.1.3   root       93:     }
1.1.1.9   root       94:     g_free(s->l1_table);
1.1       root       95:     qcow2_free_clusters(bs, s->l1_table_offset, s->l1_size * sizeof(uint64_t));
                     96:     s->l1_table_offset = new_l1_table_offset;
                     97:     s->l1_table = new_l1_table;
                     98:     s->l1_size = new_l1_size;
                     99:     return 0;
                    100:  fail:
1.1.1.9   root      101:     g_free(new_l1_table);
1.1.1.3   root      102:     qcow2_free_clusters(bs, new_l1_table_offset, new_l1_size2);
1.1.1.5   root      103:     return ret;
1.1       root      104: }
                    105: 
                    106: /*
                    107:  * l2_load
                    108:  *
                    109:  * Loads a L2 table into memory. If the table is in the cache, the cache
                    110:  * is used; otherwise the L2 table is loaded from the image file.
                    111:  *
                    112:  * Returns a pointer to the L2 table on success, or NULL if the read from
                    113:  * the image file failed.
                    114:  */
                    115: 
1.1.1.6   root      116: static int l2_load(BlockDriverState *bs, uint64_t l2_offset,
                    117:     uint64_t **l2_table)
1.1       root      118: {
                    119:     BDRVQcowState *s = bs->opaque;
1.1.1.6   root      120:     int ret;
1.1       root      121: 
1.1.1.7   root      122:     ret = qcow2_cache_get(bs, s->l2_table_cache, l2_offset, (void**) l2_table);
1.1       root      123: 
1.1.1.7   root      124:     return ret;
1.1       root      125: }
                    126: 
                    127: /*
                    128:  * Writes one sector of the L1 table to the disk (can't update single entries
                    129:  * and we really don't want bdrv_pread to perform a read-modify-write)
                    130:  */
                    131: #define L1_ENTRIES_PER_SECTOR (512 / 8)
1.1.1.6   root      132: static int write_l1_entry(BlockDriverState *bs, int l1_index)
1.1       root      133: {
1.1.1.6   root      134:     BDRVQcowState *s = bs->opaque;
1.1       root      135:     uint64_t buf[L1_ENTRIES_PER_SECTOR];
                    136:     int l1_start_index;
1.1.1.5   root      137:     int i, ret;
1.1       root      138: 
                    139:     l1_start_index = l1_index & ~(L1_ENTRIES_PER_SECTOR - 1);
                    140:     for (i = 0; i < L1_ENTRIES_PER_SECTOR; i++) {
                    141:         buf[i] = cpu_to_be64(s->l1_table[l1_start_index + i]);
                    142:     }
                    143: 
1.1.1.6   root      144:     BLKDBG_EVENT(bs->file, BLKDBG_L1_UPDATE);
                    145:     ret = bdrv_pwrite_sync(bs->file, s->l1_table_offset + 8 * l1_start_index,
1.1.1.5   root      146:         buf, sizeof(buf));
                    147:     if (ret < 0) {
                    148:         return ret;
1.1       root      149:     }
                    150: 
                    151:     return 0;
                    152: }
                    153: 
                    154: /*
                    155:  * l2_allocate
                    156:  *
                    157:  * Allocate a new l2 entry in the file. If l1_index points to an already
                    158:  * used entry in the L2 table (i.e. we are doing a copy on write for the L2
                    159:  * table) copy the contents of the old L2 table into the newly allocated one.
                    160:  * Otherwise the new table is initialized with zeros.
                    161:  *
                    162:  */
                    163: 
1.1.1.6   root      164: static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
1.1       root      165: {
                    166:     BDRVQcowState *s = bs->opaque;
                    167:     uint64_t old_l2_offset;
1.1.1.3   root      168:     uint64_t *l2_table;
                    169:     int64_t l2_offset;
1.1.1.5   root      170:     int ret;
1.1       root      171: 
                    172:     old_l2_offset = s->l1_table[l1_index];
                    173: 
1.1.1.10! root      174:     trace_qcow2_l2_allocate(bs, l1_index);
        !           175: 
1.1       root      176:     /* allocate a new l2 entry */
                    177: 
                    178:     l2_offset = qcow2_alloc_clusters(bs, s->l2_size * sizeof(uint64_t));
1.1.1.3   root      179:     if (l2_offset < 0) {
1.1.1.6   root      180:         return l2_offset;
1.1.1.3   root      181:     }
1.1       root      182: 
1.1.1.7   root      183:     ret = qcow2_cache_flush(bs, s->refcount_block_cache);
                    184:     if (ret < 0) {
                    185:         goto fail;
                    186:     }
                    187: 
1.1       root      188:     /* allocate a new entry in the l2 cache */
                    189: 
1.1.1.10! root      190:     trace_qcow2_l2_allocate_get_empty(bs, l1_index);
1.1.1.7   root      191:     ret = qcow2_cache_get_empty(bs, s->l2_table_cache, l2_offset, (void**) table);
                    192:     if (ret < 0) {
                    193:         return ret;
                    194:     }
                    195: 
                    196:     l2_table = *table;
1.1       root      197: 
1.1.1.10! root      198:     if ((old_l2_offset & L1E_OFFSET_MASK) == 0) {
1.1       root      199:         /* if there was no old l2 table, clear the new table */
                    200:         memset(l2_table, 0, s->l2_size * sizeof(uint64_t));
                    201:     } else {
1.1.1.7   root      202:         uint64_t* old_table;
                    203: 
1.1       root      204:         /* if there was an old l2 table, read it from the disk */
1.1.1.6   root      205:         BLKDBG_EVENT(bs->file, BLKDBG_L2_ALLOC_COW_READ);
1.1.1.10! root      206:         ret = qcow2_cache_get(bs, s->l2_table_cache,
        !           207:             old_l2_offset & L1E_OFFSET_MASK,
1.1.1.7   root      208:             (void**) &old_table);
                    209:         if (ret < 0) {
                    210:             goto fail;
                    211:         }
                    212: 
                    213:         memcpy(l2_table, old_table, s->cluster_size);
                    214: 
                    215:         ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &old_table);
1.1.1.6   root      216:         if (ret < 0) {
1.1.1.5   root      217:             goto fail;
1.1.1.6   root      218:         }
1.1       root      219:     }
1.1.1.7   root      220: 
1.1       root      221:     /* write the l2 table to the file */
1.1.1.6   root      222:     BLKDBG_EVENT(bs->file, BLKDBG_L2_ALLOC_WRITE);
1.1.1.7   root      223: 
1.1.1.10! root      224:     trace_qcow2_l2_allocate_write_l2(bs, l1_index);
1.1.1.7   root      225:     qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
                    226:     ret = qcow2_cache_flush(bs, s->l2_table_cache);
1.1.1.5   root      227:     if (ret < 0) {
                    228:         goto fail;
                    229:     }
                    230: 
                    231:     /* update the L1 entry */
1.1.1.10! root      232:     trace_qcow2_l2_allocate_write_l1(bs, l1_index);
1.1.1.5   root      233:     s->l1_table[l1_index] = l2_offset | QCOW_OFLAG_COPIED;
1.1.1.6   root      234:     ret = write_l1_entry(bs, l1_index);
                    235:     if (ret < 0) {
1.1.1.5   root      236:         goto fail;
                    237:     }
1.1       root      238: 
1.1.1.6   root      239:     *table = l2_table;
1.1.1.10! root      240:     trace_qcow2_l2_allocate_done(bs, l1_index, 0);
1.1.1.6   root      241:     return 0;
1.1.1.5   root      242: 
                    243: fail:
1.1.1.10! root      244:     trace_qcow2_l2_allocate_done(bs, l1_index, ret);
1.1.1.7   root      245:     qcow2_cache_put(bs, s->l2_table_cache, (void**) table);
1.1.1.5   root      246:     s->l1_table[l1_index] = old_l2_offset;
1.1.1.6   root      247:     return ret;
1.1       root      248: }
                    249: 
1.1.1.10! root      250: /*
        !           251:  * Checks how many clusters in a given L2 table are contiguous in the image
        !           252:  * file. As soon as one of the flags in the bitmask stop_flags changes compared
        !           253:  * to the first cluster, the search is stopped and the cluster is not counted
        !           254:  * as contiguous. (This allows it, for example, to stop at the first compressed
        !           255:  * cluster which may require a different handling)
        !           256:  */
1.1       root      257: static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size,
1.1.1.10! root      258:         uint64_t *l2_table, uint64_t start, uint64_t stop_flags)
1.1       root      259: {
                    260:     int i;
1.1.1.10! root      261:     uint64_t mask = stop_flags | L2E_OFFSET_MASK;
        !           262:     uint64_t offset = be64_to_cpu(l2_table[0]) & mask;
1.1       root      263: 
                    264:     if (!offset)
                    265:         return 0;
                    266: 
1.1.1.10! root      267:     for (i = start; i < start + nb_clusters; i++) {
        !           268:         uint64_t l2_entry = be64_to_cpu(l2_table[i]) & mask;
        !           269:         if (offset + (uint64_t) i * cluster_size != l2_entry) {
1.1       root      270:             break;
1.1.1.10! root      271:         }
        !           272:     }
1.1       root      273: 
                    274:        return (i - start);
                    275: }
                    276: 
                    277: static int count_contiguous_free_clusters(uint64_t nb_clusters, uint64_t *l2_table)
                    278: {
1.1.1.10! root      279:     int i;
1.1       root      280: 
1.1.1.10! root      281:     for (i = 0; i < nb_clusters; i++) {
        !           282:         int type = qcow2_get_cluster_type(be64_to_cpu(l2_table[i]));
        !           283: 
        !           284:         if (type != QCOW2_CLUSTER_UNALLOCATED) {
        !           285:             break;
        !           286:         }
        !           287:     }
1.1       root      288: 
                    289:     return i;
                    290: }
                    291: 
                    292: /* The crypt function is compatible with the linux cryptoloop
                    293:    algorithm for < 4 GB images. NOTE: out_buf == in_buf is
                    294:    supported */
                    295: void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
                    296:                            uint8_t *out_buf, const uint8_t *in_buf,
                    297:                            int nb_sectors, int enc,
                    298:                            const AES_KEY *key)
                    299: {
                    300:     union {
                    301:         uint64_t ll[2];
                    302:         uint8_t b[16];
                    303:     } ivec;
                    304:     int i;
                    305: 
                    306:     for(i = 0; i < nb_sectors; i++) {
                    307:         ivec.ll[0] = cpu_to_le64(sector_num);
                    308:         ivec.ll[1] = 0;
                    309:         AES_cbc_encrypt(in_buf, out_buf, 512, key,
                    310:                         ivec.b, enc);
                    311:         sector_num++;
                    312:         in_buf += 512;
                    313:         out_buf += 512;
                    314:     }
                    315: }
                    316: 
1.1.1.10! root      317: static int coroutine_fn copy_sectors(BlockDriverState *bs,
        !           318:                                      uint64_t start_sect,
        !           319:                                      uint64_t cluster_offset,
        !           320:                                      int n_start, int n_end)
1.1       root      321: {
                    322:     BDRVQcowState *s = bs->opaque;
1.1.1.7   root      323:     QEMUIOVector qiov;
1.1.1.10! root      324:     struct iovec iov;
        !           325:     int n, ret;
1.1       root      326: 
1.1.1.10! root      327:     /*
        !           328:      * If this is the last cluster and it is only partially used, we must only
        !           329:      * copy until the end of the image, or bdrv_check_request will fail for the
        !           330:      * bdrv_read/write calls below.
        !           331:      */
        !           332:     if (start_sect + n_end > bs->total_sectors) {
        !           333:         n_end = bs->total_sectors - start_sect;
1.1       root      334:     }
                    335: 
                    336:     n = n_end - n_start;
1.1.1.10! root      337:     if (n <= 0) {
1.1       root      338:         return 0;
1.1.1.10! root      339:     }
        !           340: 
        !           341:     iov.iov_len = n * BDRV_SECTOR_SIZE;
        !           342:     iov.iov_base = qemu_blockalign(bs, iov.iov_len);
        !           343: 
        !           344:     qemu_iovec_init_external(&qiov, &iov, 1);
        !           345: 
1.1.1.6   root      346:     BLKDBG_EVENT(bs->file, BLKDBG_COW_READ);
1.1.1.10! root      347: 
        !           348:     /* Call .bdrv_co_readv() directly instead of using the public block-layer
        !           349:      * interface.  This avoids double I/O throttling and request tracking,
        !           350:      * which can lead to deadlock when block layer copy-on-read is enabled.
        !           351:      */
        !           352:     ret = bs->drv->bdrv_co_readv(bs, start_sect + n_start, n, &qiov);
        !           353:     if (ret < 0) {
        !           354:         goto out;
        !           355:     }
        !           356: 
1.1       root      357:     if (s->crypt_method) {
                    358:         qcow2_encrypt_sectors(s, start_sect + n_start,
1.1.1.10! root      359:                         iov.iov_base, iov.iov_base, n, 1,
1.1       root      360:                         &s->aes_encrypt_key);
                    361:     }
1.1.1.10! root      362: 
1.1.1.6   root      363:     BLKDBG_EVENT(bs->file, BLKDBG_COW_WRITE);
1.1.1.10! root      364:     ret = bdrv_co_writev(bs->file, (cluster_offset >> 9) + n_start, n, &qiov);
        !           365:     if (ret < 0) {
        !           366:         goto out;
        !           367:     }
        !           368: 
        !           369:     ret = 0;
        !           370: out:
        !           371:     qemu_vfree(iov.iov_base);
        !           372:     return ret;
1.1       root      373: }
                    374: 
                    375: 
                    376: /*
                    377:  * get_cluster_offset
                    378:  *
1.1.1.6   root      379:  * For a given offset of the disk image, find the cluster offset in
                    380:  * qcow2 file. The offset is stored in *cluster_offset.
1.1       root      381:  *
1.1.1.9   root      382:  * on entry, *num is the number of contiguous sectors we'd like to
1.1       root      383:  * access following offset.
                    384:  *
1.1.1.9   root      385:  * on exit, *num is the number of contiguous sectors we can read.
1.1       root      386:  *
1.1.1.10! root      387:  * Returns the cluster type (QCOW2_CLUSTER_*) on success, -errno in error
        !           388:  * cases.
1.1       root      389:  */
1.1.1.6   root      390: int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
                    391:     int *num, uint64_t *cluster_offset)
1.1       root      392: {
                    393:     BDRVQcowState *s = bs->opaque;
1.1.1.2   root      394:     unsigned int l1_index, l2_index;
1.1.1.6   root      395:     uint64_t l2_offset, *l2_table;
1.1       root      396:     int l1_bits, c;
1.1.1.2   root      397:     unsigned int index_in_cluster, nb_clusters;
                    398:     uint64_t nb_available, nb_needed;
1.1.1.6   root      399:     int ret;
1.1       root      400: 
                    401:     index_in_cluster = (offset >> 9) & (s->cluster_sectors - 1);
                    402:     nb_needed = *num + index_in_cluster;
                    403: 
                    404:     l1_bits = s->l2_bits + s->cluster_bits;
                    405: 
                    406:     /* compute how many bytes there are between the offset and
                    407:      * the end of the l1 entry
                    408:      */
                    409: 
1.1.1.2   root      410:     nb_available = (1ULL << l1_bits) - (offset & ((1ULL << l1_bits) - 1));
1.1       root      411: 
                    412:     /* compute the number of available sectors */
                    413: 
                    414:     nb_available = (nb_available >> 9) + index_in_cluster;
                    415: 
                    416:     if (nb_needed > nb_available) {
                    417:         nb_needed = nb_available;
                    418:     }
                    419: 
1.1.1.6   root      420:     *cluster_offset = 0;
1.1       root      421: 
                    422:     /* seek the the l2 offset in the l1 table */
                    423: 
                    424:     l1_index = offset >> l1_bits;
1.1.1.10! root      425:     if (l1_index >= s->l1_size) {
        !           426:         ret = QCOW2_CLUSTER_UNALLOCATED;
1.1       root      427:         goto out;
1.1.1.10! root      428:     }
1.1       root      429: 
1.1.1.10! root      430:     l2_offset = s->l1_table[l1_index] & L1E_OFFSET_MASK;
        !           431:     if (!l2_offset) {
        !           432:         ret = QCOW2_CLUSTER_UNALLOCATED;
1.1       root      433:         goto out;
1.1.1.10! root      434:     }
1.1       root      435: 
                    436:     /* load the l2 table in memory */
                    437: 
1.1.1.6   root      438:     ret = l2_load(bs, l2_offset, &l2_table);
                    439:     if (ret < 0) {
                    440:         return ret;
                    441:     }
1.1       root      442: 
                    443:     /* find the cluster offset for the given disk offset */
                    444: 
                    445:     l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1);
1.1.1.6   root      446:     *cluster_offset = be64_to_cpu(l2_table[l2_index]);
1.1       root      447:     nb_clusters = size_to_clusters(s, nb_needed << 9);
                    448: 
1.1.1.10! root      449:     ret = qcow2_get_cluster_type(*cluster_offset);
        !           450:     switch (ret) {
        !           451:     case QCOW2_CLUSTER_COMPRESSED:
        !           452:         /* Compressed clusters can only be processed one by one */
        !           453:         c = 1;
        !           454:         *cluster_offset &= L2E_COMPRESSED_OFFSET_SIZE_MASK;
        !           455:         break;
        !           456:     case QCOW2_CLUSTER_ZERO:
        !           457:         c = count_contiguous_clusters(nb_clusters, s->cluster_size,
        !           458:                 &l2_table[l2_index], 0,
        !           459:                 QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO);
        !           460:         *cluster_offset = 0;
        !           461:         break;
        !           462:     case QCOW2_CLUSTER_UNALLOCATED:
1.1       root      463:         /* how many empty clusters ? */
                    464:         c = count_contiguous_free_clusters(nb_clusters, &l2_table[l2_index]);
1.1.1.10! root      465:         *cluster_offset = 0;
        !           466:         break;
        !           467:     case QCOW2_CLUSTER_NORMAL:
1.1       root      468:         /* how many allocated clusters ? */
                    469:         c = count_contiguous_clusters(nb_clusters, s->cluster_size,
1.1.1.10! root      470:                 &l2_table[l2_index], 0,
        !           471:                 QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO);
        !           472:         *cluster_offset &= L2E_OFFSET_MASK;
        !           473:         break;
        !           474:     default:
        !           475:         abort();
1.1       root      476:     }
                    477: 
1.1.1.7   root      478:     qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    479: 
1.1.1.10! root      480:     nb_available = (c * s->cluster_sectors);
        !           481: 
1.1       root      482: out:
                    483:     if (nb_available > nb_needed)
                    484:         nb_available = nb_needed;
                    485: 
                    486:     *num = nb_available - index_in_cluster;
                    487: 
1.1.1.10! root      488:     return ret;
1.1       root      489: }
                    490: 
                    491: /*
                    492:  * get_cluster_table
                    493:  *
                    494:  * for a given disk offset, load (and allocate if needed)
                    495:  * the l2 table.
                    496:  *
                    497:  * the l2 table offset in the qcow2 file and the cluster index
                    498:  * in the l2 table are given to the caller.
                    499:  *
1.1.1.3   root      500:  * Returns 0 on success, -errno in failure case
1.1       root      501:  */
                    502: static int get_cluster_table(BlockDriverState *bs, uint64_t offset,
                    503:                              uint64_t **new_l2_table,
                    504:                              int *new_l2_index)
                    505: {
                    506:     BDRVQcowState *s = bs->opaque;
1.1.1.2   root      507:     unsigned int l1_index, l2_index;
1.1.1.6   root      508:     uint64_t l2_offset;
                    509:     uint64_t *l2_table = NULL;
1.1.1.2   root      510:     int ret;
1.1       root      511: 
                    512:     /* seek the the l2 offset in the l1 table */
                    513: 
                    514:     l1_index = offset >> (s->l2_bits + s->cluster_bits);
                    515:     if (l1_index >= s->l1_size) {
1.1.1.7   root      516:         ret = qcow2_grow_l1_table(bs, l1_index + 1, false);
1.1.1.3   root      517:         if (ret < 0) {
                    518:             return ret;
                    519:         }
1.1       root      520:     }
1.1.1.10! root      521: 
        !           522:     l2_offset = s->l1_table[l1_index] & L1E_OFFSET_MASK;
1.1       root      523: 
                    524:     /* seek the l2 table of the given l2 offset */
                    525: 
1.1.1.10! root      526:     if (s->l1_table[l1_index] & QCOW_OFLAG_COPIED) {
1.1       root      527:         /* load the l2 table in memory */
1.1.1.6   root      528:         ret = l2_load(bs, l2_offset, &l2_table);
                    529:         if (ret < 0) {
                    530:             return ret;
1.1.1.3   root      531:         }
1.1       root      532:     } else {
1.1.1.7   root      533:         /* First allocate a new L2 table (and do COW if needed) */
1.1.1.6   root      534:         ret = l2_allocate(bs, l1_index, &l2_table);
                    535:         if (ret < 0) {
                    536:             return ret;
1.1.1.3   root      537:         }
1.1.1.7   root      538: 
                    539:         /* Then decrease the refcount of the old table */
                    540:         if (l2_offset) {
                    541:             qcow2_free_clusters(bs, l2_offset, s->l2_size * sizeof(uint64_t));
                    542:         }
1.1.1.10! root      543:         l2_offset = s->l1_table[l1_index] & L1E_OFFSET_MASK;
1.1       root      544:     }
                    545: 
                    546:     /* find the cluster offset for the given disk offset */
                    547: 
                    548:     l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1);
                    549: 
                    550:     *new_l2_table = l2_table;
                    551:     *new_l2_index = l2_index;
                    552: 
1.1.1.3   root      553:     return 0;
1.1       root      554: }
                    555: 
                    556: /*
                    557:  * alloc_compressed_cluster_offset
                    558:  *
                    559:  * For a given offset of the disk image, return cluster offset in
                    560:  * qcow2 file.
                    561:  *
                    562:  * If the offset is not found, allocate a new compressed cluster.
                    563:  *
                    564:  * Return the cluster offset if successful,
                    565:  * Return 0, otherwise.
                    566:  *
                    567:  */
                    568: 
                    569: uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
                    570:                                                uint64_t offset,
                    571:                                                int compressed_size)
                    572: {
                    573:     BDRVQcowState *s = bs->opaque;
                    574:     int l2_index, ret;
1.1.1.10! root      575:     uint64_t *l2_table;
1.1.1.3   root      576:     int64_t cluster_offset;
1.1       root      577:     int nb_csectors;
                    578: 
1.1.1.10! root      579:     ret = get_cluster_table(bs, offset, &l2_table, &l2_index);
1.1.1.3   root      580:     if (ret < 0) {
1.1       root      581:         return 0;
1.1.1.3   root      582:     }
1.1       root      583: 
1.1.1.10! root      584:     /* Compression can't overwrite anything. Fail if the cluster was already
        !           585:      * allocated. */
1.1       root      586:     cluster_offset = be64_to_cpu(l2_table[l2_index]);
1.1.1.10! root      587:     if (cluster_offset & L2E_OFFSET_MASK) {
1.1.1.9   root      588:         qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    589:         return 0;
                    590:     }
1.1       root      591: 
                    592:     cluster_offset = qcow2_alloc_bytes(bs, compressed_size);
1.1.1.3   root      593:     if (cluster_offset < 0) {
1.1.1.7   root      594:         qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
1.1.1.3   root      595:         return 0;
                    596:     }
                    597: 
1.1       root      598:     nb_csectors = ((cluster_offset + compressed_size - 1) >> 9) -
                    599:                   (cluster_offset >> 9);
                    600: 
                    601:     cluster_offset |= QCOW_OFLAG_COMPRESSED |
                    602:                       ((uint64_t)nb_csectors << s->csize_shift);
                    603: 
                    604:     /* update L2 table */
                    605: 
                    606:     /* compressed clusters never have the copied flag */
                    607: 
1.1.1.6   root      608:     BLKDBG_EVENT(bs->file, BLKDBG_L2_UPDATE_COMPRESSED);
1.1.1.7   root      609:     qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
1.1       root      610:     l2_table[l2_index] = cpu_to_be64(cluster_offset);
1.1.1.7   root      611:     ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
1.1.1.5   root      612:     if (ret < 0) {
1.1.1.7   root      613:         return 0;
1.1       root      614:     }
                    615: 
1.1.1.7   root      616:     return cluster_offset;
1.1       root      617: }
                    618: 
1.1.1.3   root      619: int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m)
1.1       root      620: {
                    621:     BDRVQcowState *s = bs->opaque;
                    622:     int i, j = 0, l2_index, ret;
1.1.1.10! root      623:     uint64_t *old_cluster, start_sect, *l2_table;
        !           624:     uint64_t cluster_offset = m->alloc_offset;
1.1.1.7   root      625:     bool cow = false;
1.1       root      626: 
1.1.1.10! root      627:     trace_qcow2_cluster_link_l2(qemu_coroutine_self(), m->nb_clusters);
        !           628: 
1.1       root      629:     if (m->nb_clusters == 0)
                    630:         return 0;
                    631: 
1.1.1.9   root      632:     old_cluster = g_malloc(m->nb_clusters * sizeof(uint64_t));
1.1       root      633: 
                    634:     /* copy content of unmodified sectors */
                    635:     start_sect = (m->offset & ~(s->cluster_size - 1)) >> 9;
                    636:     if (m->n_start) {
1.1.1.7   root      637:         cow = true;
1.1.1.10! root      638:         qemu_co_mutex_unlock(&s->lock);
1.1       root      639:         ret = copy_sectors(bs, start_sect, cluster_offset, 0, m->n_start);
1.1.1.10! root      640:         qemu_co_mutex_lock(&s->lock);
1.1       root      641:         if (ret < 0)
                    642:             goto err;
                    643:     }
                    644: 
                    645:     if (m->nb_available & (s->cluster_sectors - 1)) {
                    646:         uint64_t end = m->nb_available & ~(uint64_t)(s->cluster_sectors - 1);
1.1.1.7   root      647:         cow = true;
1.1.1.10! root      648:         qemu_co_mutex_unlock(&s->lock);
1.1       root      649:         ret = copy_sectors(bs, start_sect + end, cluster_offset + (end << 9),
                    650:                 m->nb_available - end, s->cluster_sectors);
1.1.1.10! root      651:         qemu_co_mutex_lock(&s->lock);
1.1       root      652:         if (ret < 0)
                    653:             goto err;
                    654:     }
                    655: 
1.1.1.7   root      656:     /*
                    657:      * Update L2 table.
                    658:      *
                    659:      * Before we update the L2 table to actually point to the new cluster, we
                    660:      * need to be sure that the refcounts have been increased and COW was
                    661:      * handled.
                    662:      */
                    663:     if (cow) {
                    664:         qcow2_cache_depends_on_flush(s->l2_table_cache);
                    665:     }
                    666: 
                    667:     qcow2_cache_set_dependency(bs, s->l2_table_cache, s->refcount_block_cache);
1.1.1.10! root      668:     ret = get_cluster_table(bs, m->offset, &l2_table, &l2_index);
1.1.1.3   root      669:     if (ret < 0) {
1.1       root      670:         goto err;
1.1.1.3   root      671:     }
1.1.1.7   root      672:     qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
1.1       root      673: 
                    674:     for (i = 0; i < m->nb_clusters; i++) {
                    675:         /* if two concurrent writes happen to the same unallocated cluster
                    676:         * each write allocates separate cluster and writes data concurrently.
                    677:         * The first one to complete updates l2 table with pointer to its
                    678:         * cluster the second one has to do RMW (which is done above by
                    679:         * copy_sectors()), update l2 table with its cluster pointer and free
                    680:         * old cluster. This is what this loop does */
                    681:         if(l2_table[l2_index + i] != 0)
                    682:             old_cluster[j++] = l2_table[l2_index + i];
                    683: 
                    684:         l2_table[l2_index + i] = cpu_to_be64((cluster_offset +
                    685:                     (i << s->cluster_bits)) | QCOW_OFLAG_COPIED);
                    686:      }
                    687: 
1.1.1.7   root      688: 
                    689:     ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
1.1.1.5   root      690:     if (ret < 0) {
1.1       root      691:         goto err;
                    692:     }
                    693: 
1.1.1.6   root      694:     /*
                    695:      * If this was a COW, we need to decrease the refcount of the old cluster.
                    696:      * Also flush bs->file to get the right order for L2 and refcount update.
                    697:      */
                    698:     if (j != 0) {
                    699:         for (i = 0; i < j; i++) {
1.1.1.10! root      700:             qcow2_free_any_clusters(bs, be64_to_cpu(old_cluster[i]), 1);
1.1.1.6   root      701:         }
                    702:     }
1.1       root      703: 
                    704:     ret = 0;
                    705: err:
1.1.1.9   root      706:     g_free(old_cluster);
1.1       root      707:     return ret;
                    708:  }
                    709: 
                    710: /*
1.1.1.10! root      711:  * Returns the number of contiguous clusters that can be used for an allocating
        !           712:  * write, but require COW to be performed (this includes yet unallocated space,
        !           713:  * which must copy from the backing file)
1.1       root      714:  */
1.1.1.10! root      715: static int count_cow_clusters(BDRVQcowState *s, int nb_clusters,
        !           716:     uint64_t *l2_table, int l2_index)
1.1       root      717: {
1.1.1.10! root      718:     int i;
1.1       root      719: 
1.1.1.10! root      720:     for (i = 0; i < nb_clusters; i++) {
        !           721:         uint64_t l2_entry = be64_to_cpu(l2_table[l2_index + i]);
        !           722:         int cluster_type = qcow2_get_cluster_type(l2_entry);
1.1       root      723: 
1.1.1.10! root      724:         switch(cluster_type) {
        !           725:         case QCOW2_CLUSTER_NORMAL:
        !           726:             if (l2_entry & QCOW_OFLAG_COPIED) {
        !           727:                 goto out;
        !           728:             }
1.1       root      729:             break;
1.1.1.10! root      730:         case QCOW2_CLUSTER_UNALLOCATED:
        !           731:         case QCOW2_CLUSTER_COMPRESSED:
        !           732:         case QCOW2_CLUSTER_ZERO:
1.1.1.3   root      733:             break;
1.1.1.10! root      734:         default:
        !           735:             abort();
1.1.1.3   root      736:         }
1.1       root      737:     }
1.1.1.10! root      738: 
        !           739: out:
1.1.1.3   root      740:     assert(i <= nb_clusters);
1.1.1.10! root      741:     return i;
        !           742: }
        !           743: 
        !           744: /*
        !           745:  * Allocates new clusters for the given guest_offset.
        !           746:  *
        !           747:  * At most *nb_clusters are allocated, and on return *nb_clusters is updated to
        !           748:  * contain the number of clusters that have been allocated and are contiguous
        !           749:  * in the image file.
        !           750:  *
        !           751:  * If *host_offset is non-zero, it specifies the offset in the image file at
        !           752:  * which the new clusters must start. *nb_clusters can be 0 on return in this
        !           753:  * case if the cluster at host_offset is already in use. If *host_offset is
        !           754:  * zero, the clusters can be allocated anywhere in the image file.
        !           755:  *
        !           756:  * *host_offset is updated to contain the offset into the image file at which
        !           757:  * the first allocated cluster starts.
        !           758:  *
        !           759:  * Return 0 on success and -errno in error cases. -EAGAIN means that the
        !           760:  * function has been waiting for another request and the allocation must be
        !           761:  * restarted, but the whole request should not be failed.
        !           762:  */
        !           763: static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset,
        !           764:     uint64_t *host_offset, unsigned int *nb_clusters)
        !           765: {
        !           766:     BDRVQcowState *s = bs->opaque;
        !           767:     QCowL2Meta *old_alloc;
        !           768: 
        !           769:     trace_qcow2_do_alloc_clusters_offset(qemu_coroutine_self(), guest_offset,
        !           770:                                          *host_offset, *nb_clusters);
1.1       root      771: 
                    772:     /*
                    773:      * Check if there already is an AIO write request in flight which allocates
                    774:      * the same cluster. In this case we need to wait until the previous
                    775:      * request has completed and updated the L2 table accordingly.
                    776:      */
1.1.1.2   root      777:     QLIST_FOREACH(old_alloc, &s->cluster_allocs, next_in_flight) {
1.1       root      778: 
1.1.1.10! root      779:         uint64_t start = guest_offset >> s->cluster_bits;
        !           780:         uint64_t end = start + *nb_clusters;
1.1.1.9   root      781:         uint64_t old_start = old_alloc->offset >> s->cluster_bits;
                    782:         uint64_t old_end = old_start + old_alloc->nb_clusters;
1.1       root      783: 
1.1.1.9   root      784:         if (end < old_start || start > old_end) {
1.1       root      785:             /* No intersection */
                    786:         } else {
1.1.1.9   root      787:             if (start < old_start) {
1.1       root      788:                 /* Stop at the start of a running allocation */
1.1.1.10! root      789:                 *nb_clusters = old_start - start;
1.1       root      790:             } else {
1.1.1.10! root      791:                 *nb_clusters = 0;
1.1       root      792:             }
                    793: 
1.1.1.10! root      794:             if (*nb_clusters == 0) {
1.1.1.9   root      795:                 /* Wait for the dependency to complete. We need to recheck
                    796:                  * the free/allocated clusters when we continue. */
                    797:                 qemu_co_mutex_unlock(&s->lock);
                    798:                 qemu_co_queue_wait(&old_alloc->dependent_requests);
                    799:                 qemu_co_mutex_lock(&s->lock);
1.1.1.10! root      800:                 return -EAGAIN;
1.1       root      801:             }
                    802:         }
                    803:     }
                    804: 
1.1.1.10! root      805:     if (!*nb_clusters) {
1.1       root      806:         abort();
                    807:     }
                    808: 
1.1.1.10! root      809:     /* Allocate new clusters */
        !           810:     trace_qcow2_cluster_alloc_phys(qemu_coroutine_self());
        !           811:     if (*host_offset == 0) {
        !           812:         int64_t cluster_offset =
        !           813:             qcow2_alloc_clusters(bs, *nb_clusters * s->cluster_size);
        !           814:         if (cluster_offset < 0) {
        !           815:             return cluster_offset;
        !           816:         }
        !           817:         *host_offset = cluster_offset;
        !           818:         return 0;
        !           819:     } else {
        !           820:         int ret = qcow2_alloc_clusters_at(bs, *host_offset, *nb_clusters);
        !           821:         if (ret < 0) {
        !           822:             return ret;
        !           823:         }
        !           824:         *nb_clusters = ret;
        !           825:         return 0;
        !           826:     }
        !           827: }
        !           828: 
        !           829: /*
        !           830:  * alloc_cluster_offset
        !           831:  *
        !           832:  * For a given offset on the virtual disk, find the cluster offset in qcow2
        !           833:  * file. If the offset is not found, allocate a new cluster.
        !           834:  *
        !           835:  * If the cluster was already allocated, m->nb_clusters is set to 0 and
        !           836:  * other fields in m are meaningless.
        !           837:  *
        !           838:  * If the cluster is newly allocated, m->nb_clusters is set to the number of
        !           839:  * contiguous clusters that have been allocated. In this case, the other
        !           840:  * fields of m are valid and contain information about the first allocated
        !           841:  * cluster.
        !           842:  *
        !           843:  * If the request conflicts with another write request in flight, the coroutine
        !           844:  * is queued and will be reentered when the dependency has completed.
        !           845:  *
        !           846:  * Return 0 on success and -errno in error cases
        !           847:  */
        !           848: int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
        !           849:     int n_start, int n_end, int *num, QCowL2Meta *m)
        !           850: {
        !           851:     BDRVQcowState *s = bs->opaque;
        !           852:     int l2_index, ret, sectors;
        !           853:     uint64_t *l2_table;
        !           854:     unsigned int nb_clusters, keep_clusters;
        !           855:     uint64_t cluster_offset;
        !           856: 
        !           857:     trace_qcow2_alloc_clusters_offset(qemu_coroutine_self(), offset,
        !           858:                                       n_start, n_end);
        !           859: 
        !           860:     /* Find L2 entry for the first involved cluster */
        !           861: again:
        !           862:     ret = get_cluster_table(bs, offset, &l2_table, &l2_index);
        !           863:     if (ret < 0) {
        !           864:         return ret;
        !           865:     }
        !           866: 
        !           867:     /*
        !           868:      * Calculate the number of clusters to look for. We stop at L2 table
        !           869:      * boundaries to keep things simple.
        !           870:      */
        !           871:     nb_clusters = MIN(size_to_clusters(s, n_end << BDRV_SECTOR_BITS),
        !           872:                       s->l2_size - l2_index);
1.1.1.9   root      873: 
1.1.1.10! root      874:     cluster_offset = be64_to_cpu(l2_table[l2_index]);
1.1       root      875: 
1.1.1.10! root      876:     /*
        !           877:      * Check how many clusters are already allocated and don't need COW, and how
        !           878:      * many need a new allocation.
        !           879:      */
        !           880:     if (qcow2_get_cluster_type(cluster_offset) == QCOW2_CLUSTER_NORMAL
        !           881:         && (cluster_offset & QCOW_OFLAG_COPIED))
        !           882:     {
        !           883:         /* We keep all QCOW_OFLAG_COPIED clusters */
        !           884:         keep_clusters =
        !           885:             count_contiguous_clusters(nb_clusters, s->cluster_size,
        !           886:                                       &l2_table[l2_index], 0,
        !           887:                                       QCOW_OFLAG_COPIED | QCOW_OFLAG_ZERO);
        !           888:         assert(keep_clusters <= nb_clusters);
        !           889:         nb_clusters -= keep_clusters;
        !           890:     } else {
        !           891:         keep_clusters = 0;
        !           892:         cluster_offset = 0;
        !           893:     }
1.1       root      894: 
1.1.1.10! root      895:     if (nb_clusters > 0) {
        !           896:         /* For the moment, overwrite compressed clusters one by one */
        !           897:         uint64_t entry = be64_to_cpu(l2_table[l2_index + keep_clusters]);
        !           898:         if (entry & QCOW_OFLAG_COMPRESSED) {
        !           899:             nb_clusters = 1;
        !           900:         } else {
        !           901:             nb_clusters = count_cow_clusters(s, nb_clusters, l2_table,
        !           902:                                              l2_index + keep_clusters);
        !           903:         }
1.1.1.3   root      904:     }
1.1       root      905: 
1.1.1.10! root      906:     cluster_offset &= L2E_OFFSET_MASK;
        !           907: 
        !           908:     /*
        !           909:      * The L2 table isn't used any more after this. As long as the cache works
        !           910:      * synchronously, it's important to release it before calling
        !           911:      * do_alloc_cluster_offset, which may yield if we need to wait for another
        !           912:      * request to complete. If we still had the reference, we could use up the
        !           913:      * whole cache with sleeping requests.
        !           914:      */
1.1.1.7   root      915:     ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                    916:     if (ret < 0) {
1.1.1.10! root      917:         return ret;
        !           918:     }
        !           919: 
        !           920:     /* If there is something left to allocate, do that now */
        !           921:     *m = (QCowL2Meta) {
        !           922:         .cluster_offset     = cluster_offset,
        !           923:         .nb_clusters        = 0,
        !           924:     };
        !           925:     qemu_co_queue_init(&m->dependent_requests);
        !           926: 
        !           927:     if (nb_clusters > 0) {
        !           928:         uint64_t alloc_offset;
        !           929:         uint64_t alloc_cluster_offset;
        !           930:         uint64_t keep_bytes = keep_clusters * s->cluster_size;
        !           931: 
        !           932:         /* Calculate start and size of allocation */
        !           933:         alloc_offset = offset + keep_bytes;
        !           934: 
        !           935:         if (keep_clusters == 0) {
        !           936:             alloc_cluster_offset = 0;
        !           937:         } else {
        !           938:             alloc_cluster_offset = cluster_offset + keep_bytes;
        !           939:         }
        !           940: 
        !           941:         /* Allocate, if necessary at a given offset in the image file */
        !           942:         ret = do_alloc_cluster_offset(bs, alloc_offset, &alloc_cluster_offset,
        !           943:                                       &nb_clusters);
        !           944:         if (ret == -EAGAIN) {
        !           945:             goto again;
        !           946:         } else if (ret < 0) {
        !           947:             goto fail;
        !           948:         }
        !           949: 
        !           950:         /* save info needed for meta data update */
        !           951:         if (nb_clusters > 0) {
        !           952:             int requested_sectors = n_end - keep_clusters * s->cluster_sectors;
        !           953:             int avail_sectors = (keep_clusters + nb_clusters)
        !           954:                                 << (s->cluster_bits - BDRV_SECTOR_BITS);
        !           955: 
        !           956:             *m = (QCowL2Meta) {
        !           957:                 .cluster_offset = keep_clusters == 0 ?
        !           958:                                   alloc_cluster_offset : cluster_offset,
        !           959:                 .alloc_offset   = alloc_cluster_offset,
        !           960:                 .offset         = alloc_offset,
        !           961:                 .n_start        = keep_clusters == 0 ? n_start : 0,
        !           962:                 .nb_clusters    = nb_clusters,
        !           963:                 .nb_available   = MIN(requested_sectors, avail_sectors),
        !           964:             };
        !           965:             qemu_co_queue_init(&m->dependent_requests);
        !           966:             QLIST_INSERT_HEAD(&s->cluster_allocs, m, next_in_flight);
        !           967:         }
1.1.1.7   root      968:     }
                    969: 
1.1.1.10! root      970:     /* Some cleanup work */
        !           971:     sectors = (keep_clusters + nb_clusters) << (s->cluster_bits - 9);
        !           972:     if (sectors > n_end) {
        !           973:         sectors = n_end;
        !           974:     }
1.1       root      975: 
1.1.1.10! root      976:     assert(sectors > n_start);
        !           977:     *num = sectors - n_start;
1.1       root      978: 
1.1.1.3   root      979:     return 0;
1.1.1.7   root      980: 
                    981: fail:
1.1.1.10! root      982:     if (m->nb_clusters > 0) {
        !           983:         QLIST_REMOVE(m, next_in_flight);
        !           984:     }
1.1.1.7   root      985:     return ret;
1.1       root      986: }
                    987: 
                    988: static int decompress_buffer(uint8_t *out_buf, int out_buf_size,
                    989:                              const uint8_t *buf, int buf_size)
                    990: {
                    991:     z_stream strm1, *strm = &strm1;
                    992:     int ret, out_len;
                    993: 
                    994:     memset(strm, 0, sizeof(*strm));
                    995: 
                    996:     strm->next_in = (uint8_t *)buf;
                    997:     strm->avail_in = buf_size;
                    998:     strm->next_out = out_buf;
                    999:     strm->avail_out = out_buf_size;
                   1000: 
                   1001:     ret = inflateInit2(strm, -12);
                   1002:     if (ret != Z_OK)
                   1003:         return -1;
                   1004:     ret = inflate(strm, Z_FINISH);
                   1005:     out_len = strm->next_out - out_buf;
                   1006:     if ((ret != Z_STREAM_END && ret != Z_BUF_ERROR) ||
                   1007:         out_len != out_buf_size) {
                   1008:         inflateEnd(strm);
                   1009:         return -1;
                   1010:     }
                   1011:     inflateEnd(strm);
                   1012:     return 0;
                   1013: }
                   1014: 
1.1.1.6   root     1015: int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset)
1.1       root     1016: {
1.1.1.6   root     1017:     BDRVQcowState *s = bs->opaque;
1.1       root     1018:     int ret, csize, nb_csectors, sector_offset;
                   1019:     uint64_t coffset;
                   1020: 
                   1021:     coffset = cluster_offset & s->cluster_offset_mask;
                   1022:     if (s->cluster_cache_offset != coffset) {
                   1023:         nb_csectors = ((cluster_offset >> s->csize_shift) & s->csize_mask) + 1;
                   1024:         sector_offset = coffset & 511;
                   1025:         csize = nb_csectors * 512 - sector_offset;
1.1.1.6   root     1026:         BLKDBG_EVENT(bs->file, BLKDBG_READ_COMPRESSED);
                   1027:         ret = bdrv_read(bs->file, coffset >> 9, s->cluster_data, nb_csectors);
1.1       root     1028:         if (ret < 0) {
1.1.1.7   root     1029:             return ret;
1.1       root     1030:         }
                   1031:         if (decompress_buffer(s->cluster_cache, s->cluster_size,
                   1032:                               s->cluster_data + sector_offset, csize) < 0) {
1.1.1.7   root     1033:             return -EIO;
1.1       root     1034:         }
                   1035:         s->cluster_cache_offset = coffset;
                   1036:     }
                   1037:     return 0;
                   1038: }
1.1.1.7   root     1039: 
                   1040: /*
                   1041:  * This discards as many clusters of nb_clusters as possible at once (i.e.
                   1042:  * all clusters in the same L2 table) and returns the number of discarded
                   1043:  * clusters.
                   1044:  */
                   1045: static int discard_single_l2(BlockDriverState *bs, uint64_t offset,
                   1046:     unsigned int nb_clusters)
                   1047: {
                   1048:     BDRVQcowState *s = bs->opaque;
1.1.1.10! root     1049:     uint64_t *l2_table;
1.1.1.7   root     1050:     int l2_index;
                   1051:     int ret;
                   1052:     int i;
                   1053: 
1.1.1.10! root     1054:     ret = get_cluster_table(bs, offset, &l2_table, &l2_index);
1.1.1.7   root     1055:     if (ret < 0) {
                   1056:         return ret;
                   1057:     }
                   1058: 
                   1059:     /* Limit nb_clusters to one L2 table */
                   1060:     nb_clusters = MIN(nb_clusters, s->l2_size - l2_index);
                   1061: 
                   1062:     for (i = 0; i < nb_clusters; i++) {
                   1063:         uint64_t old_offset;
                   1064: 
                   1065:         old_offset = be64_to_cpu(l2_table[l2_index + i]);
1.1.1.10! root     1066:         if ((old_offset & L2E_OFFSET_MASK) == 0) {
1.1.1.7   root     1067:             continue;
                   1068:         }
                   1069: 
                   1070:         /* First remove L2 entries */
                   1071:         qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
                   1072:         l2_table[l2_index + i] = cpu_to_be64(0);
                   1073: 
                   1074:         /* Then decrease the refcount */
                   1075:         qcow2_free_any_clusters(bs, old_offset, 1);
                   1076:     }
                   1077: 
                   1078:     ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
                   1079:     if (ret < 0) {
                   1080:         return ret;
                   1081:     }
                   1082: 
                   1083:     return nb_clusters;
                   1084: }
                   1085: 
                   1086: int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
                   1087:     int nb_sectors)
                   1088: {
                   1089:     BDRVQcowState *s = bs->opaque;
                   1090:     uint64_t end_offset;
                   1091:     unsigned int nb_clusters;
                   1092:     int ret;
                   1093: 
                   1094:     end_offset = offset + (nb_sectors << BDRV_SECTOR_BITS);
                   1095: 
                   1096:     /* Round start up and end down */
                   1097:     offset = align_offset(offset, s->cluster_size);
                   1098:     end_offset &= ~(s->cluster_size - 1);
                   1099: 
                   1100:     if (offset > end_offset) {
                   1101:         return 0;
                   1102:     }
                   1103: 
                   1104:     nb_clusters = size_to_clusters(s, end_offset - offset);
                   1105: 
                   1106:     /* Each L2 table is handled by its own loop iteration */
                   1107:     while (nb_clusters > 0) {
                   1108:         ret = discard_single_l2(bs, offset, nb_clusters);
                   1109:         if (ret < 0) {
                   1110:             return ret;
                   1111:         }
                   1112: 
                   1113:         nb_clusters -= ret;
                   1114:         offset += (ret * s->cluster_size);
                   1115:     }
                   1116: 
                   1117:     return 0;
                   1118: }
1.1.1.10! root     1119: 
        !          1120: /*
        !          1121:  * This zeroes as many clusters of nb_clusters as possible at once (i.e.
        !          1122:  * all clusters in the same L2 table) and returns the number of zeroed
        !          1123:  * clusters.
        !          1124:  */
        !          1125: static int zero_single_l2(BlockDriverState *bs, uint64_t offset,
        !          1126:     unsigned int nb_clusters)
        !          1127: {
        !          1128:     BDRVQcowState *s = bs->opaque;
        !          1129:     uint64_t *l2_table;
        !          1130:     int l2_index;
        !          1131:     int ret;
        !          1132:     int i;
        !          1133: 
        !          1134:     ret = get_cluster_table(bs, offset, &l2_table, &l2_index);
        !          1135:     if (ret < 0) {
        !          1136:         return ret;
        !          1137:     }
        !          1138: 
        !          1139:     /* Limit nb_clusters to one L2 table */
        !          1140:     nb_clusters = MIN(nb_clusters, s->l2_size - l2_index);
        !          1141: 
        !          1142:     for (i = 0; i < nb_clusters; i++) {
        !          1143:         uint64_t old_offset;
        !          1144: 
        !          1145:         old_offset = be64_to_cpu(l2_table[l2_index + i]);
        !          1146: 
        !          1147:         /* Update L2 entries */
        !          1148:         qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
        !          1149:         if (old_offset & QCOW_OFLAG_COMPRESSED) {
        !          1150:             l2_table[l2_index + i] = cpu_to_be64(QCOW_OFLAG_ZERO);
        !          1151:             qcow2_free_any_clusters(bs, old_offset, 1);
        !          1152:         } else {
        !          1153:             l2_table[l2_index + i] |= cpu_to_be64(QCOW_OFLAG_ZERO);
        !          1154:         }
        !          1155:     }
        !          1156: 
        !          1157:     ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
        !          1158:     if (ret < 0) {
        !          1159:         return ret;
        !          1160:     }
        !          1161: 
        !          1162:     return nb_clusters;
        !          1163: }
        !          1164: 
        !          1165: int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors)
        !          1166: {
        !          1167:     BDRVQcowState *s = bs->opaque;
        !          1168:     unsigned int nb_clusters;
        !          1169:     int ret;
        !          1170: 
        !          1171:     /* The zero flag is only supported by version 3 and newer */
        !          1172:     if (s->qcow_version < 3) {
        !          1173:         return -ENOTSUP;
        !          1174:     }
        !          1175: 
        !          1176:     /* Each L2 table is handled by its own loop iteration */
        !          1177:     nb_clusters = size_to_clusters(s, nb_sectors << BDRV_SECTOR_BITS);
        !          1178: 
        !          1179:     while (nb_clusters > 0) {
        !          1180:         ret = zero_single_l2(bs, offset, nb_clusters);
        !          1181:         if (ret < 0) {
        !          1182:             return ret;
        !          1183:         }
        !          1184: 
        !          1185:         nb_clusters -= ret;
        !          1186:         offset += (ret * s->cluster_size);
        !          1187:     }
        !          1188: 
        !          1189:     return 0;
        !          1190: }

unix.superglobalmegacorp.com

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