qcow2: Change l2_load to return 0/-errno

Provide the error code to the caller instead of just indicating success/error.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
master
Kevin Wolf 2010-05-21 18:25:20 +02:00
parent 1c46efaa0a
commit 55c17e9821
1 changed files with 22 additions and 16 deletions

View File

@ -157,31 +157,36 @@ static uint64_t *seek_l2_table(BDRVQcowState *s, uint64_t l2_offset)
* the image file failed. * the image file failed.
*/ */
static uint64_t *l2_load(BlockDriverState *bs, uint64_t l2_offset) static int l2_load(BlockDriverState *bs, uint64_t l2_offset,
uint64_t **l2_table)
{ {
BDRVQcowState *s = bs->opaque; BDRVQcowState *s = bs->opaque;
int min_index; int min_index;
uint64_t *l2_table; int ret;
/* seek if the table for the given offset is in the cache */ /* seek if the table for the given offset is in the cache */
l2_table = seek_l2_table(s, l2_offset); *l2_table = seek_l2_table(s, l2_offset);
if (l2_table != NULL) if (*l2_table != NULL) {
return l2_table; return 0;
}
/* not found: load a new entry in the least used one */ /* not found: load a new entry in the least used one */
min_index = l2_cache_new_entry(bs); min_index = l2_cache_new_entry(bs);
l2_table = s->l2_cache + (min_index << s->l2_bits); *l2_table = s->l2_cache + (min_index << s->l2_bits);
BLKDBG_EVENT(bs->file, BLKDBG_L2_LOAD); BLKDBG_EVENT(bs->file, BLKDBG_L2_LOAD);
if (bdrv_pread(bs->file, l2_offset, l2_table, s->l2_size * sizeof(uint64_t)) != ret = bdrv_pread(bs->file, l2_offset, *l2_table,
s->l2_size * sizeof(uint64_t)) s->l2_size * sizeof(uint64_t));
return NULL; if (ret < 0) {
return ret;
}
s->l2_cache_offsets[min_index] = l2_offset; s->l2_cache_offsets[min_index] = l2_offset;
s->l2_cache_counts[min_index] = 1; s->l2_cache_counts[min_index] = 1;
return l2_table; return 0;
} }
/* /*
@ -440,6 +445,7 @@ int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
int l1_bits, c; int l1_bits, c;
unsigned int index_in_cluster, nb_clusters; unsigned int index_in_cluster, nb_clusters;
uint64_t nb_available, nb_needed; uint64_t nb_available, nb_needed;
int ret;
index_in_cluster = (offset >> 9) & (s->cluster_sectors - 1); index_in_cluster = (offset >> 9) & (s->cluster_sectors - 1);
nb_needed = *num + index_in_cluster; nb_needed = *num + index_in_cluster;
@ -478,9 +484,9 @@ int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
/* load the l2 table in memory */ /* load the l2 table in memory */
l2_offset &= ~QCOW_OFLAG_COPIED; l2_offset &= ~QCOW_OFLAG_COPIED;
l2_table = l2_load(bs, l2_offset); ret = l2_load(bs, l2_offset, &l2_table);
if (l2_table == NULL) { if (ret < 0) {
return -EIO; return ret;
} }
/* find the cluster offset for the given disk offset */ /* find the cluster offset for the given disk offset */
@ -547,9 +553,9 @@ static int get_cluster_table(BlockDriverState *bs, uint64_t offset,
if (l2_offset & QCOW_OFLAG_COPIED) { if (l2_offset & QCOW_OFLAG_COPIED) {
/* load the l2 table in memory */ /* load the l2 table in memory */
l2_offset &= ~QCOW_OFLAG_COPIED; l2_offset &= ~QCOW_OFLAG_COPIED;
l2_table = l2_load(bs, l2_offset); ret = l2_load(bs, l2_offset, &l2_table);
if (l2_table == NULL) { if (ret < 0) {
return -EIO; return ret;
} }
} else { } else {
if (l2_offset) if (l2_offset)