Il 25/11/2013 14:57, Peter Lieven ha scritto:
Signed-off-by: Peter Lieven <address@hidden>
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
address@hidden 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} address@hidden [...]] @var{output_filename}
address@hidden 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} address@hidden [...]]
@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