[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCHv2 1.8 7/9] qemu-img: round down request length t
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCHv2 1.8 7/9] qemu-img: round down request length to an aligned sector |
Date: |
Tue, 26 Nov 2013 10:51:29 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130923 Thunderbird/17.0.9 |
Il 26/11/2013 09:56, Peter Lieven ha scritto:
> this patch shortens requests to end at an aligned sector so that
> the next request starts aligned.
>
> Signed-off-by: Peter Lieven <address@hidden>
> ---
> qemu-img.c | 30 ++++++++++++++++++++----------
> 1 file changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/qemu-img.c b/qemu-img.c
> index b076d44..1421f0f 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -1124,8 +1124,7 @@ out3:
>
> static int img_convert(int argc, char **argv)
> {
> - int c, n, n1, bs_n, bs_i, compress, cluster_size,
> - cluster_sectors, skip_create;
> + int c, n, n1, bs_n, bs_i, compress, cluster_sectors, skip_create;
> int64_t ret = 0;
> int progress = 0, flags;
> const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
> @@ -1397,19 +1396,21 @@ static int img_convert(int argc, char **argv)
> }
> }
>
> + cluster_sectors = 0;
> + ret = bdrv_get_info(out_bs, &bdi);
> + if (ret < 0 && compress) {
> + error_report("could not get block driver info");
> + goto out;
> + } else {
> + cluster_sectors = bdi.cluster_size / BDRV_SECTOR_SIZE;
> + }
> +
> if (compress) {
> - ret = bdrv_get_info(out_bs, &bdi);
> - if (ret < 0) {
> - error_report("could not get block driver info");
> - goto out;
> - }
> - cluster_size = bdi.cluster_size;
> - if (cluster_size <= 0 || cluster_size > bufsectors *
> BDRV_SECTOR_SIZE) {
> + if (cluster_sectors <= 0 || cluster_sectors > bufsectors) {
> error_report("invalid cluster size");
> ret = -1;
> goto out;
> }
> - cluster_sectors = cluster_size >> 9;
> sector_num = 0;
>
> nb_sectors = total_sectors;
> @@ -1547,6 +1548,15 @@ static int img_convert(int argc, char **argv)
> n = nb_sectors;
> }
>
> + /* round down request length to an aligned sector */
If you have to respin, /* do not bother doing this on short requests.
They happen when we found an all-zero area, and the next sector to write
will not be sector_num + n. */
> + if (cluster_sectors > 0 && n >= cluster_sectors) {
> + int64_t next_aligned_sector = (sector_num + n);
> + next_aligned_sector -= next_aligned_sector % cluster_sectors;
> + if (sector_num + n > next_aligned_sector) {
> + n = next_aligned_sector - sector_num;
> + }
> + }
> +
> if (n > bs_offset + bs_sectors - sector_num) {
> n = bs_offset + bs_sectors - sector_num;
> }
>
Reviewed-by: Paolo Bonzini <address@hidden>