block/cow: Return real error code

Signed-off-by: Li Zhi Hui <zhihuili@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Li Zhi Hui 2011-12-12 13:54:33 +08:00 committed by Kevin Wolf
parent 39a7a362e1
commit 16d2fc002a

View File

@ -64,15 +64,26 @@ static int cow_open(BlockDriverState *bs, int flags)
struct cow_header_v2 cow_header; struct cow_header_v2 cow_header;
int bitmap_size; int bitmap_size;
int64_t size; int64_t size;
int ret;
/* see if it is a cow image */ /* see if it is a cow image */
if (bdrv_pread(bs->file, 0, &cow_header, sizeof(cow_header)) != ret = bdrv_pread(bs->file, 0, &cow_header, sizeof(cow_header));
sizeof(cow_header)) { if (ret < 0) {
goto fail; goto fail;
} }
if (be32_to_cpu(cow_header.magic) != COW_MAGIC || if (be32_to_cpu(cow_header.magic) != COW_MAGIC) {
be32_to_cpu(cow_header.version) != COW_VERSION) { ret = -EINVAL;
goto fail;
}
if (be32_to_cpu(cow_header.version) != COW_VERSION) {
char version[64];
snprintf(version, sizeof(version),
"COW version %d", cow_header.version);
qerror_report(QERR_UNKNOWN_BLOCK_FORMAT_FEATURE,
bs->device_name, "cow", version);
ret = -ENOTSUP;
goto fail; goto fail;
} }
@ -88,7 +99,7 @@ static int cow_open(BlockDriverState *bs, int flags)
qemu_co_mutex_init(&s->lock); qemu_co_mutex_init(&s->lock);
return 0; return 0;
fail: fail:
return -1; return ret;
} }
/* /*
@ -182,17 +193,19 @@ static int coroutine_fn cow_read(BlockDriverState *bs, int64_t sector_num,
ret = bdrv_pread(bs->file, ret = bdrv_pread(bs->file,
s->cow_sectors_offset + sector_num * 512, s->cow_sectors_offset + sector_num * 512,
buf, n * 512); buf, n * 512);
if (ret != n * 512) if (ret < 0) {
return -1; return ret;
}
} else { } else {
if (bs->backing_hd) { if (bs->backing_hd) {
/* read from the base image */ /* read from the base image */
ret = bdrv_read(bs->backing_hd, sector_num, buf, n); ret = bdrv_read(bs->backing_hd, sector_num, buf, n);
if (ret < 0) if (ret < 0) {
return -1; return ret;
}
} else { } else {
memset(buf, 0, n * 512); memset(buf, 0, n * 512);
} }
} }
nb_sectors -= n; nb_sectors -= n;
sector_num += n; sector_num += n;
@ -220,8 +233,9 @@ static int cow_write(BlockDriverState *bs, int64_t sector_num,
ret = bdrv_pwrite(bs->file, s->cow_sectors_offset + sector_num * 512, ret = bdrv_pwrite(bs->file, s->cow_sectors_offset + sector_num * 512,
buf, nb_sectors * 512); buf, nb_sectors * 512);
if (ret != nb_sectors * 512) if (ret < 0) {
return -1; return ret;
}
return cow_update_bitmap(bs, sector_num, nb_sectors); return cow_update_bitmap(bs, sector_num, nb_sectors);
} }
@ -288,14 +302,14 @@ static int cow_create(const char *filename, QEMUOptionParameter *options)
cow_header.sectorsize = cpu_to_be32(512); cow_header.sectorsize = cpu_to_be32(512);
cow_header.size = cpu_to_be64(image_sectors * 512); cow_header.size = cpu_to_be64(image_sectors * 512);
ret = bdrv_pwrite(cow_bs, 0, &cow_header, sizeof(cow_header)); ret = bdrv_pwrite(cow_bs, 0, &cow_header, sizeof(cow_header));
if (ret != sizeof(cow_header)) { if (ret < 0) {
goto exit; goto exit;
} }
/* resize to include at least all the bitmap */ /* resize to include at least all the bitmap */
ret = bdrv_truncate(cow_bs, ret = bdrv_truncate(cow_bs,
sizeof(cow_header) + ((image_sectors + 7) >> 3)); sizeof(cow_header) + ((image_sectors + 7) >> 3));
if (ret) { if (ret < 0) {
goto exit; goto exit;
} }