| From 47601d6fd4a620799984340c1fd44ff472f9d824 Mon Sep 17 00:00:00 2001 |
| Message-Id: <47601d6fd4a620799984340c1fd44ff472f9d824.1418766606.git.jen@redhat.com> |
| In-Reply-To: <6f81b4847eb68ebdf54a8f1a771e19d112d74152.1418766606.git.jen@redhat.com> |
| References: <6f81b4847eb68ebdf54a8f1a771e19d112d74152.1418766606.git.jen@redhat.com> |
| From: Fam Zheng <famz@redhat.com> |
| Date: Thu, 4 Dec 2014 00:05:18 -0600 |
| Subject: [CHANGE 24/31] block: New bdrv_nb_sectors() |
| To: rhvirt-patches@redhat.com, |
| jen@redhat.com |
| |
| RH-Author: Fam Zheng <famz@redhat.com> |
| Message-id: <1417651524-18041-25-git-send-email-famz@redhat.com> |
| Patchwork-id: 62697 |
| O-Subject: [RHEL-7.1 qemu-kvm PATCH v5 24/30] block: New bdrv_nb_sectors() |
| Bugzilla: 1002493 |
| RH-Acked-by: Jeffrey Cody <jcody@redhat.com> |
| RH-Acked-by: Markus Armbruster <armbru@redhat.com> |
| RH-Acked-by: Max Reitz <mreitz@redhat.com> |
| |
| From: Markus Armbruster <armbru@redhat.com> |
| |
| 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> |
| Reviewed-by: Benoit Canet <benoit@irqsave.net> |
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> |
| (cherry picked from commit 65a9bb25d6b7a4bb41edb102fa0363d81800b417) |
| Signed-off-by: Fam Zheng <famz@redhat.com> |
| Signed-off-by: Jeff E. Nelson <jen@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 d7b6376..21418a6 100644 |
| |
| |
| @@ -647,6 +647,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) |
| { |
| @@ -3255,11 +3256,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; |
| |
| @@ -3269,19 +3271,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; |
| } |
| |
| /* throttling disk io limits */ |
| diff --git a/include/block/block.h b/include/block/block.h |
| index b06a9dc..c79a1e1 100644 |
| |
| |
| @@ -250,6 +250,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); |
| -- |
| 2.1.0 |
| |