* Re: [Qemu-devel] [PATCH v3 01/10] raw-posix: Fix raw_getlength() to always return -errno on error
[not found] ` <1401473631-10724-2-git-send-email-armbru@redhat.com>
@ 2014-06-02 14:50 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 14:50 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:42 (+0200), Markus Armbruster wrote :
> We got a merry mix of -1 and -errno here.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> block/raw-posix.c | 28 ++++++++++++++++++++++------
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/block/raw-posix.c b/block/raw-posix.c
> index 6586a0c..9221de5 100644
> --- a/block/raw-posix.c
> +++ b/block/raw-posix.c
> @@ -1097,12 +1097,12 @@ static int64_t raw_getlength(BlockDriverState *bs)
> struct stat st;
>
> if (fstat(fd, &st))
> - return -1;
> + return -errno;
> if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
> struct disklabel dl;
>
> if (ioctl(fd, DIOCGDINFO, &dl))
> - return -1;
> + return -errno;
> return (uint64_t)dl.d_secsize *
> dl.d_partitions[DISKPART(st.st_rdev)].p_size;
> } else
> @@ -1116,7 +1116,7 @@ static int64_t raw_getlength(BlockDriverState *bs)
> struct stat st;
>
> if (fstat(fd, &st))
> - return -1;
> + return -errno;
> if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
> struct dkwedge_info dkw;
>
> @@ -1126,7 +1126,7 @@ static int64_t raw_getlength(BlockDriverState *bs)
> struct disklabel dl;
>
> if (ioctl(fd, DIOCGDINFO, &dl))
> - return -1;
> + return -errno;
> return (uint64_t)dl.d_secsize *
> dl.d_partitions[DISKPART(st.st_rdev)].p_size;
> }
> @@ -1139,6 +1139,7 @@ static int64_t raw_getlength(BlockDriverState *bs)
> BDRVRawState *s = bs->opaque;
> struct dk_minfo minfo;
> int ret;
> + int64_t size;
>
> ret = fd_open(bs);
> if (ret < 0) {
> @@ -1157,7 +1158,11 @@ static int64_t raw_getlength(BlockDriverState *bs)
> * There are reports that lseek on some devices fails, but
> * irc discussion said that contingency on contingency was overkill.
> */
> - return lseek(s->fd, 0, SEEK_END);
> + size = lseek(s->fd, 0, SEEK_END);
> + if (size < 0) {
> + return -errno;
> + }
> + return size;
> }
> #elif defined(CONFIG_BSD)
> static int64_t raw_getlength(BlockDriverState *bs)
> @@ -1195,6 +1200,9 @@ again:
> size = LONG_LONG_MAX;
> #else
> size = lseek(fd, 0LL, SEEK_END);
> + if (size < 0) {
> + return -errno;
> + }
> #endif
> #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
> switch(s->type) {
> @@ -1211,6 +1219,9 @@ again:
> #endif
> } else {
> size = lseek(fd, 0, SEEK_END);
> + if (size < 0) {
> + return -errno;
> + }
> }
> return size;
> }
> @@ -1219,13 +1230,18 @@ static int64_t raw_getlength(BlockDriverState *bs)
> {
> BDRVRawState *s = bs->opaque;
> int ret;
> + int64_t size;
>
> ret = fd_open(bs);
> if (ret < 0) {
> return ret;
> }
>
> - return lseek(s->fd, 0, SEEK_END);
> + size = lseek(s->fd, 0, SEEK_END);
> + if (size < 0) {
> + return -errno;
> + }
> + return size;
> }
> #endif
>
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 02/10] block: New bdrv_nb_sectors()
[not found] ` <1401473631-10724-3-git-send-email-armbru@redhat.com>
@ 2014-06-02 14:54 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 14:54 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:43 (+0200), Markus Armbruster wrote :
> A call to retrieve the image size converts between bytes and sectors
> several times:
>
> * BlockDriver method bdrv_getlength() returns bytes.
>
> * refresh_total_sectors() converts to sectors, rounding up, and stores
> in total_sectors.
>
> * bdrv_getlength() converts total_sectors back to bytes (now rounded
> up to a multiple of the sector size).
>
> * Callers wanting sectors rather bytes convert it right back.
> Example: bdrv_get_geometry().
>
> bdrv_nb_sectors() provides a way to omit the last two conversions.
> It's exactly bdrv_getlength() with the conversion to bytes omitted.
> It's functionally like bdrv_get_geometry() without its odd error
> handling.
>
> Reimplement bdrv_getlength() and bdrv_get_geometry() on top of
> bdrv_nb_sectors().
>
> The next patches will convert some users of bdrv_getlength() to
> bdrv_nb_sectors().
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> block.c | 29 +++++++++++++++++++----------
> include/block/block.h | 1 +
> 2 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/block.c b/block.c
> index a517d72..14dc5fe 100644
> --- a/block.c
> +++ b/block.c
> @@ -693,6 +693,7 @@ static int find_image_format(BlockDriverState *bs, const char *filename,
>
> /**
> * Set the current 'total_sectors' value
> + * Return 0 on success, -errno on error.
> */
> static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
> {
> @@ -3551,11 +3552,12 @@ int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
> }
>
> /**
> - * Length of a file in bytes. Return < 0 if error or unknown.
> + * Return number of sectors on success, -errno on error.
> */
> -int64_t bdrv_getlength(BlockDriverState *bs)
> +int64_t bdrv_nb_sectors(BlockDriverState *bs)
> {
> BlockDriver *drv = bs->drv;
> +
> if (!drv)
> return -ENOMEDIUM;
>
> @@ -3565,19 +3567,26 @@ int64_t bdrv_getlength(BlockDriverState *bs)
> return ret;
> }
> }
> - return bs->total_sectors * BDRV_SECTOR_SIZE;
> + return bs->total_sectors;
> +}
> +
> +/**
> + * Return length in bytes on success, -errno on error.
> + * The length is always a multiple of BDRV_SECTOR_SIZE.
> + */
> +int64_t bdrv_getlength(BlockDriverState *bs)
> +{
> + int64_t ret = bdrv_nb_sectors(bs);
> +
> + return ret < 0 ? ret : ret * BDRV_SECTOR_SIZE;
> }
>
> /* return 0 as number of sectors if no device present or error */
> void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
> {
> - int64_t length;
> - length = bdrv_getlength(bs);
> - if (length < 0)
> - length = 0;
> - else
> - length = length >> BDRV_SECTOR_BITS;
> - *nb_sectors_ptr = length;
> + int64_t nb_sectors = bdrv_nb_sectors(bs);
> +
> + *nb_sectors_ptr = nb_sectors < 0 ? 0 : nb_sectors;
> }
>
> void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
> diff --git a/include/block/block.h b/include/block/block.h
> index faee3aa..4a1e875 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -279,6 +279,7 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
> const char *backing_file);
> int bdrv_get_backing_file_depth(BlockDriverState *bs);
> int bdrv_truncate(BlockDriverState *bs, int64_t offset);
> +int64_t bdrv_nb_sectors(BlockDriverState *bs);
> int64_t bdrv_getlength(BlockDriverState *bs);
> int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
> void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 03/10] block: Use bdrv_nb_sectors() in bdrv_make_zero()
[not found] ` <1401473631-10724-4-git-send-email-armbru@redhat.com>
@ 2014-06-02 14:55 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 14:55 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:44 (+0200), Markus Armbruster wrote :
> Instead of bdrv_getlength().
>
> Variable target_size is initially in bytes, then changes meaning to
> sectors. Ugh. Replace by target_sectors.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> block.c | 12 +++++-------
> 1 file changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/block.c b/block.c
> index 14dc5fe..9517108 100644
> --- a/block.c
> +++ b/block.c
> @@ -2855,18 +2855,16 @@ int bdrv_write_zeroes(BlockDriverState *bs, int64_t sector_num,
> */
> int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags)
> {
> - int64_t target_size;
> - int64_t ret, nb_sectors, sector_num = 0;
> + int64_t target_sectors, ret, nb_sectors, sector_num = 0;
> int n;
>
> - target_size = bdrv_getlength(bs);
> - if (target_size < 0) {
> - return target_size;
> + target_sectors = bdrv_nb_sectors(bs);
> + if (target_sectors < 0) {
> + return target_sectors;
> }
> - target_size /= BDRV_SECTOR_SIZE;
>
> for (;;) {
> - nb_sectors = target_size - sector_num;
> + nb_sectors = target_sectors - sector_num;
> if (nb_sectors <= 0) {
> return 0;
> }
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 04/10] block: Use bdrv_nb_sectors() in bdrv_aligned_preadv()
[not found] ` <1401473631-10724-5-git-send-email-armbru@redhat.com>
@ 2014-06-02 14:58 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 14:58 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:45 (+0200), Markus Armbruster wrote :
> Instead of bdrv_getlength(). Eliminate variable len.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> block.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/block.c b/block.c
> index 9517108..6639d09 100644
> --- a/block.c
> +++ b/block.c
> @@ -3081,15 +3081,14 @@ static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs,
> ret = drv->bdrv_co_readv(bs, sector_num, nb_sectors, qiov);
> } else {
> /* Read zeros after EOF of growable BDSes */
> - int64_t len, total_sectors, max_nb_sectors;
> + int64_t total_sectors, max_nb_sectors;
>
> - len = bdrv_getlength(bs);
> - if (len < 0) {
> - ret = len;
> + total_sectors = bdrv_nb_sectors(bs);
> + if (total_sectors < 0) {
> + ret = total_sectors;
> goto out;
> }
>
> - total_sectors = DIV_ROUND_UP(len, BDRV_SECTOR_SIZE);
> max_nb_sectors = ROUND_UP(MAX(0, total_sectors - sector_num),
> align >> BDRV_SECTOR_BITS);
> if (max_nb_sectors > 0) {
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 05/10] block: Use bdrv_nb_sectors() in bdrv_co_get_block_status()
[not found] ` <1401473631-10724-6-git-send-email-armbru@redhat.com>
@ 2014-06-02 15:00 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 15:00 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:46 (+0200), Markus Armbruster wrote :
> Instead of bdrv_getlength().
>
> Replace variables length, length2 by total_sectors, nb_sectors2.
> Bonus: use total_sectors instead of the slightly unclean
> bs->total_sectors.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> block.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/block.c b/block.c
> index 6639d09..cfeb497 100644
> --- a/block.c
> +++ b/block.c
> @@ -3926,21 +3926,21 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
> int64_t sector_num,
> int nb_sectors, int *pnum)
> {
> - int64_t length;
> + int64_t total_sectors;
> int64_t n;
> int64_t ret, ret2;
>
> - length = bdrv_getlength(bs);
> - if (length < 0) {
> - return length;
> + total_sectors = bdrv_nb_sectors(bs);
> + if (total_sectors < 0) {
> + return total_sectors;
> }
>
> - if (sector_num >= (length >> BDRV_SECTOR_BITS)) {
> + if (sector_num >= total_sectors) {
> *pnum = 0;
> return 0;
> }
>
> - n = bs->total_sectors - sector_num;
> + n = total_sectors - sector_num;
> if (n < nb_sectors) {
> nb_sectors = n;
> }
> @@ -3975,8 +3975,8 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
> ret |= BDRV_BLOCK_ZERO;
> } else if (bs->backing_hd) {
> BlockDriverState *bs2 = bs->backing_hd;
> - int64_t length2 = bdrv_getlength(bs2);
> - if (length2 >= 0 && sector_num >= (length2 >> BDRV_SECTOR_BITS)) {
> + int64_t nb_sectors2 = bdrv_nb_sectors(bs2);
> + if (nb_sectors2 >= 0 && sector_num >= nb_sectors2) {
> ret |= BDRV_BLOCK_ZERO;
> }
> }
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 06/10] block: Use bdrv_nb_sectors() in img_convert()
[not found] ` <1401473631-10724-7-git-send-email-armbru@redhat.com>
@ 2014-06-02 15:02 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 15:02 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:47 (+0200), Markus Armbruster wrote :
> Instead of bdrv_getlength(). Replace variable output_length by
> output_sectors.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> qemu-img.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/qemu-img.c b/qemu-img.c
> index 1ad899e..8d996ba 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -1478,13 +1478,13 @@ static int img_convert(int argc, char **argv)
> buf = qemu_blockalign(out_bs, bufsectors * BDRV_SECTOR_SIZE);
>
> if (skip_create) {
> - int64_t output_length = bdrv_getlength(out_bs);
> - if (output_length < 0) {
> + int64_t output_sectors = bdrv_nb_sectors(out_bs);
> + if (output_sectors < 0) {
> error_report("unable to get output image length: %s\n",
> - strerror(-output_length));
> + strerror(-output_sectors));
> ret = -1;
> goto out;
> - } else if (output_length < total_sectors << BDRV_SECTOR_BITS) {
> + } else if (output_sectors < total_sectors) {
> error_report("output file is smaller than input file");
> ret = -1;
> goto out;
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 07/10] block: Use bdrv_nb_sectors() where sectors, not bytes are wanted
[not found] ` <1401473631-10724-8-git-send-email-armbru@redhat.com>
@ 2014-06-02 15:06 ` Benoît Canet
2014-06-02 16:45 ` Markus Armbruster
0 siblings, 1 reply; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 15:06 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:48 (+0200), Markus Armbruster wrote :
> Instead of bdrv_getlength().
>
> Aside: a few of these callers don't handle errors. I didn't
> investigate whether they should.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> block-migration.c | 9 ++++-----
> block.c | 3 +--
> block/qcow2.c | 2 +-
> block/vmdk.c | 5 ++---
> 4 files changed, 8 insertions(+), 11 deletions(-)
>
> diff --git a/block-migration.c b/block-migration.c
> index 1656270..1c7b7be 100644
> --- a/block-migration.c
> +++ b/block-migration.c
> @@ -186,7 +186,7 @@ static int bmds_aio_inflight(BlkMigDevState *bmds, int64_t sector)
> {
> int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
>
> - if ((sector << BDRV_SECTOR_BITS) < bdrv_getlength(bmds->bs)) {
> + if (sector < bdrv_nb_sectors(bmds->bs)) {
> return !!(bmds->aio_bitmap[chunk / (sizeof(unsigned long) * 8)] &
> (1UL << (chunk % (sizeof(unsigned long) * 8))));
> } else {
> @@ -223,8 +223,7 @@ static void alloc_aio_bitmap(BlkMigDevState *bmds)
> BlockDriverState *bs = bmds->bs;
> int64_t bitmap_size;
>
> - bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
> - BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
> + bitmap_size = bdrv_nb_sectors(bs) + BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
> bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
>
> bmds->aio_bitmap = g_malloc0(bitmap_size);
> @@ -350,7 +349,7 @@ static void init_blk_migration_it(void *opaque, BlockDriverState *bs)
> int64_t sectors;
>
> if (!bdrv_is_read_only(bs)) {
> - sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
> + sectors = bdrv_nb_sectors(bs);
> if (sectors <= 0) {
> return;
> }
> @@ -800,7 +799,7 @@ static int block_load(QEMUFile *f, void *opaque, int version_id)
>
> if (bs != bs_prev) {
> bs_prev = bs;
> - total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
> + total_sectors = bdrv_nb_sectors(bs);
> if (total_sectors <= 0) {
> error_report("Error getting length of block device %s",
> device_name);
> diff --git a/block.c b/block.c
> index cfeb497..8ebfb79 100644
> --- a/block.c
> +++ b/block.c
> @@ -5258,13 +5258,12 @@ BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity,
>
> granularity >>= BDRV_SECTOR_BITS;
> assert(granularity);
> - bitmap_size = bdrv_getlength(bs);
> + bitmap_size = bdrv_nb_sectors(bs);
The name bitmap_size seems to imply the unit is byte.
> if (bitmap_size < 0) {
> error_setg_errno(errp, -bitmap_size, "could not get length of device");
> errno = -bitmap_size;
> return NULL;
> }
> - bitmap_size >>= BDRV_SECTOR_BITS;
> bitmap = g_malloc0(sizeof(BdrvDirtyBitmap));
> bitmap->bitmap = hbitmap_alloc(bitmap_size, ffs(granularity) - 1);
> QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
> diff --git a/block/qcow2.c b/block/qcow2.c
> index a4b97e8..98f624c 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1539,7 +1539,7 @@ static int preallocate(BlockDriverState *bs)
> int ret;
> QCowL2Meta *meta;
>
> - nb_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
> + nb_sectors = bdrv_nb_sectors(bs);
> offset = 0;
>
> while (nb_sectors) {
> diff --git a/block/vmdk.c b/block/vmdk.c
> index 480ea37..5c5e73b 100644
> --- a/block/vmdk.c
> +++ b/block/vmdk.c
> @@ -669,8 +669,7 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
> if (le32_to_cpu(header.flags) & VMDK4_FLAG_RGD) {
> l1_backup_offset = le64_to_cpu(header.rgd_offset) << 9;
> }
> - if (bdrv_getlength(file) <
> - le64_to_cpu(header.grain_offset) * BDRV_SECTOR_SIZE) {
> + if (bdrv_nb_sectors(file) < le64_to_cpu(header.grain_offset)) {
> error_setg(errp, "File truncated, expecting at least %" PRId64 " bytes",
> (int64_t)(le64_to_cpu(header.grain_offset)
> * BDRV_SECTOR_SIZE));
> @@ -2004,7 +2003,7 @@ static int vmdk_check(BlockDriverState *bs, BdrvCheckResult *result,
> BDRVVmdkState *s = bs->opaque;
> VmdkExtent *extent = NULL;
> int64_t sector_num = 0;
> - int64_t total_sectors = bdrv_getlength(bs) / BDRV_SECTOR_SIZE;
> + int64_t total_sectors = bdrv_nb_sectors(bs);
> int ret;
> uint64_t cluster_offset;
>
> --
> 1.9.3
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 08/10] block: Drop superfluous aligning of bdrv_getlength()'s value
[not found] ` <1401473631-10724-9-git-send-email-armbru@redhat.com>
@ 2014-06-02 15:07 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 15:07 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:49 (+0200), Markus Armbruster wrote :
> It returns a multiple of the sector size.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
> ---
> block.c | 1 -
> block/qcow2.c | 1 -
> 2 files changed, 2 deletions(-)
>
> diff --git a/block.c b/block.c
> index 8ebfb79..41837b4 100644
> --- a/block.c
> +++ b/block.c
> @@ -1260,7 +1260,6 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, int flags, Error **errp)
> error_setg_errno(errp, -total_size, "Could not get image size");
> goto out;
> }
> - total_size &= BDRV_SECTOR_MASK;
>
> /* Create the temporary image */
> ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 98f624c..4af09bd 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1927,7 +1927,6 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
> /* align end of file to a sector boundary to ease reading with
> sector based I/Os */
> cluster_offset = bdrv_getlength(bs->file);
> - cluster_offset = (cluster_offset + 511) & ~511;
> bdrv_truncate(bs->file, cluster_offset);
> return 0;
> }
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 09/10] qemu-img: Make img_convert() get image size just once per image
[not found] ` <1401473631-10724-10-git-send-email-armbru@redhat.com>
@ 2014-06-02 15:13 ` Benoît Canet
0 siblings, 0 replies; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 15:13 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:50 (+0200), Markus Armbruster wrote :
> Chiefly so I don't have to do the error checking in quadruplicate in
> the next commit. Moreover, replacing the frequently updated
> bs_sectors by an array assigned just once makes the code easier to
> understand.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
> ---
> qemu-img.c | 32 ++++++++++++++++----------------
> 1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/qemu-img.c b/qemu-img.c
> index 8d996ba..2cb56c5 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -1186,7 +1186,7 @@ static int img_convert(int argc, char **argv)
> BlockDriver *drv, *proto_drv;
> BlockDriverState **bs = NULL, *out_bs = NULL;
> int64_t total_sectors, nb_sectors, sector_num, bs_offset;
> - uint64_t bs_sectors;
> + uint64_t *bs_sectors = NULL;
> uint8_t * buf = NULL;
> size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
> const uint8_t *buf1;
> @@ -1326,7 +1326,8 @@ static int img_convert(int argc, char **argv)
>
> qemu_progress_print(0, 100);
>
> - bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
> + bs = g_new0(BlockDriverState *, bs_n);
> + bs_sectors = g_new(uint64_t, bs_n);
>
> total_sectors = 0;
> for (bs_i = 0; bs_i < bs_n; bs_i++) {
> @@ -1340,8 +1341,8 @@ static int img_convert(int argc, char **argv)
> ret = -1;
> goto out;
> }
> - bdrv_get_geometry(bs[bs_i], &bs_sectors);
> - total_sectors += bs_sectors;
> + bdrv_get_geometry(bs[bs_i], &bs_sectors[bs_i]);
> + total_sectors += bs_sectors[bs_i];
> }
>
> if (sn_opts) {
> @@ -1465,7 +1466,6 @@ static int img_convert(int argc, char **argv)
>
> bs_i = 0;
> bs_offset = 0;
> - bdrv_get_geometry(bs[0], &bs_sectors);
>
> /* increase bufsectors from the default 4096 (2M) if opt_transfer_length
> * or discard_alignment of the out_bs is greater. Limit to 32768 (16MB)
> @@ -1532,19 +1532,19 @@ static int img_convert(int argc, char **argv)
> buf2 = buf;
> while (remainder > 0) {
> int nlow;
> - while (bs_num == bs_sectors) {
> + while (bs_num == bs_sectors[bs_i]) {
> + bs_offset += bs_sectors[bs_i];
> bs_i++;
> assert (bs_i < bs_n);
> - bs_offset += bs_sectors;
> - bdrv_get_geometry(bs[bs_i], &bs_sectors);
> bs_num = 0;
> /* printf("changing part: sector_num=%" PRId64 ", "
> "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
> - "\n", sector_num, bs_i, bs_offset, bs_sectors); */
> + "\n", sector_num, bs_i, bs_offset, bs_sectors[bs_i]); */
> }
> - assert (bs_num < bs_sectors);
> + assert (bs_num < bs_sectors[bs_i]);
>
> - nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
> + nlow = remainder > bs_sectors[bs_i] - bs_num
> + ? bs_sectors[bs_i] - bs_num : remainder;
>
> ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
> if (ret < 0) {
> @@ -1605,14 +1605,13 @@ restart:
> break;
> }
>
> - while (sector_num - bs_offset >= bs_sectors) {
> + while (sector_num - bs_offset >= bs_sectors[bs_i]) {
> + bs_offset += bs_sectors[bs_i];
> bs_i ++;
> assert (bs_i < bs_n);
> - bs_offset += bs_sectors;
> - bdrv_get_geometry(bs[bs_i], &bs_sectors);
> /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
> "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
> - sector_num, bs_i, bs_offset, bs_sectors); */
> + sector_num, bs_i, bs_offset, bs_sectors[bs_i]); */
> }
>
> if ((out_baseimg || has_zero_init) &&
> @@ -1665,7 +1664,7 @@ restart:
> }
> }
>
> - n = MIN(n, bs_sectors - (sector_num - bs_offset));
> + n = MIN(n, bs_sectors[bs_i] - (sector_num - bs_offset));
>
> sectors_read += n;
> if (count_allocated_sectors) {
> @@ -1723,6 +1722,7 @@ out:
> }
> g_free(bs);
> }
> + g_free(bs_sectors);
> fail_getopt:
> g_free(options);
>
> --
> 1.9.3
>
>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where errors should be detected
[not found] ` <1401473631-10724-11-git-send-email-armbru@redhat.com>
@ 2014-06-02 15:22 ` Benoît Canet
2014-06-02 16:49 ` Markus Armbruster
0 siblings, 1 reply; 13+ messages in thread
From: Benoît Canet @ 2014-06-02 15:22 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha, mreitz
The Friday 30 May 2014 à 20:13:51 (+0200), Markus Armbruster wrote :
> bdrv_get_geometry() hides errors. Use bdrv_nb_sectors() or
> bdrv_getlength() instead where that's obviously inappropriate.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
> ---
> block.c | 11 ++++++++---
> block/qapi.c | 14 ++++++++++----
> qemu-img.c | 59 +++++++++++++++++++++++++++++++++++++++++++++--------------
> 3 files changed, 63 insertions(+), 21 deletions(-)
>
> diff --git a/block.c b/block.c
> index 41837b4..94f8b87 100644
> --- a/block.c
> +++ b/block.c
> @@ -5573,7 +5573,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
> if (size && size->value.n == -1) {
> if (backing_file && backing_file->value.s) {
> BlockDriverState *bs;
> - uint64_t size;
> + int64_t size;
> char buf[32];
> int back_flags;
>
> @@ -5592,8 +5592,13 @@ void bdrv_img_create(const char *filename, const char *fmt,
> local_err = NULL;
> goto out;
> }
> - bdrv_get_geometry(bs, &size);
> - size *= 512;
> + size = bdrv_getlength(bs);
> + if (size < 0) {
> + error_setg_errno(errp, -size, "Could not get size of '%s'",
> + backing_file->value.s);
> + bdrv_unref(bs);
> + goto out;
> + }
>
> snprintf(buf, sizeof(buf), "%" PRId64, size);
> set_option_parameter(param, BLOCK_OPT_SIZE, buf);
> diff --git a/block/qapi.c b/block/qapi.c
> index 75f44f1..ae6488a 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c
> @@ -165,19 +165,25 @@ void bdrv_query_image_info(BlockDriverState *bs,
> ImageInfo **p_info,
> Error **errp)
> {
> - uint64_t total_sectors;
> + int64_t size;
> const char *backing_filename;
> char backing_filename2[1024];
> BlockDriverInfo bdi;
> int ret;
> Error *err = NULL;
> - ImageInfo *info = g_new0(ImageInfo, 1);
> + ImageInfo *info;
>
> - bdrv_get_geometry(bs, &total_sectors);
> + size = bdrv_getlength(bs);
> + if (size < 0) {
> + error_setg_errno(errp, -size, "Can't get size of device '%s'",
> + bdrv_get_device_name(bs));
> + return;
> + }
>
> + info = g_new0(ImageInfo, 1);
> info->filename = g_strdup(bs->filename);
> info->format = g_strdup(bdrv_get_format_name(bs));
> - info->virtual_size = total_sectors * 512;
> + info->virtual_size = size;
> info->actual_size = bdrv_get_allocated_file_size(bs);
> info->has_actual_size = info->actual_size >= 0;
> if (bdrv_is_encrypted(bs)) {
> diff --git a/qemu-img.c b/qemu-img.c
> index 2cb56c5..fca58bc 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -959,7 +959,6 @@ static int img_compare(int argc, char **argv)
> int64_t sector_num = 0;
> int64_t nb_sectors;
> int c, pnum;
> - uint64_t bs_sectors;
> uint64_t progress_base;
>
> for (;;) {
> @@ -1021,10 +1020,18 @@ static int img_compare(int argc, char **argv)
>
> buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
> buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
> - bdrv_get_geometry(bs1, &bs_sectors);
> - total_sectors1 = bs_sectors;
> - bdrv_get_geometry(bs2, &bs_sectors);
> - total_sectors2 = bs_sectors;
> + total_sectors1 = bdrv_nb_sectors(bs1);
> + if (total_sectors1 < 0) {
> + error_report("Can't get size of %s: %s",
> + filename1, strerror(-total_sectors1));
> + goto out;
> + }
> + total_sectors2 = bdrv_nb_sectors(bs2);
> + if (total_sectors2 < 0) {
> + error_report("Can't get size of %s: %s",
> + filename2, strerror(-total_sectors2));
> + goto out;
> + }
Would setting ret be useful beforie goto out ?
> total_sectors = MIN(total_sectors1, total_sectors2);
> progress_base = MAX(total_sectors1, total_sectors2);
>
OA> @@ -1186,7 +1193,7 @@ static int img_convert(int argc, char **argv)
> BlockDriver *drv, *proto_drv;
> BlockDriverState **bs = NULL, *out_bs = NULL;
> int64_t total_sectors, nb_sectors, sector_num, bs_offset;
> - uint64_t *bs_sectors = NULL;
> + int64_t *bs_sectors = NULL;
> uint8_t * buf = NULL;
> size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
> const uint8_t *buf1;
> @@ -1327,7 +1334,7 @@ static int img_convert(int argc, char **argv)
> qemu_progress_print(0, 100);
>
> bs = g_new0(BlockDriverState *, bs_n);
> - bs_sectors = g_new(uint64_t, bs_n);
> + bs_sectors = g_new(int64_t, bs_n);
>
> total_sectors = 0;
> for (bs_i = 0; bs_i < bs_n; bs_i++) {
> @@ -1341,7 +1348,13 @@ static int img_convert(int argc, char **argv)
> ret = -1;
> goto out;
> }
> - bdrv_get_geometry(bs[bs_i], &bs_sectors[bs_i]);
> + bs_sectors[bs_i] = bdrv_nb_sectors(bs[bs_i]);
> + if (bs_sectors[bs_i] < 0) {
> + error_report("Could not get size of %s: %s",
> + argv[optind + bs_i], strerror(-bs_sectors[bs_i]));
> + ret = -1;
> + goto out;
> + }
> total_sectors += bs_sectors[bs_i];
> }
>
> @@ -2422,9 +2435,9 @@ static int img_rebase(int argc, char **argv)
> * the image is the same as the original one at any time.
> */
> if (!unsafe) {
> - uint64_t num_sectors;
> - uint64_t old_backing_num_sectors;
> - uint64_t new_backing_num_sectors = 0;
> + int64_t num_sectors;
> + int64_t old_backing_num_sectors;
> + int64_t new_backing_num_sectors = 0;
> uint64_t sector;
> int n;
> uint8_t * buf_old;
> @@ -2434,10 +2447,28 @@ static int img_rebase(int argc, char **argv)
> buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
> buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
>
> - bdrv_get_geometry(bs, &num_sectors);
> - bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
> + num_sectors = bdrv_nb_sectors(bs);
> + if (num_sectors < 0) {
> + error_report("Could not get size of '%s': %s",
> + filename, strerror(-num_sectors));
> + goto out;
> + }
> + old_backing_num_sectors = bdrv_nb_sectors(bs_old_backing);
> + if (old_backing_num_sectors < 0) {
> + char backing_name[1024];
> +
> + bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
> + error_report("Could not get size of '%s': %s",
> + backing_name, strerror(-old_backing_num_sectors));
> + goto out;
> + }
> if (bs_new_backing) {
> - bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
> + new_backing_num_sectors = bdrv_nb_sectors(bs_new_backing);
> + if (new_backing_num_sectors < 0) {
> + error_report("Could not get size of '%s': %s",
> + out_baseimg, strerror(-new_backing_num_sectors));
> + goto out;
> + }
> }
>
> if (num_sectors != 0) {
> --
> 1.9.3
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 07/10] block: Use bdrv_nb_sectors() where sectors, not bytes are wanted
2014-06-02 15:06 ` [Qemu-devel] [PATCH v3 07/10] block: Use bdrv_nb_sectors() where sectors, not bytes are wanted Benoît Canet
@ 2014-06-02 16:45 ` Markus Armbruster
0 siblings, 0 replies; 13+ messages in thread
From: Markus Armbruster @ 2014-06-02 16:45 UTC (permalink / raw)
To: Benoît Canet; +Cc: kwolf, qemu-devel, stefanha, mreitz
Benoît Canet <benoit.canet@irqsave.net> writes:
> The Friday 30 May 2014 à 20:13:48 (+0200), Markus Armbruster wrote :
>> Instead of bdrv_getlength().
>>
>> Aside: a few of these callers don't handle errors. I didn't
>> investigate whether they should.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
[...]
>> diff --git a/block.c b/block.c
>> index cfeb497..8ebfb79 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -5258,13 +5258,12 @@ BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity,
>>
>> granularity >>= BDRV_SECTOR_BITS;
>> assert(granularity);
>> - bitmap_size = bdrv_getlength(bs);
>> + bitmap_size = bdrv_nb_sectors(bs);
>
> The name bitmap_size seems to imply the unit is byte.
I didn't examine how the bitmap is used. My patch doesn't change the
value put into bitmap_size.
>> if (bitmap_size < 0) {
>> error_setg_errno(errp, -bitmap_size, "could not get length of device");
>> errno = -bitmap_size;
>> return NULL;
>> }
>> - bitmap_size >>= BDRV_SECTOR_BITS;
>> bitmap = g_malloc0(sizeof(BdrvDirtyBitmap));
>> bitmap->bitmap = hbitmap_alloc(bitmap_size, ffs(granularity) - 1);
>> QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
[...]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where errors should be detected
2014-06-02 15:22 ` [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where errors should be detected Benoît Canet
@ 2014-06-02 16:49 ` Markus Armbruster
2014-06-04 11:51 ` Markus Armbruster
0 siblings, 1 reply; 13+ messages in thread
From: Markus Armbruster @ 2014-06-02 16:49 UTC (permalink / raw)
To: Benoît Canet; +Cc: kwolf, qemu-devel, stefanha, mreitz
Benoît Canet <benoit.canet@irqsave.net> writes:
> The Friday 30 May 2014 à 20:13:51 (+0200), Markus Armbruster wrote :
>> bdrv_get_geometry() hides errors. Use bdrv_nb_sectors() or
>> bdrv_getlength() instead where that's obviously inappropriate.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
>> Reviewed-by: Max Reitz <mreitz@redhat.com>
>> ---
>> block.c | 11 ++++++++---
>> block/qapi.c | 14 ++++++++++----
>> qemu-img.c | 59 +++++++++++++++++++++++++++++++++++++++++++++--------------
>> 3 files changed, 63 insertions(+), 21 deletions(-)
>>
>> diff --git a/block.c b/block.c
>> index 41837b4..94f8b87 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -5573,7 +5573,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
>> if (size && size->value.n == -1) {
>> if (backing_file && backing_file->value.s) {
>> BlockDriverState *bs;
>> - uint64_t size;
>> + int64_t size;
>> char buf[32];
>> int back_flags;
>>
>> @@ -5592,8 +5592,13 @@ void bdrv_img_create(const char *filename, const char *fmt,
>> local_err = NULL;
>> goto out;
>> }
>> - bdrv_get_geometry(bs, &size);
>> - size *= 512;
>> + size = bdrv_getlength(bs);
>> + if (size < 0) {
>> + error_setg_errno(errp, -size, "Could not get size of '%s'",
>> + backing_file->value.s);
>> + bdrv_unref(bs);
>> + goto out;
>> + }
>>
>> snprintf(buf, sizeof(buf), "%" PRId64, size);
>> set_option_parameter(param, BLOCK_OPT_SIZE, buf);
>> diff --git a/block/qapi.c b/block/qapi.c
>> index 75f44f1..ae6488a 100644
>> --- a/block/qapi.c
>> +++ b/block/qapi.c
>> @@ -165,19 +165,25 @@ void bdrv_query_image_info(BlockDriverState *bs,
>> ImageInfo **p_info,
>> Error **errp)
>> {
>> - uint64_t total_sectors;
>> + int64_t size;
>> const char *backing_filename;
>> char backing_filename2[1024];
>> BlockDriverInfo bdi;
>> int ret;
>> Error *err = NULL;
>> - ImageInfo *info = g_new0(ImageInfo, 1);
>> + ImageInfo *info;
>>
>> - bdrv_get_geometry(bs, &total_sectors);
>> + size = bdrv_getlength(bs);
>> + if (size < 0) {
>> + error_setg_errno(errp, -size, "Can't get size of device '%s'",
>> + bdrv_get_device_name(bs));
>> + return;
>> + }
>>
>> + info = g_new0(ImageInfo, 1);
>> info->filename = g_strdup(bs->filename);
>> info->format = g_strdup(bdrv_get_format_name(bs));
>> - info->virtual_size = total_sectors * 512;
>> + info->virtual_size = size;
>> info->actual_size = bdrv_get_allocated_file_size(bs);
>> info->has_actual_size = info->actual_size >= 0;
>> if (bdrv_is_encrypted(bs)) {
>> diff --git a/qemu-img.c b/qemu-img.c
>> index 2cb56c5..fca58bc 100644
>> --- a/qemu-img.c
>> +++ b/qemu-img.c
>> @@ -959,7 +959,6 @@ static int img_compare(int argc, char **argv)
>> int64_t sector_num = 0;
>> int64_t nb_sectors;
>> int c, pnum;
>> - uint64_t bs_sectors;
>> uint64_t progress_base;
>>
>> for (;;) {
>> @@ -1021,10 +1020,18 @@ static int img_compare(int argc, char **argv)
>>
>> buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
>> buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
>> - bdrv_get_geometry(bs1, &bs_sectors);
>> - total_sectors1 = bs_sectors;
>> - bdrv_get_geometry(bs2, &bs_sectors);
>> - total_sectors2 = bs_sectors;
>> + total_sectors1 = bdrv_nb_sectors(bs1);
>> + if (total_sectors1 < 0) {
>> + error_report("Can't get size of %s: %s",
>> + filename1, strerror(-total_sectors1));
>> + goto out;
>> + }
>> + total_sectors2 = bdrv_nb_sectors(bs2);
>> + if (total_sectors2 < 0) {
>> + error_report("Can't get size of %s: %s",
>> + filename2, strerror(-total_sectors2));
>> + goto out;
>> + }
> Would setting ret be useful beforie goto out ?
Yes, to a value > 1. But which one? We use 2, 3 and 4, but their
documented only as ">1 - Error occured".
>> total_sectors = MIN(total_sectors1, total_sectors2);
>> progress_base = MAX(total_sectors1, total_sectors2);
>>
[...]
Thanks!
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where errors should be detected
2014-06-02 16:49 ` Markus Armbruster
@ 2014-06-04 11:51 ` Markus Armbruster
0 siblings, 0 replies; 13+ messages in thread
From: Markus Armbruster @ 2014-06-04 11:51 UTC (permalink / raw)
To: Benoît Canet; +Cc: kwolf, qemu-devel, stefanha, mreitz
Markus Armbruster <armbru@redhat.com> writes:
> Benoît Canet <benoit.canet@irqsave.net> writes:
>
>> The Friday 30 May 2014 à 20:13:51 (+0200), Markus Armbruster wrote :
>>> bdrv_get_geometry() hides errors. Use bdrv_nb_sectors() or
>>> bdrv_getlength() instead where that's obviously inappropriate.
[...]
>>> diff --git a/qemu-img.c b/qemu-img.c
>>> index 2cb56c5..fca58bc 100644
>>> --- a/qemu-img.c
>>> +++ b/qemu-img.c
>>> @@ -959,7 +959,6 @@ static int img_compare(int argc, char **argv)
>>> int64_t sector_num = 0;
>>> int64_t nb_sectors;
>>> int c, pnum;
>>> - uint64_t bs_sectors;
>>> uint64_t progress_base;
>>>
>>> for (;;) {
>>> @@ -1021,10 +1020,18 @@ static int img_compare(int argc, char **argv)
>>>
>>> buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
>>> buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
>>> - bdrv_get_geometry(bs1, &bs_sectors);
>>> - total_sectors1 = bs_sectors;
>>> - bdrv_get_geometry(bs2, &bs_sectors);
>>> - total_sectors2 = bs_sectors;
>>> + total_sectors1 = bdrv_nb_sectors(bs1);
>>> + if (total_sectors1 < 0) {
>>> + error_report("Can't get size of %s: %s",
>>> + filename1, strerror(-total_sectors1));
>>> + goto out;
>>> + }
>>> + total_sectors2 = bdrv_nb_sectors(bs2);
>>> + if (total_sectors2 < 0) {
>>> + error_report("Can't get size of %s: %s",
>>> + filename2, strerror(-total_sectors2));
>>> + goto out;
>>> + }
>> Would setting ret be useful beforie goto out ?
>
> Yes, to a value > 1. But which one? We use 2, 3 and 4, but their
> documented only as ">1 - Error occured".
All right, I'm picking the value we use for read failures: 4.
>>> total_sectors = MIN(total_sectors1, total_sectors2);
>>> progress_base = MAX(total_sectors1, total_sectors2);
>>>
> [...]
>
> Thanks!
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2014-06-04 11:51 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1401473631-10724-1-git-send-email-armbru@redhat.com>
[not found] ` <1401473631-10724-2-git-send-email-armbru@redhat.com>
2014-06-02 14:50 ` [Qemu-devel] [PATCH v3 01/10] raw-posix: Fix raw_getlength() to always return -errno on error Benoît Canet
[not found] ` <1401473631-10724-3-git-send-email-armbru@redhat.com>
2014-06-02 14:54 ` [Qemu-devel] [PATCH v3 02/10] block: New bdrv_nb_sectors() Benoît Canet
[not found] ` <1401473631-10724-4-git-send-email-armbru@redhat.com>
2014-06-02 14:55 ` [Qemu-devel] [PATCH v3 03/10] block: Use bdrv_nb_sectors() in bdrv_make_zero() Benoît Canet
[not found] ` <1401473631-10724-5-git-send-email-armbru@redhat.com>
2014-06-02 14:58 ` [Qemu-devel] [PATCH v3 04/10] block: Use bdrv_nb_sectors() in bdrv_aligned_preadv() Benoît Canet
[not found] ` <1401473631-10724-6-git-send-email-armbru@redhat.com>
2014-06-02 15:00 ` [Qemu-devel] [PATCH v3 05/10] block: Use bdrv_nb_sectors() in bdrv_co_get_block_status() Benoît Canet
[not found] ` <1401473631-10724-7-git-send-email-armbru@redhat.com>
2014-06-02 15:02 ` [Qemu-devel] [PATCH v3 06/10] block: Use bdrv_nb_sectors() in img_convert() Benoît Canet
[not found] ` <1401473631-10724-8-git-send-email-armbru@redhat.com>
2014-06-02 15:06 ` [Qemu-devel] [PATCH v3 07/10] block: Use bdrv_nb_sectors() where sectors, not bytes are wanted Benoît Canet
2014-06-02 16:45 ` Markus Armbruster
[not found] ` <1401473631-10724-9-git-send-email-armbru@redhat.com>
2014-06-02 15:07 ` [Qemu-devel] [PATCH v3 08/10] block: Drop superfluous aligning of bdrv_getlength()'s value Benoît Canet
[not found] ` <1401473631-10724-10-git-send-email-armbru@redhat.com>
2014-06-02 15:13 ` [Qemu-devel] [PATCH v3 09/10] qemu-img: Make img_convert() get image size just once per image Benoît Canet
[not found] ` <1401473631-10724-11-git-send-email-armbru@redhat.com>
2014-06-02 15:22 ` [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where errors should be detected Benoît Canet
2014-06-02 16:49 ` Markus Armbruster
2014-06-04 11:51 ` Markus Armbruster
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).