diff options
author | RajithaY <rajithax.yerrumsetty@intel.com> | 2017-04-25 03:31:15 -0700 |
---|---|---|
committer | Rajitha Yerrumchetty <rajithax.yerrumsetty@intel.com> | 2017-05-22 06:48:08 +0000 |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/block/cloop.c | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/block/cloop.c')
-rw-r--r-- | qemu/block/cloop.c | 285 |
1 files changed, 0 insertions, 285 deletions
diff --git a/qemu/block/cloop.c b/qemu/block/cloop.c deleted file mode 100644 index a84f14019..000000000 --- a/qemu/block/cloop.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * QEMU Block driver for CLOOP images - * - * Copyright (c) 2004 Johannes E. Schindelin - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#include "qemu/osdep.h" -#include "qapi/error.h" -#include "qemu-common.h" -#include "block/block_int.h" -#include "qemu/module.h" -#include <zlib.h> - -/* Maximum compressed block size */ -#define MAX_BLOCK_SIZE (64 * 1024 * 1024) - -typedef struct BDRVCloopState { - CoMutex lock; - uint32_t block_size; - uint32_t n_blocks; - uint64_t *offsets; - uint32_t sectors_per_block; - uint32_t current_block; - uint8_t *compressed_block; - uint8_t *uncompressed_block; - z_stream zstream; -} BDRVCloopState; - -static int cloop_probe(const uint8_t *buf, int buf_size, const char *filename) -{ - const char *magic_version_2_0 = "#!/bin/sh\n" - "#V2.0 Format\n" - "modprobe cloop file=$0 && mount -r -t iso9660 /dev/cloop $1\n"; - int length = strlen(magic_version_2_0); - if (length > buf_size) { - length = buf_size; - } - if (!memcmp(magic_version_2_0, buf, length)) { - return 2; - } - return 0; -} - -static int cloop_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) -{ - BDRVCloopState *s = bs->opaque; - uint32_t offsets_size, max_compressed_block_size = 1, i; - int ret; - - bs->read_only = 1; - - /* read header */ - ret = bdrv_pread(bs->file->bs, 128, &s->block_size, 4); - if (ret < 0) { - return ret; - } - s->block_size = be32_to_cpu(s->block_size); - if (s->block_size % 512) { - error_setg(errp, "block_size %" PRIu32 " must be a multiple of 512", - s->block_size); - return -EINVAL; - } - if (s->block_size == 0) { - error_setg(errp, "block_size cannot be zero"); - return -EINVAL; - } - - /* cloop's create_compressed_fs.c warns about block sizes beyond 256 KB but - * we can accept more. Prevent ridiculous values like 4 GB - 1 since we - * need a buffer this big. - */ - if (s->block_size > MAX_BLOCK_SIZE) { - error_setg(errp, "block_size %" PRIu32 " must be %u MB or less", - s->block_size, - MAX_BLOCK_SIZE / (1024 * 1024)); - return -EINVAL; - } - - ret = bdrv_pread(bs->file->bs, 128 + 4, &s->n_blocks, 4); - if (ret < 0) { - return ret; - } - s->n_blocks = be32_to_cpu(s->n_blocks); - - /* read offsets */ - if (s->n_blocks > (UINT32_MAX - 1) / sizeof(uint64_t)) { - /* Prevent integer overflow */ - error_setg(errp, "n_blocks %" PRIu32 " must be %zu or less", - s->n_blocks, - (UINT32_MAX - 1) / sizeof(uint64_t)); - return -EINVAL; - } - offsets_size = (s->n_blocks + 1) * sizeof(uint64_t); - if (offsets_size > 512 * 1024 * 1024) { - /* Prevent ridiculous offsets_size which causes memory allocation to - * fail or overflows bdrv_pread() size. In practice the 512 MB - * offsets[] limit supports 16 TB images at 256 KB block size. - */ - error_setg(errp, "image requires too many offsets, " - "try increasing block size"); - return -EINVAL; - } - - s->offsets = g_try_malloc(offsets_size); - if (s->offsets == NULL) { - error_setg(errp, "Could not allocate offsets table"); - return -ENOMEM; - } - - ret = bdrv_pread(bs->file->bs, 128 + 4 + 4, s->offsets, offsets_size); - if (ret < 0) { - goto fail; - } - - for (i = 0; i < s->n_blocks + 1; i++) { - uint64_t size; - - s->offsets[i] = be64_to_cpu(s->offsets[i]); - if (i == 0) { - continue; - } - - if (s->offsets[i] < s->offsets[i - 1]) { - error_setg(errp, "offsets not monotonically increasing at " - "index %" PRIu32 ", image file is corrupt", i); - ret = -EINVAL; - goto fail; - } - - size = s->offsets[i] - s->offsets[i - 1]; - - /* Compressed blocks should be smaller than the uncompressed block size - * but maybe compression performed poorly so the compressed block is - * actually bigger. Clamp down on unrealistic values to prevent - * ridiculous s->compressed_block allocation. - */ - if (size > 2 * MAX_BLOCK_SIZE) { - error_setg(errp, "invalid compressed block size at index %" PRIu32 - ", image file is corrupt", i); - ret = -EINVAL; - goto fail; - } - - if (size > max_compressed_block_size) { - max_compressed_block_size = size; - } - } - - /* initialize zlib engine */ - s->compressed_block = g_try_malloc(max_compressed_block_size + 1); - if (s->compressed_block == NULL) { - error_setg(errp, "Could not allocate compressed_block"); - ret = -ENOMEM; - goto fail; - } - - s->uncompressed_block = g_try_malloc(s->block_size); - if (s->uncompressed_block == NULL) { - error_setg(errp, "Could not allocate uncompressed_block"); - ret = -ENOMEM; - goto fail; - } - - if (inflateInit(&s->zstream) != Z_OK) { - ret = -EINVAL; - goto fail; - } - s->current_block = s->n_blocks; - - s->sectors_per_block = s->block_size/512; - bs->total_sectors = s->n_blocks * s->sectors_per_block; - qemu_co_mutex_init(&s->lock); - return 0; - -fail: - g_free(s->offsets); - g_free(s->compressed_block); - g_free(s->uncompressed_block); - return ret; -} - -static inline int cloop_read_block(BlockDriverState *bs, int block_num) -{ - BDRVCloopState *s = bs->opaque; - - if (s->current_block != block_num) { - int ret; - uint32_t bytes = s->offsets[block_num + 1] - s->offsets[block_num]; - - ret = bdrv_pread(bs->file->bs, s->offsets[block_num], - s->compressed_block, bytes); - if (ret != bytes) { - return -1; - } - - s->zstream.next_in = s->compressed_block; - s->zstream.avail_in = bytes; - s->zstream.next_out = s->uncompressed_block; - s->zstream.avail_out = s->block_size; - ret = inflateReset(&s->zstream); - if (ret != Z_OK) { - return -1; - } - ret = inflate(&s->zstream, Z_FINISH); - if (ret != Z_STREAM_END || s->zstream.total_out != s->block_size) { - return -1; - } - - s->current_block = block_num; - } - return 0; -} - -static int cloop_read(BlockDriverState *bs, int64_t sector_num, - uint8_t *buf, int nb_sectors) -{ - BDRVCloopState *s = bs->opaque; - int i; - - for (i = 0; i < nb_sectors; i++) { - uint32_t sector_offset_in_block = - ((sector_num + i) % s->sectors_per_block), - block_num = (sector_num + i) / s->sectors_per_block; - if (cloop_read_block(bs, block_num) != 0) { - return -1; - } - memcpy(buf + i * 512, - s->uncompressed_block + sector_offset_in_block * 512, 512); - } - return 0; -} - -static coroutine_fn int cloop_co_read(BlockDriverState *bs, int64_t sector_num, - uint8_t *buf, int nb_sectors) -{ - int ret; - BDRVCloopState *s = bs->opaque; - qemu_co_mutex_lock(&s->lock); - ret = cloop_read(bs, sector_num, buf, nb_sectors); - qemu_co_mutex_unlock(&s->lock); - return ret; -} - -static void cloop_close(BlockDriverState *bs) -{ - BDRVCloopState *s = bs->opaque; - g_free(s->offsets); - g_free(s->compressed_block); - g_free(s->uncompressed_block); - inflateEnd(&s->zstream); -} - -static BlockDriver bdrv_cloop = { - .format_name = "cloop", - .instance_size = sizeof(BDRVCloopState), - .bdrv_probe = cloop_probe, - .bdrv_open = cloop_open, - .bdrv_read = cloop_co_read, - .bdrv_close = cloop_close, -}; - -static void bdrv_cloop_init(void) -{ - bdrv_register(&bdrv_cloop); -} - -block_init(bdrv_cloop_init); |