Il 25/11/2013 14:57, Peter Lieven ha scritto: > Signed-off-by: Peter Lieven <p...@kamp.de>
Ok, given this patch I think the cluster_size is the right one to use here---and also the way you used the optimal unmap granularity makes sense; you could also use MAX(optimal unmap granularity, optimal transfer length granularity). However, there is no need to write one cluster at a time. What matters, I think, is to align the *end* of the transfer, so that the next transfer can start aligned. > + if (align && cluster_sectors > 0) { > + int64_t next_aligned_sector = (sector_num + cluster_sectors); So this should be "+ n", not "+ cluster_sectors". Perhaps it could be conditional on "n > cluster_sectors" (small requests happen when you have sparse region, and breaking them doesn't help). Finally, I believe there is no need for a separate "-a" knob. The patch looks fine to me with these small changes, though. Also, a couple of ideas for separate patches. Perhaps the default value of "-S" could be cluster_size if specified? This would avoid making raw images too fragmented, and compounding filesystem-level fragmentation with qcow2-level fragmentation. And 4K is too small a default in my opinion; it could be easily changed to 64K, though 4K was of course an improvement compared to 512 before commit a22f123 (qemu-img: Require larger zero areas for sparse handling, 2011-08-26). Paolo > + 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; > } > diff --git a/qemu-img.texi b/qemu-img.texi > index 87f9d0f..9b1720f 100644 > --- a/qemu-img.texi > +++ b/qemu-img.texi > @@ -179,11 +179,14 @@ Error on reading data > > @end table > > -@item convert [-c] [-p] [-n] [-f @var{fmt}] [-t @var{cache}] [-O > @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S > @var{sparse_size}] [-m @var{iobuf_size}] @var{filename} [@var{filename2} > [...]] @var{output_filename} > +@item convert [-c] [-p] [-n] [-a] [-f @var{fmt}] [-t @var{cache}] [-O > @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S > @var{sparse_size}] [-m @var{iobuf_size}] @var{filename} [@var{filename2} > [...]] @var{output_filename} > > Convert the disk image @var{filename} or a snapshot @var{snapshot_name} to > disk image @var{output_filename} > using format @var{output_fmt}. It can be optionally compressed (@code{-c} > option) or use any format specific options like encryption (@code{-o} > option). > +If the @code{-a} option is specified write requests will be aligned > +to the cluster size of the output image if possible. This is the default > +for compressed images. > > Only the formats @code{qcow} and @code{qcow2} support compression. The > compression is read-only. It means that if a compressed sector is >