block: Convert bdrv_pread(v) to BdrvChild
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									18d51c4bac
								
							
						
					
					
						commit
						cf2ab8fc34
					
				
							
								
								
									
										7
									
								
								block.c
								
								
								
								
							
							
						
						
									
										7
									
								
								block.c
								
								
								
								
							| 
						 | 
				
			
			@ -536,9 +536,10 @@ BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
 | 
			
		|||
    return drv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int find_image_format(BlockDriverState *bs, const char *filename,
 | 
			
		||||
static int find_image_format(BdrvChild *file, const char *filename,
 | 
			
		||||
                             BlockDriver **pdrv, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    BlockDriverState *bs = file->bs;
 | 
			
		||||
    BlockDriver *drv;
 | 
			
		||||
    uint8_t buf[BLOCK_PROBE_BUF_SIZE];
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -549,7 +550,7 @@ static int find_image_format(BlockDriverState *bs, const char *filename,
 | 
			
		|||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs, 0, buf, sizeof(buf));
 | 
			
		||||
    ret = bdrv_pread(file, 0, buf, sizeof(buf));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg_errno(errp, -ret, "Could not read image for determining its "
 | 
			
		||||
                         "format");
 | 
			
		||||
| 
						 | 
				
			
			@ -1652,7 +1653,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
 | 
			
		|||
    /* Image format probing */
 | 
			
		||||
    bs->probed = !drv;
 | 
			
		||||
    if (!drv && file) {
 | 
			
		||||
        ret = find_image_format(file->bs, filename, &drv, &local_err);
 | 
			
		||||
        ret = find_image_format(file, filename, &drv, &local_err);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
 | 
			
		||||
    bs->read_only = true; /* no write support yet */
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, &bochs, sizeof(bochs));
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +140,7 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        return -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, le32_to_cpu(bochs.header), s->catalog_bitmap,
 | 
			
		||||
    ret = bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,
 | 
			
		||||
                     s->catalog_size * 4);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -214,7 +214,7 @@ static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num)
 | 
			
		|||
        (s->extent_blocks + s->bitmap_blocks));
 | 
			
		||||
 | 
			
		||||
    /* read in bitmap for current extent */
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, bitmap_offset + (extent_offset / 8),
 | 
			
		||||
    ret = bdrv_pread(bs->file, bitmap_offset + (extent_offset / 8),
 | 
			
		||||
                     &bitmap_entry, 1);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,7 +69,7 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    bs->read_only = true;
 | 
			
		||||
 | 
			
		||||
    /* read header */
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 128, &s->block_size, 4);
 | 
			
		||||
    ret = bdrv_pread(bs->file, 128, &s->block_size, 4);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +95,7 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        return -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 128 + 4, &s->n_blocks, 4);
 | 
			
		||||
    ret = bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -126,7 +126,7 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        return -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 128 + 4 + 4, s->offsets, offsets_size);
 | 
			
		||||
    ret = bdrv_pread(bs->file, 128 + 4 + 4, s->offsets, offsets_size);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ static inline int cloop_read_block(BlockDriverState *bs, int 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],
 | 
			
		||||
        ret = bdrv_pread(bs->file, s->offsets[block_num],
 | 
			
		||||
                         s->compressed_block, bytes);
 | 
			
		||||
        if (ret != bytes) {
 | 
			
		||||
            return -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ static ssize_t block_crypto_read_func(QCryptoBlock *block,
 | 
			
		|||
    BlockDriverState *bs = opaque;
 | 
			
		||||
    ssize_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, offset, buf, buflen);
 | 
			
		||||
    ret = bdrv_pread(bs->file, offset, buf, buflen);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg_errno(errp, -ret, "Could not read encryption header");
 | 
			
		||||
        return ret;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								block/dmg.c
								
								
								
								
							
							
						
						
									
										21
									
								
								block/dmg.c
								
								
								
								
							| 
						 | 
				
			
			@ -86,7 +86,7 @@ static int read_uint64(BlockDriverState *bs, int64_t offset, uint64_t *result)
 | 
			
		|||
    uint64_t buffer;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, offset, &buffer, 8);
 | 
			
		||||
    ret = bdrv_pread(bs->file, offset, &buffer, 8);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ static int read_uint32(BlockDriverState *bs, int64_t offset, uint32_t *result)
 | 
			
		|||
    uint32_t buffer;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, offset, &buffer, 4);
 | 
			
		||||
    ret = bdrv_pread(bs->file, offset, &buffer, 4);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -153,8 +153,9 @@ static void update_max_chunk_size(BDRVDMGState *s, uint32_t chunk,
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t dmg_find_koly_offset(BlockDriverState *file_bs, Error **errp)
 | 
			
		||||
static int64_t dmg_find_koly_offset(BdrvChild *file, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    BlockDriverState *file_bs = file->bs;
 | 
			
		||||
    int64_t length;
 | 
			
		||||
    int64_t offset = 0;
 | 
			
		||||
    uint8_t buffer[515];
 | 
			
		||||
| 
						 | 
				
			
			@ -178,7 +179,7 @@ static int64_t dmg_find_koly_offset(BlockDriverState *file_bs, Error **errp)
 | 
			
		|||
        offset = length - 511 - 512;
 | 
			
		||||
    }
 | 
			
		||||
    length = length < 515 ? length : 515;
 | 
			
		||||
    ret = bdrv_pread(file_bs, offset, buffer, length);
 | 
			
		||||
    ret = bdrv_pread(file, offset, buffer, length);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg_errno(errp, -ret, "Failed while reading UDIF trailer");
 | 
			
		||||
        return ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -355,7 +356,7 @@ static int dmg_read_resource_fork(BlockDriverState *bs, DmgHeaderState *ds,
 | 
			
		|||
        offset += 4;
 | 
			
		||||
 | 
			
		||||
        buffer = g_realloc(buffer, count);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, buffer, count);
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, buffer, count);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -392,7 +393,7 @@ static int dmg_read_plist_xml(BlockDriverState *bs, DmgHeaderState *ds,
 | 
			
		|||
 | 
			
		||||
    buffer = g_malloc(info_length + 1);
 | 
			
		||||
    buffer[info_length] = '\0';
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, info_begin, buffer, info_length);
 | 
			
		||||
    ret = bdrv_pread(bs->file, info_begin, buffer, info_length);
 | 
			
		||||
    if (ret != info_length) {
 | 
			
		||||
        ret = -EINVAL;
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -448,7 +449,7 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    ds.max_sectors_per_chunk = 1;
 | 
			
		||||
 | 
			
		||||
    /* locate the UDIF trailer */
 | 
			
		||||
    offset = dmg_find_koly_offset(bs->file->bs, errp);
 | 
			
		||||
    offset = dmg_find_koly_offset(bs->file, errp);
 | 
			
		||||
    if (offset < 0) {
 | 
			
		||||
        ret = offset;
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -599,7 +600,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
 | 
			
		|||
        case 0x80000005: { /* zlib compressed */
 | 
			
		||||
            /* we need to buffer, because only the chunk as whole can be
 | 
			
		||||
             * inflated. */
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs, s->offsets[chunk],
 | 
			
		||||
            ret = bdrv_pread(bs->file, s->offsets[chunk],
 | 
			
		||||
                             s->compressed_chunk, s->lengths[chunk]);
 | 
			
		||||
            if (ret != s->lengths[chunk]) {
 | 
			
		||||
                return -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -623,7 +624,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
 | 
			
		|||
        case 0x80000006: /* bzip2 compressed */
 | 
			
		||||
            /* we need to buffer, because only the chunk as whole can be
 | 
			
		||||
             * inflated. */
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs, s->offsets[chunk],
 | 
			
		||||
            ret = bdrv_pread(bs->file, s->offsets[chunk],
 | 
			
		||||
                             s->compressed_chunk, s->lengths[chunk]);
 | 
			
		||||
            if (ret != s->lengths[chunk]) {
 | 
			
		||||
                return -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -648,7 +649,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
 | 
			
		|||
            break;
 | 
			
		||||
#endif /* CONFIG_BZIP2 */
 | 
			
		||||
        case 1: /* copy */
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs, s->offsets[chunk],
 | 
			
		||||
            ret = bdrv_pread(bs->file, s->offsets[chunk],
 | 
			
		||||
                             s->uncompressed_chunk, s->lengths[chunk]);
 | 
			
		||||
            if (ret != s->lengths[chunk]) {
 | 
			
		||||
                return -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -709,11 +709,11 @@ int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_preadv(BlockDriverState *bs, int64_t offset, QEMUIOVector *qiov)
 | 
			
		||||
int bdrv_preadv(BdrvChild *child, int64_t offset, QEMUIOVector *qiov)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_prwv_co(bs, offset, qiov, false, 0);
 | 
			
		||||
    ret = bdrv_prwv_co(child->bs, offset, qiov, false, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -721,7 +721,7 @@ int bdrv_preadv(BlockDriverState *bs, int64_t offset, QEMUIOVector *qiov)
 | 
			
		|||
    return qiov->size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_pread(BlockDriverState *bs, int64_t offset, void *buf, int bytes)
 | 
			
		||||
int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int bytes)
 | 
			
		||||
{
 | 
			
		||||
    QEMUIOVector qiov;
 | 
			
		||||
    struct iovec iov = {
 | 
			
		||||
| 
						 | 
				
			
			@ -734,7 +734,7 @@ int bdrv_pread(BlockDriverState *bs, int64_t offset, void *buf, int bytes)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    qemu_iovec_init_external(&qiov, &iov, 1);
 | 
			
		||||
    return bdrv_preadv(bs, offset, &qiov);
 | 
			
		||||
    return bdrv_preadv(child, offset, &qiov);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_pwritev(BlockDriverState *bs, int64_t offset, QEMUIOVector *qiov)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -576,7 +576,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    Error *local_err = NULL;
 | 
			
		||||
    char *buf;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, &ph, sizeof(ph));
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, &ph, sizeof(ph));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        s->header_size = size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, s->header, s->header_size);
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, s->header, s->header_size);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								block/qcow.c
								
								
								
								
							
							
						
						
									
										10
									
								
								block/qcow.c
								
								
								
								
							| 
						 | 
				
			
			@ -105,7 +105,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    int ret;
 | 
			
		||||
    QCowHeader header;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, &header, sizeof(header));
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +208,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, s->l1_table_offset, s->l1_table,
 | 
			
		||||
    ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_table,
 | 
			
		||||
               s->l1_size * sizeof(uint64_t));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -239,7 +239,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
            ret = -EINVAL;
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, header.backing_file_offset,
 | 
			
		||||
        ret = bdrv_pread(bs->file, header.backing_file_offset,
 | 
			
		||||
                   bs->backing_file, len);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -424,7 +424,7 @@ static uint64_t get_cluster_offset(BlockDriverState *bs,
 | 
			
		|||
                s->l2_size * sizeof(uint64_t)) < 0)
 | 
			
		||||
            return 0;
 | 
			
		||||
    } else {
 | 
			
		||||
        if (bdrv_pread(bs->file->bs, l2_offset, l2_table,
 | 
			
		||||
        if (bdrv_pread(bs->file, l2_offset, l2_table,
 | 
			
		||||
                       s->l2_size * sizeof(uint64_t)) !=
 | 
			
		||||
            s->l2_size * sizeof(uint64_t))
 | 
			
		||||
            return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -565,7 +565,7 @@ static int decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset)
 | 
			
		|||
    if (s->cluster_cache_offset != coffset) {
 | 
			
		||||
        csize = cluster_offset >> (63 - s->cluster_bits);
 | 
			
		||||
        csize &= (s->cluster_size - 1);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, coffset, s->cluster_data, csize);
 | 
			
		||||
        ret = bdrv_pread(bs->file, coffset, s->cluster_data, csize);
 | 
			
		||||
        if (ret != csize)
 | 
			
		||||
            return -1;
 | 
			
		||||
        if (decompress_buffer(s->cluster_cache, s->cluster_size,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -357,7 +357,7 @@ static int qcow2_cache_do_get(BlockDriverState *bs, Qcow2Cache *c,
 | 
			
		|||
            BLKDBG_EVENT(bs->file, BLKDBG_L2_LOAD);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset,
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset,
 | 
			
		||||
                         qcow2_cache_get_table_addr(bs, c, i),
 | 
			
		||||
                         s->cluster_size);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ int qcow2_refcount_init(BlockDriverState *bs)
 | 
			
		|||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
        BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, s->refcount_table_offset,
 | 
			
		||||
        ret = bdrv_pread(bs->file, s->refcount_table_offset,
 | 
			
		||||
                         s->refcount_table, refcount_table_size2);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -1070,7 +1070,7 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
 | 
			
		|||
        }
 | 
			
		||||
        l1_allocated = true;
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, l1_table_offset, l1_table, l1_size2);
 | 
			
		||||
        ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size2);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1382,7 +1382,7 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
 | 
			
		|||
    l2_size = s->l2_size * sizeof(uint64_t);
 | 
			
		||||
    l2_table = g_malloc(l2_size);
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, l2_offset, l2_table, l2_size);
 | 
			
		||||
    ret = bdrv_pread(bs->file, l2_offset, l2_table, l2_size);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        fprintf(stderr, "ERROR: I/O error in check_refcounts_l2\n");
 | 
			
		||||
        res->check_errors++;
 | 
			
		||||
| 
						 | 
				
			
			@ -1514,7 +1514,7 @@ static int check_refcounts_l1(BlockDriverState *bs,
 | 
			
		|||
            res->check_errors++;
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, l1_table_offset, l1_table, l1_size2);
 | 
			
		||||
        ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size2);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "ERROR: I/O error in check_refcounts_l1\n");
 | 
			
		||||
            res->check_errors++;
 | 
			
		||||
| 
						 | 
				
			
			@ -1612,7 +1612,7 @@ static int check_oflag_copied(BlockDriverState *bs, BdrvCheckResult *res,
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, l2_offset, l2_table,
 | 
			
		||||
        ret = bdrv_pread(bs->file, l2_offset, l2_table,
 | 
			
		||||
                         s->l2_size * sizeof(uint64_t));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            fprintf(stderr, "ERROR: Could not read L2 table: %s\n",
 | 
			
		||||
| 
						 | 
				
			
			@ -2407,7 +2407,7 @@ int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
 | 
			
		|||
                return -ENOMEM;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs, l1_ofs, l1, l1_sz2);
 | 
			
		||||
            ret = bdrv_pread(bs->file, l1_ofs, l1, l1_sz2);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                g_free(l1);
 | 
			
		||||
                return ret;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ int qcow2_read_snapshots(BlockDriverState *bs)
 | 
			
		|||
    for(i = 0; i < s->nb_snapshots; i++) {
 | 
			
		||||
        /* Read statically sized part of the snapshot header */
 | 
			
		||||
        offset = align_offset(offset, 8);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, &h, sizeof(h));
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, &h, sizeof(h));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ int qcow2_read_snapshots(BlockDriverState *bs)
 | 
			
		|||
        name_size = be16_to_cpu(h.name_size);
 | 
			
		||||
 | 
			
		||||
        /* Read extra data */
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, &extra,
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, &extra,
 | 
			
		||||
                         MIN(sizeof(extra), extra_data_size));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ int qcow2_read_snapshots(BlockDriverState *bs)
 | 
			
		|||
 | 
			
		||||
        /* Read snapshot ID */
 | 
			
		||||
        sn->id_str = g_malloc(id_str_size + 1);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, sn->id_str, id_str_size);
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, sn->id_str, id_str_size);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ int qcow2_read_snapshots(BlockDriverState *bs)
 | 
			
		|||
 | 
			
		||||
        /* Read snapshot name */
 | 
			
		||||
        sn->name = g_malloc(name_size + 1);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, sn->name, name_size);
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, sn->name, name_size);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -512,7 +512,7 @@ int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
 | 
			
		|||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, sn->l1_table_offset,
 | 
			
		||||
    ret = bdrv_pread(bs->file, sn->l1_table_offset,
 | 
			
		||||
                     sn_l1_table, sn_l1_bytes);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -716,7 +716,7 @@ int qcow2_snapshot_load_tmp(BlockDriverState *bs,
 | 
			
		|||
        return -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, sn->l1_table_offset,
 | 
			
		||||
    ret = bdrv_pread(bs->file, sn->l1_table_offset,
 | 
			
		||||
                     new_l1_table, new_l1_bytes);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg(errp, "Failed to read l1 table for snapshot");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
 | 
			
		|||
        printf("attempting to read extended header in offset %lu\n", offset);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, &ext, sizeof(ext));
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, &ext, sizeof(ext));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_setg_errno(errp, -ret, "qcow2_read_extension: ERROR: "
 | 
			
		||||
                             "pread fail from offset %" PRIu64, offset);
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +135,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
 | 
			
		|||
                           sizeof(bs->backing_format));
 | 
			
		||||
                return 2;
 | 
			
		||||
            }
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs, offset, bs->backing_format, ext.len);
 | 
			
		||||
            ret = bdrv_pread(bs->file, offset, bs->backing_format, ext.len);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                error_setg_errno(errp, -ret, "ERROR: ext_backing_format: "
 | 
			
		||||
                                 "Could not read format name");
 | 
			
		||||
| 
						 | 
				
			
			@ -151,7 +151,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
 | 
			
		|||
        case QCOW2_EXT_MAGIC_FEATURE_TABLE:
 | 
			
		||||
            if (p_feature_table != NULL) {
 | 
			
		||||
                void* feature_table = g_malloc0(ext.len + 2 * sizeof(Qcow2Feature));
 | 
			
		||||
                ret = bdrv_pread(bs->file->bs, offset , feature_table, ext.len);
 | 
			
		||||
                ret = bdrv_pread(bs->file, offset , feature_table, ext.len);
 | 
			
		||||
                if (ret < 0) {
 | 
			
		||||
                    error_setg_errno(errp, -ret, "ERROR: ext_feature_table: "
 | 
			
		||||
                                     "Could not read table");
 | 
			
		||||
| 
						 | 
				
			
			@ -172,7 +172,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
 | 
			
		|||
                uext->len = ext.len;
 | 
			
		||||
                QLIST_INSERT_HEAD(&s->unknown_header_ext, uext, next);
 | 
			
		||||
 | 
			
		||||
                ret = bdrv_pread(bs->file->bs, offset , uext->data, uext->len);
 | 
			
		||||
                ret = bdrv_pread(bs->file, offset , uext->data, uext->len);
 | 
			
		||||
                if (ret < 0) {
 | 
			
		||||
                    error_setg_errno(errp, -ret, "ERROR: unknown extension: "
 | 
			
		||||
                                     "Could not read data");
 | 
			
		||||
| 
						 | 
				
			
			@ -817,7 +817,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    uint64_t ext_end;
 | 
			
		||||
    uint64_t l1_vm_state_index;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, &header, sizeof(header));
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg_errno(errp, -ret, "Could not read qcow2 header");
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -892,7 +892,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    if (header.header_length > sizeof(header)) {
 | 
			
		||||
        s->unknown_header_fields_size = header.header_length - sizeof(header);
 | 
			
		||||
        s->unknown_header_fields = g_malloc(s->unknown_header_fields_size);
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, sizeof(header), s->unknown_header_fields,
 | 
			
		||||
        ret = bdrv_pread(bs->file, sizeof(header), s->unknown_header_fields,
 | 
			
		||||
                         s->unknown_header_fields_size);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_setg_errno(errp, -ret, "Could not read unknown qcow2 header "
 | 
			
		||||
| 
						 | 
				
			
			@ -1066,7 +1066,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
            ret = -ENOMEM;
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, s->l1_table_offset, s->l1_table,
 | 
			
		||||
        ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_table,
 | 
			
		||||
                         s->l1_size * sizeof(uint64_t));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_setg_errno(errp, -ret, "Could not read L1 table");
 | 
			
		||||
| 
						 | 
				
			
			@ -1122,7 +1122,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
            ret = -EINVAL;
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, header.backing_file_offset,
 | 
			
		||||
        ret = bdrv_pread(bs->file, header.backing_file_offset,
 | 
			
		||||
                         bs->backing_file, len);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_setg_errno(errp, -ret, "Could not read backing file name");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -218,7 +218,7 @@ static bool qed_is_image_size_valid(uint64_t image_size, uint32_t cluster_size,
 | 
			
		|||
 *
 | 
			
		||||
 * The string is NUL-terminated.
 | 
			
		||||
 */
 | 
			
		||||
static int qed_read_string(BlockDriverState *file, uint64_t offset, size_t n,
 | 
			
		||||
static int qed_read_string(BdrvChild *file, uint64_t offset, size_t n,
 | 
			
		||||
                           char *buf, size_t buflen)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -389,7 +389,7 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    s->bs = bs;
 | 
			
		||||
    QSIMPLEQ_INIT(&s->allocating_write_reqs);
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, &le_header, sizeof(le_header));
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, &le_header, sizeof(le_header));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -446,7 +446,7 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
            return -EINVAL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = qed_read_string(bs->file->bs, s->header.backing_filename_offset,
 | 
			
		||||
        ret = qed_read_string(bs->file, s->header.backing_filename_offset,
 | 
			
		||||
                              s->header.backing_filename_size, bs->backing_file,
 | 
			
		||||
                              sizeof(bs->backing_file));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ static int vhdx_log_peek_hdr(BlockDriverState *bs, VHDXLogEntries *log,
 | 
			
		|||
 | 
			
		||||
    offset = log->offset + read;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, offset, hdr, sizeof(VHDXLogEntryHeader));
 | 
			
		||||
    ret = bdrv_pread(bs->file, offset, hdr, sizeof(VHDXLogEntryHeader));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -144,7 +144,7 @@ static int vhdx_log_read_sectors(BlockDriverState *bs, VHDXLogEntries *log,
 | 
			
		|||
        }
 | 
			
		||||
        offset = log->offset + read;
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset, buffer, VHDX_LOG_SECTOR_SIZE);
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset, buffer, VHDX_LOG_SECTOR_SIZE);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto exit;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -945,7 +945,7 @@ static int vhdx_log_write(BlockDriverState *bs, BDRVVHDXState *s,
 | 
			
		|||
 | 
			
		||||
        if (i == 0 && leading_length) {
 | 
			
		||||
            /* partial sector at the front of the buffer */
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs, file_offset, merged_sector,
 | 
			
		||||
            ret = bdrv_pread(bs->file, file_offset, merged_sector,
 | 
			
		||||
                             VHDX_LOG_SECTOR_SIZE);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                goto exit;
 | 
			
		||||
| 
						 | 
				
			
			@ -955,7 +955,7 @@ static int vhdx_log_write(BlockDriverState *bs, BDRVVHDXState *s,
 | 
			
		|||
            sector_write = merged_sector;
 | 
			
		||||
        } else if (i == sectors - 1 && trailing_length) {
 | 
			
		||||
            /* partial sector at the end of the buffer */
 | 
			
		||||
            ret = bdrv_pread(bs->file->bs,
 | 
			
		||||
            ret = bdrv_pread(bs->file,
 | 
			
		||||
                            file_offset,
 | 
			
		||||
                            merged_sector + trailing_length,
 | 
			
		||||
                            VHDX_LOG_SECTOR_SIZE - trailing_length);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								block/vhdx.c
								
								
								
								
							
							
						
						
									
										38
									
								
								block/vhdx.c
								
								
								
								
							| 
						 | 
				
			
			@ -298,9 +298,10 @@ static int vhdx_probe(const uint8_t *buf, int buf_size, const char *filename)
 | 
			
		|||
 * and then update the header checksum.  Header is converted to proper
 | 
			
		||||
 * endianness before being written to the specified file offset
 | 
			
		||||
 */
 | 
			
		||||
static int vhdx_write_header(BlockDriverState *bs_file, VHDXHeader *hdr,
 | 
			
		||||
static int vhdx_write_header(BdrvChild *file, VHDXHeader *hdr,
 | 
			
		||||
                             uint64_t offset, bool read)
 | 
			
		||||
{
 | 
			
		||||
    BlockDriverState *bs_file = file->bs;
 | 
			
		||||
    uint8_t *buffer = NULL;
 | 
			
		||||
    int ret;
 | 
			
		||||
    VHDXHeader *header_le;
 | 
			
		||||
| 
						 | 
				
			
			@ -315,7 +316,7 @@ static int vhdx_write_header(BlockDriverState *bs_file, VHDXHeader *hdr,
 | 
			
		|||
    buffer = qemu_blockalign(bs_file, VHDX_HEADER_SIZE);
 | 
			
		||||
    if (read) {
 | 
			
		||||
        /* if true, we can't assume the extra reserved bytes are 0 */
 | 
			
		||||
        ret = bdrv_pread(bs_file, offset, buffer, VHDX_HEADER_SIZE);
 | 
			
		||||
        ret = bdrv_pread(file, offset, buffer, VHDX_HEADER_SIZE);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto exit;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -378,7 +379,7 @@ static int vhdx_update_header(BlockDriverState *bs, BDRVVHDXState *s,
 | 
			
		|||
        inactive_header->log_guid = *log_guid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = vhdx_write_header(bs->file->bs, inactive_header, header_offset, true);
 | 
			
		||||
    ret = vhdx_write_header(bs->file, inactive_header, header_offset, true);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -430,7 +431,7 @@ static void vhdx_parse_header(BlockDriverState *bs, BDRVVHDXState *s,
 | 
			
		|||
    /* We have to read the whole VHDX_HEADER_SIZE instead of
 | 
			
		||||
     * sizeof(VHDXHeader), because the checksum is over the whole
 | 
			
		||||
     * region */
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, VHDX_HEADER1_OFFSET, buffer,
 | 
			
		||||
    ret = bdrv_pread(bs->file, VHDX_HEADER1_OFFSET, buffer,
 | 
			
		||||
                     VHDX_HEADER_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -447,7 +448,7 @@ static void vhdx_parse_header(BlockDriverState *bs, BDRVVHDXState *s,
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, VHDX_HEADER2_OFFSET, buffer,
 | 
			
		||||
    ret = bdrv_pread(bs->file, VHDX_HEADER2_OFFSET, buffer,
 | 
			
		||||
                     VHDX_HEADER_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -521,7 +522,7 @@ static int vhdx_open_region_tables(BlockDriverState *bs, BDRVVHDXState *s)
 | 
			
		|||
     * whole block */
 | 
			
		||||
    buffer = qemu_blockalign(bs, VHDX_HEADER_BLOCK_SIZE);
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, VHDX_REGION_TABLE_OFFSET, buffer,
 | 
			
		||||
    ret = bdrv_pread(bs->file, VHDX_REGION_TABLE_OFFSET, buffer,
 | 
			
		||||
                     VHDX_HEADER_BLOCK_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -634,7 +635,7 @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
 | 
			
		|||
 | 
			
		||||
    buffer = qemu_blockalign(bs, VHDX_METADATA_TABLE_MAX_SIZE);
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, s->metadata_rt.file_offset, buffer,
 | 
			
		||||
    ret = bdrv_pread(bs->file, s->metadata_rt.file_offset, buffer,
 | 
			
		||||
                     VHDX_METADATA_TABLE_MAX_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
| 
						 | 
				
			
			@ -737,7 +738,7 @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
 | 
			
		|||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs,
 | 
			
		||||
    ret = bdrv_pread(bs->file,
 | 
			
		||||
                     s->metadata_entries.file_parameters_entry.offset
 | 
			
		||||
                                         + s->metadata_rt.file_offset,
 | 
			
		||||
                     &s->params,
 | 
			
		||||
| 
						 | 
				
			
			@ -772,7 +773,7 @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
 | 
			
		|||
    /* determine virtual disk size, logical sector size,
 | 
			
		||||
     * and phys sector size */
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs,
 | 
			
		||||
    ret = bdrv_pread(bs->file,
 | 
			
		||||
                     s->metadata_entries.virtual_disk_size_entry.offset
 | 
			
		||||
                                           + s->metadata_rt.file_offset,
 | 
			
		||||
                     &s->virtual_disk_size,
 | 
			
		||||
| 
						 | 
				
			
			@ -780,7 +781,7 @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
 | 
			
		|||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs,
 | 
			
		||||
    ret = bdrv_pread(bs->file,
 | 
			
		||||
                     s->metadata_entries.logical_sector_size_entry.offset
 | 
			
		||||
                                             + s->metadata_rt.file_offset,
 | 
			
		||||
                     &s->logical_sector_size,
 | 
			
		||||
| 
						 | 
				
			
			@ -788,7 +789,7 @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
 | 
			
		|||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs,
 | 
			
		||||
    ret = bdrv_pread(bs->file,
 | 
			
		||||
                     s->metadata_entries.phys_sector_size_entry.offset
 | 
			
		||||
                                          + s->metadata_rt.file_offset,
 | 
			
		||||
                     &s->physical_sector_size,
 | 
			
		||||
| 
						 | 
				
			
			@ -905,7 +906,7 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    QLIST_INIT(&s->regions);
 | 
			
		||||
 | 
			
		||||
    /* validate the file signature */
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, &signature, sizeof(uint64_t));
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, &signature, sizeof(uint64_t));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -964,7 +965,7 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, s->bat_offset, s->bat, s->bat_rt.length);
 | 
			
		||||
    ret = bdrv_pread(bs->file, s->bat_offset, s->bat, s->bat_rt.length);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1391,6 +1392,7 @@ static int vhdx_create_new_headers(BlockBackend *blk, uint64_t image_size,
 | 
			
		|||
                                   uint32_t log_size)
 | 
			
		||||
{
 | 
			
		||||
    BlockDriverState *bs = blk_bs(blk);
 | 
			
		||||
    BdrvChild *child;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    VHDXHeader *hdr = NULL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1405,12 +1407,18 @@ static int vhdx_create_new_headers(BlockBackend *blk, uint64_t image_size,
 | 
			
		|||
    vhdx_guid_generate(&hdr->file_write_guid);
 | 
			
		||||
    vhdx_guid_generate(&hdr->data_write_guid);
 | 
			
		||||
 | 
			
		||||
    ret = vhdx_write_header(bs, hdr, VHDX_HEADER1_OFFSET, false);
 | 
			
		||||
    /* XXX Ugly way to get blk->root, but that's a feature, not a bug. This
 | 
			
		||||
     * hack makes it obvious that vhdx_write_header() bypasses the BlockBackend
 | 
			
		||||
     * here, which it really shouldn't be doing. */
 | 
			
		||||
    child = QLIST_FIRST(&bs->parents);
 | 
			
		||||
    assert(!QLIST_NEXT(child, next_parent));
 | 
			
		||||
 | 
			
		||||
    ret = vhdx_write_header(child, hdr, VHDX_HEADER1_OFFSET, false);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
    hdr->sequence_number++;
 | 
			
		||||
    ret = vhdx_write_header(bs, hdr, VHDX_HEADER2_OFFSET, false);
 | 
			
		||||
    ret = vhdx_write_header(child, hdr, VHDX_HEADER2_OFFSET, false);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										36
									
								
								block/vmdk.c
								
								
								
								
							
							
						
						
									
										36
									
								
								block/vmdk.c
								
								
								
								
							| 
						 | 
				
			
			@ -252,7 +252,7 @@ static uint32_t vmdk_read_cid(BlockDriverState *bs, int parent)
 | 
			
		|||
    int ret;
 | 
			
		||||
 | 
			
		||||
    desc = g_malloc0(DESC_SIZE);
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, s->desc_offset, desc, DESC_SIZE);
 | 
			
		||||
    ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        g_free(desc);
 | 
			
		||||
        return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -286,7 +286,7 @@ static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid)
 | 
			
		|||
 | 
			
		||||
    desc = g_malloc0(DESC_SIZE);
 | 
			
		||||
    tmp_desc = g_malloc0(DESC_SIZE);
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, s->desc_offset, desc, DESC_SIZE);
 | 
			
		||||
    ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -350,7 +350,7 @@ static int vmdk_parent_open(BlockDriverState *bs)
 | 
			
		|||
    int ret;
 | 
			
		||||
 | 
			
		||||
    desc = g_malloc0(DESC_SIZE + 1);
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, s->desc_offset, desc, DESC_SIZE);
 | 
			
		||||
    ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -454,7 +454,7 @@ static int vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent,
 | 
			
		|||
        return -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(extent->file->bs,
 | 
			
		||||
    ret = bdrv_pread(extent->file,
 | 
			
		||||
                     extent->l1_table_offset,
 | 
			
		||||
                     extent->l1_table,
 | 
			
		||||
                     l1_size);
 | 
			
		||||
| 
						 | 
				
			
			@ -474,7 +474,7 @@ static int vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent,
 | 
			
		|||
            ret = -ENOMEM;
 | 
			
		||||
            goto fail_l1;
 | 
			
		||||
        }
 | 
			
		||||
        ret = bdrv_pread(extent->file->bs,
 | 
			
		||||
        ret = bdrv_pread(extent->file,
 | 
			
		||||
                         extent->l1_backup_table_offset,
 | 
			
		||||
                         extent->l1_backup_table,
 | 
			
		||||
                         l1_size);
 | 
			
		||||
| 
						 | 
				
			
			@ -508,7 +508,7 @@ static int vmdk_open_vmfs_sparse(BlockDriverState *bs,
 | 
			
		|||
    VMDK3Header header;
 | 
			
		||||
    VmdkExtent *extent;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(file->bs, sizeof(magic), &header, sizeof(header));
 | 
			
		||||
    ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg_errno(errp, -ret,
 | 
			
		||||
                         "Could not read header from file '%s'",
 | 
			
		||||
| 
						 | 
				
			
			@ -538,14 +538,13 @@ static int vmdk_open_vmfs_sparse(BlockDriverState *bs,
 | 
			
		|||
static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
 | 
			
		||||
                               QDict *options, Error **errp);
 | 
			
		||||
 | 
			
		||||
static char *vmdk_read_desc(BlockDriverState *file, uint64_t desc_offset,
 | 
			
		||||
                            Error **errp)
 | 
			
		||||
static char *vmdk_read_desc(BdrvChild *file, uint64_t desc_offset, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    int64_t size;
 | 
			
		||||
    char *buf;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    size = bdrv_getlength(file);
 | 
			
		||||
    size = bdrv_getlength(file->bs);
 | 
			
		||||
    if (size < 0) {
 | 
			
		||||
        error_setg_errno(errp, -size, "Could not access file");
 | 
			
		||||
        return NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -586,7 +585,7 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
 | 
			
		|||
    int64_t l1_backup_offset = 0;
 | 
			
		||||
    bool compressed;
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(file->bs, sizeof(magic), &header, sizeof(header));
 | 
			
		||||
    ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header));
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg_errno(errp, -ret,
 | 
			
		||||
                         "Could not read header from file '%s'",
 | 
			
		||||
| 
						 | 
				
			
			@ -596,7 +595,7 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
 | 
			
		|||
    if (header.capacity == 0) {
 | 
			
		||||
        uint64_t desc_offset = le64_to_cpu(header.desc_offset);
 | 
			
		||||
        if (desc_offset) {
 | 
			
		||||
            char *buf = vmdk_read_desc(file->bs, desc_offset << 9, errp);
 | 
			
		||||
            char *buf = vmdk_read_desc(file, desc_offset << 9, errp);
 | 
			
		||||
            if (!buf) {
 | 
			
		||||
                return -EINVAL;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -636,7 +635,7 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
 | 
			
		|||
            } QEMU_PACKED eos_marker;
 | 
			
		||||
        } QEMU_PACKED footer;
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(file->bs,
 | 
			
		||||
        ret = bdrv_pread(file,
 | 
			
		||||
            bs->file->bs->total_sectors * 512 - 1536,
 | 
			
		||||
            &footer, sizeof(footer));
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -874,7 +873,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
 | 
			
		|||
            extent->flat_start_offset = flat_offset << 9;
 | 
			
		||||
        } else if (!strcmp(type, "SPARSE") || !strcmp(type, "VMFSSPARSE")) {
 | 
			
		||||
            /* SPARSE extent and VMFSSPARSE extent are both "COWD" sparse file*/
 | 
			
		||||
            char *buf = vmdk_read_desc(extent_file->bs, 0, errp);
 | 
			
		||||
            char *buf = vmdk_read_desc(extent_file, 0, errp);
 | 
			
		||||
            if (!buf) {
 | 
			
		||||
                ret = -EINVAL;
 | 
			
		||||
            } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -943,7 +942,7 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    BDRVVmdkState *s = bs->opaque;
 | 
			
		||||
    uint32_t magic;
 | 
			
		||||
 | 
			
		||||
    buf = vmdk_read_desc(bs->file->bs, 0, errp);
 | 
			
		||||
    buf = vmdk_read_desc(bs->file, 0, errp);
 | 
			
		||||
    if (!buf) {
 | 
			
		||||
        return -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1046,7 +1045,7 @@ static int get_whole_cluster(BlockDriverState *bs,
 | 
			
		|||
    /* Read backing data before skip range */
 | 
			
		||||
    if (skip_start_bytes > 0) {
 | 
			
		||||
        if (bs->backing) {
 | 
			
		||||
            ret = bdrv_pread(bs->backing->bs, offset, whole_grain,
 | 
			
		||||
            ret = bdrv_pread(bs->backing, offset, whole_grain,
 | 
			
		||||
                             skip_start_bytes);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
                ret = VMDK_ERROR;
 | 
			
		||||
| 
						 | 
				
			
			@ -1063,7 +1062,7 @@ static int get_whole_cluster(BlockDriverState *bs,
 | 
			
		|||
    /* Read backing data after skip range */
 | 
			
		||||
    if (skip_end_bytes < cluster_bytes) {
 | 
			
		||||
        if (bs->backing) {
 | 
			
		||||
            ret = bdrv_pread(bs->backing->bs, offset + skip_end_bytes,
 | 
			
		||||
            ret = bdrv_pread(bs->backing, offset + skip_end_bytes,
 | 
			
		||||
                             whole_grain + skip_end_bytes,
 | 
			
		||||
                             cluster_bytes - skip_end_bytes);
 | 
			
		||||
            if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1191,8 +1190,7 @@ static int get_cluster_offset(BlockDriverState *bs,
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    l2_table = extent->l2_cache + (min_index * extent->l2_size);
 | 
			
		||||
    if (bdrv_pread(
 | 
			
		||||
                extent->file->bs,
 | 
			
		||||
    if (bdrv_pread(extent->file,
 | 
			
		||||
                (int64_t)l2_offset * 512,
 | 
			
		||||
                l2_table,
 | 
			
		||||
                extent->l2_size * sizeof(uint32_t)
 | 
			
		||||
| 
						 | 
				
			
			@ -1424,7 +1422,7 @@ static int vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset,
 | 
			
		|||
    buf_bytes = cluster_bytes * 2;
 | 
			
		||||
    cluster_buf = g_malloc(buf_bytes);
 | 
			
		||||
    uncomp_buf = g_malloc(cluster_bytes);
 | 
			
		||||
    ret = bdrv_pread(extent->file->bs,
 | 
			
		||||
    ret = bdrv_pread(extent->file,
 | 
			
		||||
                cluster_offset,
 | 
			
		||||
                cluster_buf, buf_bytes);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -237,7 +237,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = bdrv_pread(bs->file->bs, 0, s->footer_buf, HEADER_SIZE);
 | 
			
		||||
    ret = bdrv_pread(bs->file, 0, s->footer_buf, HEADER_SIZE);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg(errp, "Unable to read VHD header");
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -257,7 +257,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        /* If a fixed disk, the footer is found only at the end of the file */
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, offset-HEADER_SIZE, s->footer_buf,
 | 
			
		||||
        ret = bdrv_pread(bs->file, offset-HEADER_SIZE, s->footer_buf,
 | 
			
		||||
                         HEADER_SIZE);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -328,7 +328,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if (disk_type == VHD_DYNAMIC) {
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, be64_to_cpu(footer->data_offset), buf,
 | 
			
		||||
        ret = bdrv_pread(bs->file, be64_to_cpu(footer->data_offset), buf,
 | 
			
		||||
                         HEADER_SIZE);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_setg(errp, "Error reading dynamic VHD header");
 | 
			
		||||
| 
						 | 
				
			
			@ -385,7 +385,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		|||
 | 
			
		||||
        s->bat_offset = be64_to_cpu(dyndisk_header->table_offset);
 | 
			
		||||
 | 
			
		||||
        ret = bdrv_pread(bs->file->bs, s->bat_offset, s->pagetable,
 | 
			
		||||
        ret = bdrv_pread(bs->file, s->bat_offset, s->pagetable,
 | 
			
		||||
                         pagetable_size);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_setg(errp, "Error reading pagetable");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -233,9 +233,8 @@ int bdrv_write(BdrvChild *child, int64_t sector_num,
 | 
			
		|||
int bdrv_pwrite_zeroes(BlockDriverState *bs, int64_t offset,
 | 
			
		||||
                       int count, BdrvRequestFlags flags);
 | 
			
		||||
int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags);
 | 
			
		||||
int bdrv_pread(BlockDriverState *bs, int64_t offset,
 | 
			
		||||
               void *buf, int count);
 | 
			
		||||
int bdrv_preadv(BlockDriverState *bs, int64_t offset, QEMUIOVector *qiov);
 | 
			
		||||
int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int bytes);
 | 
			
		||||
int bdrv_preadv(BdrvChild *child, int64_t offset, QEMUIOVector *qiov);
 | 
			
		||||
int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
 | 
			
		||||
                const void *buf, int count);
 | 
			
		||||
int bdrv_pwritev(BlockDriverState *bs, int64_t offset, QEMUIOVector *qiov);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue