while (cur_idx < nr_entries) {
int read_ret = bdrv_pread(log, cur_sector << sector_bits, &cur_entry,
- sizeof(cur_entry));
+ sizeof(cur_entry), 0);
if (read_ret < 0) {
error_setg_errno(errp, -read_ret,
"Failed to read log entry %"PRIu64, cur_idx);
log_sb.nr_entries = cpu_to_le64(0);
log_sb.sectorsize = cpu_to_le32(BDRV_SECTOR_SIZE);
} else {
- ret = bdrv_pread(s->log_file, 0, &log_sb, sizeof(log_sb));
+ ret = bdrv_pread(s->log_file, 0, &log_sb, sizeof(log_sb), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read log superblock");
goto fail_log;
return -EINVAL;
}
- ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
+ ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs), 0);
if (ret < 0) {
return ret;
}
}
ret = bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,
- s->catalog_size * 4);
+ s->catalog_size * 4, 0);
if (ret < 0) {
goto fail;
}
/* read in bitmap for current extent */
ret = bdrv_pread(bs->file, bitmap_offset + (extent_offset / 8),
- &bitmap_entry, 1);
+ &bitmap_entry, 1, 0);
if (ret < 0) {
return ret;
}
}
/* read header */
- ret = bdrv_pread(bs->file, 128, &s->block_size, 4);
+ ret = bdrv_pread(bs->file, 128, &s->block_size, 4, 0);
if (ret < 0) {
return ret;
}
return -EINVAL;
}
- ret = bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4);
+ ret = bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4, 0);
if (ret < 0) {
return ret;
}
return -ENOMEM;
}
- ret = bdrv_pread(bs->file, 128 + 4 + 4, s->offsets, offsets_size);
+ ret = bdrv_pread(bs->file, 128 + 4 + 4, s->offsets, offsets_size, 0);
if (ret < 0) {
goto fail;
}
int ret;
uint32_t bytes = s->offsets[block_num + 1] - s->offsets[block_num];
- ret = bdrv_pread(bs->file, s->offsets[block_num],
- s->compressed_block, bytes);
+ ret = bdrv_pread(bs->file, s->offsets[block_num], s->compressed_block,
+ bytes, 0);
if (ret != bytes) {
return -1;
}
BlockDriverState *bs = opaque;
ssize_t ret;
- ret = bdrv_pread(bs->file, offset, buf, buflen);
+ ret = bdrv_pread(bs->file, offset, buf, buflen, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read encryption header");
return ret;
BlockDriverState *bs = opaque;
ssize_t ret;
- ret = bdrv_pwrite(bs->file, offset, buf, buflen);
+ ret = bdrv_pwrite(bs->file, offset, buf, buflen, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not write encryption header");
return ret;
uint64_t buffer;
int ret;
- ret = bdrv_pread(bs->file, offset, &buffer, 8);
+ ret = bdrv_pread(bs->file, offset, &buffer, 8, 0);
if (ret < 0) {
return ret;
}
uint32_t buffer;
int ret;
- ret = bdrv_pread(bs->file, offset, &buffer, 4);
+ ret = bdrv_pread(bs->file, offset, &buffer, 4, 0);
if (ret < 0) {
return ret;
}
offset = length - 511 - 512;
}
length = length < 515 ? length : 515;
- ret = bdrv_pread(file, offset, buffer, length);
+ ret = bdrv_pread(file, offset, buffer, length, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed while reading UDIF trailer");
return ret;
offset += 4;
buffer = g_realloc(buffer, count);
- ret = bdrv_pread(bs->file, offset, buffer, count);
+ ret = bdrv_pread(bs->file, offset, buffer, count, 0);
if (ret < 0) {
goto fail;
}
buffer = g_malloc(info_length + 1);
buffer[info_length] = '\0';
- ret = bdrv_pread(bs->file, info_begin, buffer, info_length);
+ ret = bdrv_pread(bs->file, info_begin, buffer, info_length, 0);
if (ret != info_length) {
ret = -EINVAL;
goto fail;
case UDZO: { /* zlib compressed */
/* we need to buffer, because only the chunk as whole can be
* inflated. */
- ret = bdrv_pread(bs->file, s->offsets[chunk],
- s->compressed_chunk, s->lengths[chunk]);
+ ret = bdrv_pread(bs->file, s->offsets[chunk], s->compressed_chunk,
+ s->lengths[chunk], 0);
if (ret != s->lengths[chunk]) {
return -1;
}
}
/* we need to buffer, because only the chunk as whole can be
* inflated. */
- ret = bdrv_pread(bs->file, s->offsets[chunk],
- s->compressed_chunk, s->lengths[chunk]);
+ ret = bdrv_pread(bs->file, s->offsets[chunk], s->compressed_chunk,
+ s->lengths[chunk], 0);
if (ret != s->lengths[chunk]) {
return -1;
}
}
/* we need to buffer, because only the chunk as whole can be
* inflated. */
- ret = bdrv_pread(bs->file, s->offsets[chunk],
- s->compressed_chunk, s->lengths[chunk]);
+ ret = bdrv_pread(bs->file, s->offsets[chunk], s->compressed_chunk,
+ s->lengths[chunk], 0);
if (ret != s->lengths[chunk]) {
return -1;
}
break;
case UDRW: /* copy */
ret = bdrv_pread(bs->file, s->offsets[chunk],
- s->uncompressed_chunk, s->lengths[chunk]);
+ s->uncompressed_chunk, s->lengths[chunk], 0);
if (ret != s->lengths[chunk]) {
return -1;
}
}
/* See bdrv_pwrite() for the return codes */
-int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int64_t bytes)
+int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int64_t bytes,
+ BdrvRequestFlags flags)
{
int ret;
QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes);
return -EINVAL;
}
- ret = bdrv_preadv(child, offset, bytes, &qiov, 0);
+ ret = bdrv_preadv(child, offset, bytes, &qiov, flags);
return ret < 0 ? ret : bytes;
}
-EACCES Trying to write a read-only device
*/
int bdrv_pwrite(BdrvChild *child, int64_t offset, const void *buf,
- int64_t bytes)
+ int64_t bytes, BdrvRequestFlags flags)
{
int ret;
QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes);
return -EINVAL;
}
- ret = bdrv_pwritev(child, offset, bytes, &qiov, 0);
+ ret = bdrv_pwritev(child, offset, bytes, &qiov, flags);
return ret < 0 ? ret : bytes;
}
* Returns 0 on success, -errno in error cases.
*/
int bdrv_pwrite_sync(BdrvChild *child, int64_t offset,
- const void *buf, int64_t count)
+ const void *buf, int64_t count, BdrvRequestFlags flags)
{
int ret;
IO_CODE();
- ret = bdrv_pwrite(child, offset, buf, count);
+ ret = bdrv_pwrite(child, offset, buf, count, flags);
if (ret < 0) {
return ret;
}
bdrv_dirty_bitmap_deserialize_ones(bitmap, offset, count, false);
} else {
ret = bdrv_pread(bs->file, entry << BDRV_SECTOR_BITS, buf,
- s->cluster_size);
+ s->cluster_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret,
"Failed to read bitmap data cluster");
assert(ext_off > 0);
- ret = bdrv_pread(bs->file, ext_off, ext_cluster, s->cluster_size);
+ ret = bdrv_pread(bs->file, ext_off, ext_cluster, s->cluster_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read Format Extension cluster");
goto out;
if (off + to_write > s->header_size) {
to_write = s->header_size - off;
}
- ret = bdrv_pwrite(bs->file, off, (uint8_t *)s->header + off,
- to_write);
+ ret = bdrv_pwrite(bs->file, off, (uint8_t *)s->header + off, to_write,
+ 0);
if (ret < 0) {
qemu_co_mutex_unlock(&s->lock);
return ret;
ret = 0;
if (flush_bat) {
- ret = bdrv_pwrite_sync(bs->file, 0, s->header, s->header_size);
+ ret = bdrv_pwrite_sync(bs->file, 0, s->header, s->header_size, 0);
if (ret < 0) {
res->check_errors++;
goto out;
if (size > s->header_size) {
size = s->header_size;
}
- return bdrv_pwrite_sync(bs->file, 0, s->header, size);
+ return bdrv_pwrite_sync(bs->file, 0, s->header, size, 0);
}
static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
return -EINVAL;
}
- ret = bdrv_pread(bs->file, 0, &ph, sizeof(ph));
+ ret = bdrv_pread(bs->file, 0, &ph, sizeof(ph), 0);
if (ret < 0) {
goto fail;
}
s->header_size = size;
}
- ret = bdrv_pread(bs->file, 0, s->header, s->header_size);
+ ret = bdrv_pread(bs->file, 0, s->header, s->header_size, 0);
if (ret < 0) {
goto fail;
}
goto fail;
}
- ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
+ ret = bdrv_pread(bs->file, 0, &header, sizeof(header), 0);
if (ret < 0) {
goto fail;
}
}
ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_table,
- s->l1_size * sizeof(uint64_t));
+ s->l1_size * sizeof(uint64_t), 0);
if (ret < 0) {
goto fail;
}
goto fail;
}
ret = bdrv_pread(bs->file, header.backing_file_offset,
- bs->auto_backing_file, len);
+ bs->auto_backing_file, len, 0);
if (ret < 0) {
goto fail;
}
BLKDBG_EVENT(bs->file, BLKDBG_L1_UPDATE);
ret = bdrv_pwrite_sync(bs->file,
s->l1_table_offset + l1_index * sizeof(tmp),
- &tmp, sizeof(tmp));
+ &tmp, sizeof(tmp), 0);
if (ret < 0) {
return ret;
}
if (new_l2_table) {
memset(l2_table, 0, s->l2_size * sizeof(uint64_t));
ret = bdrv_pwrite_sync(bs->file, l2_offset, l2_table,
- s->l2_size * sizeof(uint64_t));
+ s->l2_size * sizeof(uint64_t), 0);
if (ret < 0) {
return ret;
}
} else {
ret = bdrv_pread(bs->file, l2_offset, l2_table,
- s->l2_size * sizeof(uint64_t));
+ s->l2_size * sizeof(uint64_t), 0);
if (ret < 0) {
return ret;
}
/* write the cluster content */
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);
ret = bdrv_pwrite(bs->file, cluster_offset, s->cluster_cache,
- s->cluster_size);
+ s->cluster_size, 0);
if (ret < 0) {
return ret;
}
return -EIO;
}
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);
- ret = bdrv_pwrite(bs->file,
- cluster_offset + i,
+ ret = bdrv_pwrite(bs->file, cluster_offset + i,
s->cluster_data,
- BDRV_SECTOR_SIZE);
+ BDRV_SECTOR_SIZE, 0);
if (ret < 0) {
return ret;
}
BLKDBG_EVENT(bs->file, BLKDBG_L2_UPDATE);
}
ret = bdrv_pwrite_sync(bs->file, l2_offset + l2_index * sizeof(tmp),
- &tmp, sizeof(tmp));
+ &tmp, sizeof(tmp), 0);
if (ret < 0) {
return ret;
}
csize = cluster_offset >> (63 - s->cluster_bits);
csize &= (s->cluster_size - 1);
BLKDBG_EVENT(bs->file, BLKDBG_READ_COMPRESSED);
- ret = bdrv_pread(bs->file, coffset, s->cluster_data, csize);
+ ret = bdrv_pread(bs->file, coffset, s->cluster_data, csize, 0);
if (ret != csize)
return -1;
if (decompress_buffer(s->cluster_cache, s->cluster_size,
int ret;
memset(s->l1_table, 0, l1_length);
- if (bdrv_pwrite_sync(bs->file, s->l1_table_offset, s->l1_table,
- l1_length) < 0)
+ if (bdrv_pwrite_sync(bs->file, s->l1_table_offset, s->l1_table, l1_length,
+ 0) < 0)
return -1;
ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length, false,
PREALLOC_MODE_OFF, 0, NULL);
}
assert(tb->size <= BME_MAX_TABLE_SIZE);
- ret = bdrv_pread(bs->file, tb->offset,
- table, tb->size * BME_TABLE_ENTRY_SIZE);
+ ret = bdrv_pread(bs->file, tb->offset, table,
+ tb->size * BME_TABLE_ENTRY_SIZE, 0);
if (ret < 0) {
goto fail;
}
* already cleared */
}
} else {
- ret = bdrv_pread(bs->file, data_offset, buf, s->cluster_size);
+ ret = bdrv_pread(bs->file, data_offset, buf, s->cluster_size, 0);
if (ret < 0) {
goto finish;
}
}
dir_end = dir + size;
- ret = bdrv_pread(bs->file, offset, dir, size);
+ ret = bdrv_pread(bs->file, offset, dir, size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read bitmap directory");
goto fail;
goto fail;
}
- ret = bdrv_pwrite(bs->file, dir_offset, dir, dir_size);
+ ret = bdrv_pwrite(bs->file, dir_offset, dir, dir_size, 0);
if (ret < 0) {
goto fail;
}
goto fail;
}
- ret = bdrv_pwrite(bs->file, off, buf, s->cluster_size);
+ ret = bdrv_pwrite(bs->file, off, buf, s->cluster_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file",
bm_name);
}
bitmap_table_to_be(tb, tb_size);
- ret = bdrv_pwrite(bs->file, tb_offset, tb, tb_size * sizeof(tb[0]));
+ ret = bdrv_pwrite(bs->file, tb_offset, tb, tb_size * sizeof(tb[0]), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file",
bm_name);
}
ret = bdrv_pwrite(bs->file, c->entries[i].offset,
- qcow2_cache_get_table_addr(c, i), c->table_size);
+ qcow2_cache_get_table_addr(c, i), c->table_size, 0);
if (ret < 0) {
return ret;
}
BLKDBG_EVENT(bs->file, BLKDBG_L2_LOAD);
}
- ret = bdrv_pread(bs->file, offset,
- qcow2_cache_get_table_addr(c, i),
- c->table_size);
+ ret = bdrv_pread(bs->file, offset, qcow2_cache_get_table_addr(c, i),
+ c->table_size, 0);
if (ret < 0) {
return ret;
}
BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_WRITE_TABLE);
for(i = 0; i < s->l1_size; i++)
new_l1_table[i] = cpu_to_be64(new_l1_table[i]);
- ret = bdrv_pwrite_sync(bs->file, new_l1_table_offset,
- new_l1_table, new_l1_size2);
+ ret = bdrv_pwrite_sync(bs->file, new_l1_table_offset, new_l1_table,
+ new_l1_size2, 0);
if (ret < 0)
goto fail;
for(i = 0; i < s->l1_size; i++)
BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_ACTIVATE_TABLE);
stl_be_p(data, new_l1_size);
stq_be_p(data + 4, new_l1_table_offset);
- ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_size),
- data, sizeof(data));
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_size), data,
+ sizeof(data), 0);
if (ret < 0) {
goto fail;
}
BLKDBG_EVENT(bs->file, BLKDBG_L1_UPDATE);
ret = bdrv_pwrite_sync(bs->file,
s->l1_table_offset + L1E_SIZE * l1_start_index,
- buf, bufsize);
+ buf, bufsize, 0);
if (ret < 0) {
return ret;
}
(void **)&l2_slice);
} else {
/* load inactive L2 tables from disk */
- ret = bdrv_pread(bs->file, slice_offset, l2_slice, slice_size2);
+ ret = bdrv_pread(bs->file, slice_offset, l2_slice,
+ slice_size2, 0);
}
if (ret < 0) {
goto fail;
goto fail;
}
- ret = bdrv_pwrite(bs->file, slice_offset,
- l2_slice, slice_size2);
+ ret = bdrv_pwrite(bs->file, slice_offset, l2_slice,
+ slice_size2, 0);
if (ret < 0) {
goto fail;
}
l1_table = new_l1_table;
- ret = bdrv_pread(bs->file, s->snapshots[i].l1_table_offset,
- l1_table, l1_size2);
+ ret = bdrv_pread(bs->file, s->snapshots[i].l1_table_offset, l1_table,
+ l1_size2, 0);
if (ret < 0) {
goto fail;
}
}
BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
ret = bdrv_pread(bs->file, s->refcount_table_offset,
- s->refcount_table, refcount_table_size2);
+ s->refcount_table, refcount_table_size2, 0);
if (ret < 0) {
goto fail;
}
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_HOOKUP);
ret = bdrv_pwrite_sync(bs->file, s->refcount_table_offset +
refcount_table_index * REFTABLE_ENTRY_SIZE,
- &data64, sizeof(data64));
+ &data64, sizeof(data64), 0);
if (ret < 0) {
goto fail;
}
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_TABLE);
ret = bdrv_pwrite_sync(bs->file, table_offset, new_table,
- table_size * REFTABLE_ENTRY_SIZE);
+ table_size * REFTABLE_ENTRY_SIZE, 0);
if (ret < 0) {
goto fail;
}
data.d32 = cpu_to_be32(table_clusters);
BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_SWITCH_TABLE);
ret = bdrv_pwrite_sync(bs->file,
- offsetof(QCowHeader, refcount_table_offset),
- &data, sizeof(data));
+ offsetof(QCowHeader, refcount_table_offset), &data,
+ sizeof(data), 0);
if (ret < 0) {
goto fail;
}
}
l1_allocated = true;
- ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size2);
+ ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size2, 0);
if (ret < 0) {
goto fail;
}
cpu_to_be64s(&l1_table[i]);
}
- ret = bdrv_pwrite_sync(bs->file, l1_table_offset,
- l1_table, l1_size2);
+ ret = bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table, l1_size2,
+ 0);
for (i = 0; i < l1_size; i++) {
be64_to_cpus(&l1_table[i]);
}
ret = bdrv_pwrite_sync(bs->file, l2e_offset, &l2_table[idx],
- l2_entry_size(s));
+ l2_entry_size(s), 0);
if (ret < 0) {
fprintf(stderr, "ERROR: Failed to overwrite L2 "
"table entry: %s\n", strerror(-ret));
bool metadata_overlap;
/* Read L2 table from disk */
- ret = bdrv_pread(bs->file, l2_offset, l2_table, l2_size_bytes);
+ ret = bdrv_pread(bs->file, l2_offset, l2_table, l2_size_bytes, 0);
if (ret < 0) {
fprintf(stderr, "ERROR: I/O error in check_refcounts_l2\n");
res->check_errors++;
}
/* Read L1 table entries from disk */
- ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size_bytes);
+ ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size_bytes, 0);
if (ret < 0) {
fprintf(stderr, "ERROR: I/O error in check_refcounts_l1\n");
res->check_errors++;
}
ret = bdrv_pread(bs->file, l2_offset, l2_table,
- s->l2_size * l2_entry_size(s));
+ s->l2_size * l2_entry_size(s), 0);
if (ret < 0) {
fprintf(stderr, "ERROR: Could not read L2 table: %s\n",
strerror(-ret));
goto fail;
}
- ret = bdrv_pwrite(bs->file, l2_offset, l2_table,
- s->cluster_size);
+ ret = bdrv_pwrite(bs->file, l2_offset, l2_table, s->cluster_size,
+ 0);
if (ret < 0) {
fprintf(stderr, "ERROR: Could not write L2 table: %s\n",
strerror(-ret));
refblock_index * s->cluster_size);
ret = bdrv_pwrite(bs->file, refblock_offset, on_disk_refblock,
- s->cluster_size);
+ s->cluster_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR writing refblock");
return ret;
assert(reftable_length < INT_MAX);
ret = bdrv_pwrite(bs->file, reftable_offset, on_disk_reftable,
- reftable_length);
+ reftable_length, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR writing reftable");
goto fail;
ret = bdrv_pwrite_sync(bs->file,
offsetof(QCowHeader, refcount_table_offset),
&reftable_offset_and_clusters,
- sizeof(reftable_offset_and_clusters));
+ sizeof(reftable_offset_and_clusters), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR setting reftable");
goto fail;
return -ENOMEM;
}
- ret = bdrv_pread(bs->file, l1_ofs, l1, l1_sz2);
+ ret = bdrv_pread(bs->file, l1_ofs, l1, l1_sz2, 0);
if (ret < 0) {
g_free(l1);
return ret;
return ret;
}
- ret = bdrv_pwrite(bs->file, offset, refblock, s->cluster_size);
+ ret = bdrv_pwrite(bs->file, offset, refblock, s->cluster_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to write refblock");
return ret;
}
ret = bdrv_pwrite(bs->file, new_reftable_offset, new_reftable,
- new_reftable_size * REFTABLE_ENTRY_SIZE);
+ new_reftable_size * REFTABLE_ENTRY_SIZE, 0);
for (i = 0; i < new_reftable_size; i++) {
be64_to_cpus(&new_reftable[i]);
}
ret = bdrv_pwrite_sync(bs->file, s->refcount_table_offset, reftable_tmp,
- s->refcount_table_size * REFTABLE_ENTRY_SIZE);
+ s->refcount_table_size * REFTABLE_ENTRY_SIZE, 0);
/*
* If the write in the reftable failed the image may contain a partially
* overwritten reftable. In this case it would be better to clear the
/* Read statically sized part of the snapshot header */
offset = ROUND_UP(offset, 8);
- ret = bdrv_pread(bs->file, offset, &h, sizeof(h));
+ ret = bdrv_pread(bs->file, offset, &h, sizeof(h), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read snapshot table");
goto fail;
/* Read known extra data */
ret = bdrv_pread(bs->file, offset, &extra,
- MIN(sizeof(extra), sn->extra_data_size));
+ MIN(sizeof(extra), sn->extra_data_size), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read snapshot table");
goto fail;
unknown_extra_data_size = sn->extra_data_size - sizeof(extra);
sn->unknown_extra_data = g_malloc(unknown_extra_data_size);
ret = bdrv_pread(bs->file, offset, sn->unknown_extra_data,
- unknown_extra_data_size);
+ unknown_extra_data_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret,
"Failed to read snapshot table");
/* Read snapshot ID */
sn->id_str = g_malloc(id_str_size + 1);
- ret = bdrv_pread(bs->file, offset, sn->id_str, id_str_size);
+ ret = bdrv_pread(bs->file, offset, sn->id_str, id_str_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read snapshot table");
goto fail;
/* Read snapshot name */
sn->name = g_malloc(name_size + 1);
- ret = bdrv_pread(bs->file, offset, sn->name, name_size);
+ ret = bdrv_pread(bs->file, offset, sn->name, name_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read snapshot table");
goto fail;
h.name_size = cpu_to_be16(name_size);
offset = ROUND_UP(offset, 8);
- ret = bdrv_pwrite(bs->file, offset, &h, sizeof(h));
+ ret = bdrv_pwrite(bs->file, offset, &h, sizeof(h), 0);
if (ret < 0) {
goto fail;
}
offset += sizeof(h);
- ret = bdrv_pwrite(bs->file, offset, &extra, sizeof(extra));
+ ret = bdrv_pwrite(bs->file, offset, &extra, sizeof(extra), 0);
if (ret < 0) {
goto fail;
}
assert(sn->unknown_extra_data);
ret = bdrv_pwrite(bs->file, offset, sn->unknown_extra_data,
- unknown_extra_data_size);
+ unknown_extra_data_size, 0);
if (ret < 0) {
goto fail;
}
offset += unknown_extra_data_size;
}
- ret = bdrv_pwrite(bs->file, offset, sn->id_str, id_str_size);
+ ret = bdrv_pwrite(bs->file, offset, sn->id_str, id_str_size, 0);
if (ret < 0) {
goto fail;
}
offset += id_str_size;
- ret = bdrv_pwrite(bs->file, offset, sn->name, name_size);
+ ret = bdrv_pwrite(bs->file, offset, sn->name, name_size, 0);
if (ret < 0) {
goto fail;
}
header_data.snapshots_offset = cpu_to_be64(snapshots_offset);
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
- &header_data, sizeof(header_data));
+ &header_data, sizeof(header_data), 0);
if (ret < 0) {
goto fail;
}
/* qcow2_do_open() discards this information in check mode */
ret = bdrv_pread(bs->file, offsetof(QCowHeader, nb_snapshots),
- &snapshot_table_pointer, sizeof(snapshot_table_pointer));
+ &snapshot_table_pointer, sizeof(snapshot_table_pointer),
+ 0);
if (ret < 0) {
result->check_errors++;
fprintf(stderr, "ERROR failed to read the snapshot table pointer from "
snapshot_table_pointer.nb_snapshots = cpu_to_be32(s->nb_snapshots);
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
&snapshot_table_pointer.nb_snapshots,
- sizeof(snapshot_table_pointer.nb_snapshots));
+ sizeof(snapshot_table_pointer.nb_snapshots), 0);
if (ret < 0) {
result->check_errors++;
fprintf(stderr, "ERROR failed to update the snapshot count in the "
}
ret = bdrv_pwrite(bs->file, sn->l1_table_offset, l1_table,
- s->l1_size * L1E_SIZE);
+ s->l1_size * L1E_SIZE, 0);
if (ret < 0) {
goto fail;
}
goto fail;
}
- ret = bdrv_pread(bs->file, sn->l1_table_offset,
- sn_l1_table, sn_l1_bytes);
+ ret = bdrv_pread(bs->file, sn->l1_table_offset, sn_l1_table, sn_l1_bytes,
+ 0);
if (ret < 0) {
goto fail;
}
}
ret = bdrv_pwrite_sync(bs->file, s->l1_table_offset, sn_l1_table,
- cur_l1_bytes);
+ cur_l1_bytes, 0);
if (ret < 0) {
goto fail;
}
return -ENOMEM;
}
- ret = bdrv_pread(bs->file, sn->l1_table_offset,
- new_l1_table, new_l1_bytes);
+ ret = bdrv_pread(bs->file, sn->l1_table_offset, new_l1_table,
+ new_l1_bytes, 0);
if (ret < 0) {
error_setg(errp, "Failed to read l1 table for snapshot");
qemu_vfree(new_l1_table);
return -1;
}
- ret = bdrv_pread(bs->file,
- s->crypto_header.offset + offset, buf, buflen);
+ ret = bdrv_pread(bs->file, s->crypto_header.offset + offset, buf, buflen,
+ 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read encryption header");
return -1;
return -1;
}
- ret = bdrv_pwrite(bs->file,
- s->crypto_header.offset + offset, buf, buflen);
+ ret = bdrv_pwrite(bs->file, s->crypto_header.offset + offset, buf, buflen,
+ 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read encryption header");
return -1;
printf("attempting to read extended header in offset %lu\n", offset);
#endif
- ret = bdrv_pread(bs->file, offset, &ext, sizeof(ext));
+ ret = bdrv_pread(bs->file, offset, &ext, sizeof(ext), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "qcow2_read_extension: ERROR: "
"pread fail from offset %" PRIu64, offset);
sizeof(bs->backing_format));
return 2;
}
- ret = bdrv_pread(bs->file, offset, bs->backing_format, ext.len);
+ ret = bdrv_pread(bs->file, offset, bs->backing_format, ext.len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR: ext_backing_format: "
"Could not read format name");
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, offset , feature_table, ext.len);
+ ret = bdrv_pread(bs->file, offset, feature_table, ext.len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR: ext_feature_table: "
"Could not read table");
return -EINVAL;
}
- ret = bdrv_pread(bs->file, offset, &s->crypto_header, ext.len);
+ ret = bdrv_pread(bs->file, offset, &s->crypto_header, ext.len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret,
"Unable to read CRYPTO header extension");
break;
}
- ret = bdrv_pread(bs->file, offset, &bitmaps_ext, ext.len);
+ ret = bdrv_pread(bs->file, offset, &bitmaps_ext, ext.len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "bitmaps_ext: "
"Could not read ext header");
case QCOW2_EXT_MAGIC_DATA_FILE:
{
s->image_data_file = g_malloc0(ext.len + 1);
- ret = bdrv_pread(bs->file, offset, s->image_data_file, ext.len);
+ ret = bdrv_pread(bs->file, offset, s->image_data_file, ext.len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret,
"ERROR: Could not read data file name");
uext->len = ext.len;
QLIST_INSERT_HEAD(&s->unknown_header_ext, uext, next);
- ret = bdrv_pread(bs->file, offset , uext->data, uext->len);
+ ret = bdrv_pread(bs->file, offset, uext->data, uext->len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR: unknown extension: "
"Could not read data");
val = cpu_to_be64(s->incompatible_features | QCOW2_INCOMPAT_DIRTY);
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, incompatible_features),
- &val, sizeof(val));
+ &val, sizeof(val), 0);
if (ret < 0) {
return ret;
}
uint64_t l1_vm_state_index;
bool update_header = false;
- ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
+ ret = bdrv_pread(bs->file, 0, &header, sizeof(header), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read qcow2 header");
goto fail;
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, sizeof(header), s->unknown_header_fields,
- s->unknown_header_fields_size);
+ s->unknown_header_fields_size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read unknown qcow2 header "
"fields");
goto fail;
}
ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_table,
- s->l1_size * L1E_SIZE);
+ s->l1_size * L1E_SIZE, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read L1 table");
goto fail;
goto fail;
}
ret = bdrv_pread(bs->file, header.backing_file_offset,
- bs->auto_backing_file, len);
+ bs->auto_backing_file, len, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read backing file name");
goto fail;
}
/* Write the new header */
- ret = bdrv_pwrite(bs->file, 0, header, s->cluster_size);
+ ret = bdrv_pwrite(bs->file, 0, header, s->cluster_size, 0);
if (ret < 0) {
goto fail;
}
/* write updated header.size */
offset = cpu_to_be64(offset);
- ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size),
- &offset, sizeof(offset));
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size), &offset,
+ sizeof(offset), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to update the image size");
goto fail;
l1_ofs_rt_ofs_cls.reftable_offset = cpu_to_be64(s->cluster_size);
l1_ofs_rt_ofs_cls.reftable_clusters = cpu_to_be32(1);
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_table_offset),
- &l1_ofs_rt_ofs_cls, sizeof(l1_ofs_rt_ofs_cls));
+ &l1_ofs_rt_ofs_cls, sizeof(l1_ofs_rt_ofs_cls), 0);
if (ret < 0) {
goto fail_broken_refcounts;
}
/* Enter the first refblock into the reftable */
rt_entry = cpu_to_be64(2 * s->cluster_size);
- ret = bdrv_pwrite_sync(bs->file, s->cluster_size,
- &rt_entry, sizeof(rt_entry));
+ ret = bdrv_pwrite_sync(bs->file, s->cluster_size, &rt_entry,
+ sizeof(rt_entry), 0);
if (ret < 0) {
goto fail_broken_refcounts;
}
int ret;
qed_header_cpu_to_le(&s->header, &le);
- ret = bdrv_pwrite(s->bs->file, 0, &le, sizeof(le));
+ ret = bdrv_pwrite(s->bs->file, 0, &le, sizeof(le), 0);
if (ret != sizeof(le)) {
return ret;
}
if (n >= buflen) {
return -EINVAL;
}
- ret = bdrv_pread(file, offset, buf, n);
+ ret = bdrv_pread(file, offset, buf, n, 0);
if (ret < 0) {
return ret;
}
int64_t file_size;
int ret;
- ret = bdrv_pread(bs->file, 0, &le_header, sizeof(le_header));
+ ret = bdrv_pread(bs->file, 0, &le_header, sizeof(le_header), 0);
if (ret < 0) {
error_setg(errp, "Failed to read QED header");
return ret;
}
/* Write new header */
- ret = bdrv_pwrite_sync(bs->file, 0, buffer, buffer_len);
+ ret = bdrv_pwrite_sync(bs->file, 0, buffer, buffer_len, 0);
g_free(buffer);
if (ret == 0) {
memcpy(&s->header, &new_header, sizeof(new_header));
logout("\n");
- ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
+ ret = bdrv_pread(bs->file, 0, &header, sizeof(header), 0);
if (ret < 0) {
goto fail;
}
}
ret = bdrv_pread(bs->file, header.offset_bmap, s->bmap,
- bmap_size * SECTOR_SIZE);
+ bmap_size * SECTOR_SIZE, 0);
if (ret < 0) {
goto fail_free_bmap;
}
* so this full-cluster write does not overlap a partial write
* of the same cluster, issued from the "else" branch.
*/
- ret = bdrv_pwrite(bs->file, data_offset, block, s->block_size);
+ ret = bdrv_pwrite(bs->file, data_offset, block, s->block_size, 0);
qemu_co_rwlock_unlock(&s->bmap_lock);
} else {
nonallocating_write:
assert(VDI_IS_ALLOCATED(bmap_first));
*header = s->header;
vdi_header_to_le(header);
- ret = bdrv_pwrite(bs->file, 0, header, sizeof(*header));
+ ret = bdrv_pwrite(bs->file, 0, header, sizeof(*header), 0);
g_free(header);
if (ret < 0) {
logout("will write %u block map sectors starting from entry %u\n",
n_sectors, bmap_first);
ret = bdrv_pwrite(bs->file, offset * SECTOR_SIZE, base,
- n_sectors * SECTOR_SIZE);
+ n_sectors * SECTOR_SIZE, 0);
}
return ret < 0 ? ret : 0;
offset = log->offset + read;
- ret = bdrv_pread(bs->file, offset, hdr, sizeof(VHDXLogEntryHeader));
+ ret = bdrv_pread(bs->file, offset, hdr, sizeof(VHDXLogEntryHeader), 0);
if (ret < 0) {
goto exit;
}
}
offset = log->offset + read;
- ret = bdrv_pread(bs->file, offset, buffer, VHDX_LOG_SECTOR_SIZE);
+ ret = bdrv_pread(bs->file, offset, buffer, VHDX_LOG_SECTOR_SIZE, 0);
if (ret < 0) {
goto exit;
}
/* full */
break;
}
- ret = bdrv_pwrite(bs->file, offset, buffer_tmp,
- VHDX_LOG_SECTOR_SIZE);
+ ret = bdrv_pwrite(bs->file, offset, buffer_tmp, VHDX_LOG_SECTOR_SIZE,
+ 0);
if (ret < 0) {
goto exit;
}
/* count is only > 1 if we are writing zeroes */
for (i = 0; i < count; i++) {
ret = bdrv_pwrite_sync(bs->file, file_offset, buffer,
- VHDX_LOG_SECTOR_SIZE);
+ VHDX_LOG_SECTOR_SIZE, 0);
if (ret < 0) {
goto exit;
}
if (i == 0 && leading_length) {
/* partial sector at the front of the buffer */
ret = bdrv_pread(bs->file, file_offset, merged_sector,
- VHDX_LOG_SECTOR_SIZE);
+ VHDX_LOG_SECTOR_SIZE, 0);
if (ret < 0) {
goto exit;
}
sector_write = merged_sector;
} else if (i == sectors - 1 && trailing_length) {
/* partial sector at the end of the buffer */
- ret = bdrv_pread(bs->file,
- file_offset,
- merged_sector + trailing_length,
- VHDX_LOG_SECTOR_SIZE - trailing_length);
+ ret = bdrv_pread(bs->file, file_offset,
+ merged_sector + trailing_length,
+ VHDX_LOG_SECTOR_SIZE - trailing_length, 0);
if (ret < 0) {
goto exit;
}
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(file, offset, buffer, VHDX_HEADER_SIZE);
+ ret = bdrv_pread(file, offset, buffer, VHDX_HEADER_SIZE, 0);
if (ret < 0) {
goto exit;
}
vhdx_header_le_export(hdr, header_le);
vhdx_update_checksum(buffer, VHDX_HEADER_SIZE,
offsetof(VHDXHeader, checksum));
- ret = bdrv_pwrite_sync(file, offset, header_le, sizeof(VHDXHeader));
+ ret = bdrv_pwrite_sync(file, offset, header_le, sizeof(VHDXHeader), 0);
exit:
qemu_vfree(buffer);
/* 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, VHDX_HEADER1_OFFSET, buffer,
- VHDX_HEADER_SIZE);
+ ret = bdrv_pread(bs->file, VHDX_HEADER1_OFFSET, buffer, VHDX_HEADER_SIZE,
+ 0);
if (ret < 0) {
goto fail;
}
}
}
- ret = bdrv_pread(bs->file, VHDX_HEADER2_OFFSET, buffer,
- VHDX_HEADER_SIZE);
+ ret = bdrv_pread(bs->file, VHDX_HEADER2_OFFSET, buffer, VHDX_HEADER_SIZE,
+ 0);
if (ret < 0) {
goto fail;
}
buffer = qemu_blockalign(bs, VHDX_HEADER_BLOCK_SIZE);
ret = bdrv_pread(bs->file, VHDX_REGION_TABLE_OFFSET, buffer,
- VHDX_HEADER_BLOCK_SIZE);
+ VHDX_HEADER_BLOCK_SIZE, 0);
if (ret < 0) {
goto fail;
}
buffer = qemu_blockalign(bs, VHDX_METADATA_TABLE_MAX_SIZE);
ret = bdrv_pread(bs->file, s->metadata_rt.file_offset, buffer,
- VHDX_METADATA_TABLE_MAX_SIZE);
+ VHDX_METADATA_TABLE_MAX_SIZE, 0);
if (ret < 0) {
goto exit;
}
s->metadata_entries.file_parameters_entry.offset
+ s->metadata_rt.file_offset,
&s->params,
- sizeof(s->params));
+ sizeof(s->params),
+ 0);
if (ret < 0) {
goto exit;
s->metadata_entries.virtual_disk_size_entry.offset
+ s->metadata_rt.file_offset,
&s->virtual_disk_size,
- sizeof(uint64_t));
+ sizeof(uint64_t),
+ 0);
if (ret < 0) {
goto exit;
}
s->metadata_entries.logical_sector_size_entry.offset
+ s->metadata_rt.file_offset,
&s->logical_sector_size,
- sizeof(uint32_t));
+ sizeof(uint32_t),
+ 0);
if (ret < 0) {
goto exit;
}
s->metadata_entries.phys_sector_size_entry.offset
+ s->metadata_rt.file_offset,
&s->physical_sector_size,
- sizeof(uint32_t));
+ sizeof(uint32_t),
+ 0);
if (ret < 0) {
goto exit;
}
QLIST_INIT(&s->regions);
/* validate the file signature */
- ret = bdrv_pread(bs->file, 0, &signature, sizeof(uint64_t));
+ ret = bdrv_pread(bs->file, 0, &signature, sizeof(uint64_t), 0);
if (ret < 0) {
goto fail;
}
goto fail;
}
- ret = bdrv_pread(bs->file, s->bat_offset, s->bat, s->bat_rt.length);
+ ret = bdrv_pread(bs->file, s->bat_offset, s->bat, s->bat_rt.length, 0);
if (ret < 0) {
goto fail;
}
int ret;
desc = g_malloc0(DESC_SIZE);
- ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
+ ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE, 0);
if (ret < 0) {
goto out;
}
desc = g_malloc0(DESC_SIZE);
tmp_desc = g_malloc0(DESC_SIZE);
- ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
+ ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE, 0);
if (ret < 0) {
goto out;
}
pstrcat(desc, DESC_SIZE, tmp_desc);
}
- ret = bdrv_pwrite_sync(bs->file, s->desc_offset, desc, DESC_SIZE);
+ ret = bdrv_pwrite_sync(bs->file, s->desc_offset, desc, DESC_SIZE, 0);
out:
g_free(desc);
int ret;
desc = g_malloc0(DESC_SIZE + 1);
- ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE);
+ ret = bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE, 0);
if (ret < 0) {
goto out;
}
return -ENOMEM;
}
- ret = bdrv_pread(extent->file,
- extent->l1_table_offset,
- extent->l1_table,
- l1_size);
+ ret = bdrv_pread(extent->file, extent->l1_table_offset, extent->l1_table,
+ l1_size, 0);
if (ret < 0) {
bdrv_refresh_filename(extent->file->bs);
error_setg_errno(errp, -ret,
ret = -ENOMEM;
goto fail_l1;
}
- ret = bdrv_pread(extent->file,
- extent->l1_backup_table_offset,
- extent->l1_backup_table,
- l1_size);
+ ret = bdrv_pread(extent->file, extent->l1_backup_table_offset,
+ extent->l1_backup_table, l1_size, 0);
if (ret < 0) {
bdrv_refresh_filename(extent->file->bs);
error_setg_errno(errp, -ret,
VMDK3Header header;
VmdkExtent *extent = NULL;
- ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header));
+ ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header), 0);
if (ret < 0) {
bdrv_refresh_filename(file->bs);
error_setg_errno(errp, -ret,
assert(sizeof(const_header) == SECTOR_SIZE);
- ret = bdrv_pread(file, 0, &const_header, sizeof(const_header));
+ ret = bdrv_pread(file, 0, &const_header, sizeof(const_header), 0);
if (ret < 0) {
bdrv_refresh_filename(file->bs);
error_setg_errno(errp, -ret,
assert(sizeof(volatile_header) == SECTOR_SIZE);
- ret = bdrv_pread(file,
- const_header.volatile_header_offset * SECTOR_SIZE,
- &volatile_header, sizeof(volatile_header));
+ ret = bdrv_pread(file, const_header.volatile_header_offset * SECTOR_SIZE,
+ &volatile_header, sizeof(volatile_header), 0);
if (ret < 0) {
bdrv_refresh_filename(file->bs);
error_setg_errno(errp, -ret,
size = MIN(size, (1 << 20) - 1); /* avoid unbounded allocation */
buf = g_malloc(size + 1);
- ret = bdrv_pread(file, desc_offset, buf, size);
+ ret = bdrv_pread(file, desc_offset, buf, size, 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not read from file");
g_free(buf);
int64_t l1_backup_offset = 0;
bool compressed;
- ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header));
+ ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header), 0);
if (ret < 0) {
bdrv_refresh_filename(file->bs);
error_setg_errno(errp, -ret,
} QEMU_PACKED eos_marker;
} QEMU_PACKED footer;
- ret = bdrv_pread(file,
- bs->file->bs->total_sectors * 512 - 1536,
- &footer, sizeof(footer));
+ ret = bdrv_pread(file, bs->file->bs->total_sectors * 512 - 1536,
+ &footer, sizeof(footer), 0);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to read footer");
return ret;
/* qcow2 emits this on bs->file instead of bs->backing */
BLKDBG_EVENT(extent->file, BLKDBG_COW_READ);
ret = bdrv_pread(bs->backing, offset, whole_grain,
- skip_start_bytes);
+ skip_start_bytes, 0);
if (ret < 0) {
ret = VMDK_ERROR;
goto exit;
}
BLKDBG_EVENT(extent->file, BLKDBG_COW_WRITE);
ret = bdrv_pwrite(extent->file, cluster_offset, whole_grain,
- skip_start_bytes);
+ skip_start_bytes, 0);
if (ret < 0) {
ret = VMDK_ERROR;
goto exit;
BLKDBG_EVENT(extent->file, BLKDBG_COW_READ);
ret = bdrv_pread(bs->backing, offset + skip_end_bytes,
whole_grain + skip_end_bytes,
- cluster_bytes - skip_end_bytes);
+ cluster_bytes - skip_end_bytes, 0);
if (ret < 0) {
ret = VMDK_ERROR;
goto exit;
BLKDBG_EVENT(extent->file, BLKDBG_COW_WRITE);
ret = bdrv_pwrite(extent->file, cluster_offset + skip_end_bytes,
whole_grain + skip_end_bytes,
- cluster_bytes - skip_end_bytes);
+ cluster_bytes - skip_end_bytes, 0);
if (ret < 0) {
ret = VMDK_ERROR;
goto exit;
if (bdrv_pwrite(extent->file,
((int64_t)m_data->l2_offset * 512)
+ (m_data->l2_index * sizeof(offset)),
- &offset, sizeof(offset)) < 0) {
+ &offset, sizeof(offset), 0) < 0) {
return VMDK_ERROR;
}
/* update backup L2 table */
if (bdrv_pwrite(extent->file,
((int64_t)m_data->l2_offset * 512)
+ (m_data->l2_index * sizeof(offset)),
- &offset, sizeof(offset)) < 0) {
+ &offset, sizeof(offset), 0) < 0) {
return VMDK_ERROR;
}
}
if (bdrv_pread(extent->file,
(int64_t)l2_offset * 512,
l2_table,
- l2_size_bytes
+ l2_size_bytes,
+ 0
) != l2_size_bytes) {
return VMDK_ERROR;
}
cluster_buf = g_malloc(buf_bytes);
uncomp_buf = g_malloc(cluster_bytes);
BLKDBG_EVENT(extent->file, BLKDBG_READ_COMPRESSED);
- ret = bdrv_pread(extent->file,
- cluster_offset,
- cluster_buf, buf_bytes);
+ ret = bdrv_pread(extent->file, cluster_offset, cluster_buf, buf_bytes, 0);
if (ret < 0) {
goto out;
}
goto fail;
}
- ret = bdrv_pread(bs->file, 0, &s->footer, sizeof(s->footer));
+ ret = bdrv_pread(bs->file, 0, &s->footer, sizeof(s->footer), 0);
if (ret < 0) {
error_setg(errp, "Unable to read VHD header");
goto fail;
}
/* If a fixed disk, the footer is found only at the end of the file */
- ret = bdrv_pread(bs->file, offset - sizeof(*footer),
- footer, sizeof(*footer));
+ ret = bdrv_pread(bs->file, offset - sizeof(*footer), footer,
+ sizeof(*footer), 0);
if (ret < 0) {
goto fail;
}
if (disk_type == VHD_DYNAMIC) {
ret = bdrv_pread(bs->file, be64_to_cpu(footer->data_offset),
- &dyndisk_header, sizeof(dyndisk_header));
+ &dyndisk_header, sizeof(dyndisk_header), 0);
if (ret < 0) {
error_setg(errp, "Error reading dynamic VHD header");
goto fail;
s->bat_offset = be64_to_cpu(dyndisk_header.table_offset);
ret = bdrv_pread(bs->file, s->bat_offset, s->pagetable,
- pagetable_size);
+ pagetable_size, 0);
if (ret < 0) {
error_setg(errp, "Error reading pagetable");
goto fail;
s->last_bitmap_offset = bitmap_offset;
memset(bitmap, 0xff, s->bitmap_size);
- r = bdrv_pwrite_sync(bs->file, bitmap_offset, bitmap, s->bitmap_size);
+ r = bdrv_pwrite_sync(bs->file, bitmap_offset, bitmap, s->bitmap_size,
+ 0);
if (r < 0) {
*err = r;
return -2;
BDRVVPCState *s = bs->opaque;
int64_t offset = s->free_data_block_offset;
- ret = bdrv_pwrite_sync(bs->file, offset, &s->footer, sizeof(s->footer));
+ ret = bdrv_pwrite_sync(bs->file, offset, &s->footer, sizeof(s->footer), 0);
if (ret < 0)
return ret;
/* Initialize the block's bitmap */
memset(bitmap, 0xff, s->bitmap_size);
ret = bdrv_pwrite_sync(bs->file, s->free_data_block_offset, bitmap,
- s->bitmap_size);
+ s->bitmap_size, 0);
if (ret < 0) {
return ret;
}
/* Write BAT entry to disk */
bat_offset = s->bat_offset + (4 * index);
bat_value = cpu_to_be32(s->pagetable[index]);
- ret = bdrv_pwrite_sync(bs->file, bat_offset, &bat_value, 4);
+ ret = bdrv_pwrite_sync(bs->file, bat_offset, &bat_value, 4, 0);
if (ret < 0)
goto fail;
" allocated\n", sector_num,
n >> BDRV_SECTOR_BITS));
if (bdrv_pread(s->qcow, sector_num * BDRV_SECTOR_SIZE,
- buf + i * 0x200, n) < 0) {
+ buf + i * 0x200, n, 0) < 0) {
return -1;
}
i += (n >> BDRV_SECTOR_BITS) - 1;
return -1;
}
res = bdrv_pwrite(s->qcow, offset * BDRV_SECTOR_SIZE,
- s->cluster_buffer, BDRV_SECTOR_SIZE);
+ s->cluster_buffer, BDRV_SECTOR_SIZE,
+ 0);
if (res < 0) {
return -2;
}
*/
DLOG(fprintf(stderr, "Write to qcow backend: %d + %d\n", (int)sector_num, nb_sectors));
ret = bdrv_pwrite(s->qcow, sector_num * BDRV_SECTOR_SIZE, buf,
- nb_sectors * BDRV_SECTOR_SIZE);
+ nb_sectors * BDRV_SECTOR_SIZE, 0);
if (ret < 0) {
fprintf(stderr, "Error writing to qcow backend\n");
return ret;
int bdrv_pwrite_zeroes(BdrvChild *child, int64_t offset,
int64_t bytes, BdrvRequestFlags flags);
int bdrv_make_zero(BdrvChild *child, BdrvRequestFlags flags);
-int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int64_t bytes);
+int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int64_t bytes,
+ BdrvRequestFlags flags);
int bdrv_pwrite(BdrvChild *child, int64_t offset, const void *buf,
- int64_t bytes);
+ int64_t bytes, BdrvRequestFlags flags);
int bdrv_pwrite_sync(BdrvChild *child, int64_t offset,
- const void *buf, int64_t bytes);
+ const void *buf, int64_t bytes, BdrvRequestFlags flags);
/*
* Efficiently zero a region of the disk image. Note that this is a regular
* I/O request like read or write and should have a reasonable size. This
int ret;
/* Success */
- ret = bdrv_pread(c, 0, buf, sizeof(buf));
+ ret = bdrv_pread(c, 0, buf, sizeof(buf), 0);
g_assert_cmpint(ret, ==, 512);
/* Early error: Negative offset */
- ret = bdrv_pread(c, -2, buf, sizeof(buf));
+ ret = bdrv_pread(c, -2, buf, sizeof(buf), 0);
g_assert_cmpint(ret, ==, -EIO);
}
int ret;
/* Success */
- ret = bdrv_pwrite(c, 0, buf, sizeof(buf));
+ ret = bdrv_pwrite(c, 0, buf, sizeof(buf), 0);
g_assert_cmpint(ret, ==, 512);
/* Early error: Negative offset */
- ret = bdrv_pwrite(c, -2, buf, sizeof(buf));
+ ret = bdrv_pwrite(c, -2, buf, sizeof(buf), 0);
g_assert_cmpint(ret, ==, -EIO);
}