X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=block%2Fbochs.c;h=2f010ab40a1ccd3669b64aed3c10aff17435335c;hb=a3c7d9162513c2bea742f4278a58e401c6f37d0c;hp=516da56c3b1acf50e6cbe073e417a1bff927a008;hpb=f1d640524d0557f78343504c3b128d412f573f28;p=mirror_qemu.git diff --git a/block/bochs.c b/block/bochs.c index 516da56c3b..2f010ab40a 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -24,10 +24,10 @@ */ #include "qemu/osdep.h" #include "qapi/error.h" -#include "qemu-common.h" #include "block/block_int.h" #include "qemu/module.h" #include "qemu/bswap.h" +#include "qemu/error-report.h" /**************************************************************/ @@ -84,14 +84,14 @@ static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename) const struct bochs_header *bochs = (const void *)buf; if (buf_size < HEADER_SIZE) - return 0; + return 0; if (!strcmp(bochs->magic, HEADER_MAGIC) && - !strcmp(bochs->type, REDOLOG_TYPE) && - !strcmp(bochs->subtype, GROWING_TYPE) && - ((le32_to_cpu(bochs->version) == HEADER_VERSION) || - (le32_to_cpu(bochs->version) == HEADER_V1))) - return 100; + !strcmp(bochs->type, REDOLOG_TYPE) && + !strcmp(bochs->subtype, GROWING_TYPE) && + ((le32_to_cpu(bochs->version) == HEADER_VERSION) || + (le32_to_cpu(bochs->version) == HEADER_V1))) + return 100; return 0; } @@ -104,14 +104,18 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags, struct bochs_header bochs; int ret; - bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, - false, errp); + /* No write support yet */ + ret = bdrv_apply_auto_read_only(bs, NULL, errp); + if (ret < 0) { + return ret; + } + + bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds, + BDRV_CHILD_IMAGE, false, errp); if (!bs->file) { return -EINVAL; } - bs->read_only = true; /* no write support yet */ - ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs)); if (ret < 0) { return ret; @@ -120,8 +124,8 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags, if (strcmp(bochs.magic, HEADER_MAGIC) || strcmp(bochs.type, REDOLOG_TYPE) || strcmp(bochs.subtype, GROWING_TYPE) || - ((le32_to_cpu(bochs.version) != HEADER_VERSION) && - (le32_to_cpu(bochs.version) != HEADER_V1))) { + ((le32_to_cpu(bochs.version) != HEADER_VERSION) && + (le32_to_cpu(bochs.version) != HEADER_V1))) { error_setg(errp, "Image not in Bochs format"); return -EINVAL; } @@ -153,7 +157,7 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags, } for (i = 0; i < s->catalog_size; i++) - le32_to_cpus(&s->catalog_bitmap[i]); + le32_to_cpus(&s->catalog_bitmap[i]); s->data_offset = le32_to_cpu(bochs.header) + (s->catalog_size * 4); @@ -212,7 +216,7 @@ static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num) extent_offset = (offset % s->extent_size) / 512; if (s->catalog_bitmap[extent_index] == 0xffffffff) { - return 0; /* not allocated */ + return 0; /* not allocated */ } bitmap_offset = s->data_offset + @@ -227,7 +231,7 @@ static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num) } if (!((bitmap_entry >> (extent_offset % 8)) & 1)) { - return 0; /* not allocated */ + return 0; /* not allocated */ } return bitmap_offset + (512 * (s->bitmap_blocks + extent_offset)); @@ -244,8 +248,8 @@ bochs_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes, QEMUIOVector local_qiov; int ret; - assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); - assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); + assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE)); + assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE)); qemu_iovec_init(&local_qiov, qiov->niov); qemu_co_mutex_lock(&s->lock); @@ -293,10 +297,11 @@ static BlockDriver bdrv_bochs = { .instance_size = sizeof(BDRVBochsState), .bdrv_probe = bochs_probe, .bdrv_open = bochs_open, - .bdrv_child_perm = bdrv_format_default_perms, + .bdrv_child_perm = bdrv_default_perms, .bdrv_refresh_limits = bochs_refresh_limits, .bdrv_co_preadv = bochs_co_preadv, .bdrv_close = bochs_close, + .is_format = true, }; static void bdrv_bochs_init(void)