On 03/06/2012 01:34 AM, Eric Blake wrote:
Disk manufacturers are fond of quoting sizes in powers of 10, rather than powers of 2 (after all, 2.1 GB sounds larger than 2.0 GiB, even though the exact opposite is true). So, we might as well follow coreutils lead in supporting three types of suffix: single letter ${u} (which we already had) and ${u}iB for the power of 2, and ${u}B for power of 10. Additionally, it is impossible to create a file with more than 2**63 bytes, since off_t is signed (if you have enough storage to even create one 8EiB file, I'm jealous). This now reports failure up front rather than down the road when the kernel finally refuses an impossible size. * docs/schemas/basictypes.rng (unit): Add suffixes. * src/conf/storage_conf.c (virStorageSize): Use new function. * docs/formatstorage.html.in: Document it. --- v2: new docs/formatstorage.html.in | 21 +++++--- docs/schemas/basictypes.rng | 2 +- src/conf/storage_conf.c | 61 +++--------------------- tests/storagevolxml2xmlin/vol-file-backing.xml | 4 +- tests/storagevolxml2xmlin/vol-file.xml | 4 +- 5 files changed, 26 insertions(+), 66 deletions(-) diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index 93d8ab2..b0acaf3 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -236,13 +236,20 @@ <br/> By default this is specified in bytes, but an optional <code>unit</code> can be specified to adjust the passed value. - Values can be: 'K' (kibibytes, 2<sup>10</sup> or 1024), 'M' - (mebibytes, 2<sup>20</sup> or 1,048,576), 'G' (gibibytes, - 2<sup>30</sup> or 1,073,741,824), 'T' (tebibytes, - 2<sup>40</sup> or 1,099,511,627,776), 'P' (pebibytes, - 2<sup>50</sup> or 1,125,899,906,842,624), or 'E' (exbibytes, - 2<sup>60</sup> or 1,152,921,504,606,846,976). -<span class="since">Since 0.4.1</span></dd> + Values can be: 'B' or 'bytes' for bytes, 'KB' (kilobytes, + 10<sup>3</sup> or 1000), 'K' or 'KiB' (kibibytes, + 2<sup>10</sup> or 1024), 'MB' (megabytes, 10<sup>6</sup> or + 1,000,000), 'M' or 'MiB' (mebibytes, 2<sup>20</sup> or + 1,048,576), 'GB' (gigabytes, 10<sup>9</sup> or 1,000,000,000), + 'G' or 'GiB' (gibibytes, 2<sup>30</sup> or 1,073,741,824),
As Christophe pointed out on 01/15, it would probably be better to state that the numbers are in bytes.
+ 'TB' (terabytes, 10<sup>12</sup> or 1,000,000,000,000), 'T' or + 'TiB' (tebibytes, 2<sup>40</sup> or 1,099,511,627,776), 'PB' + (petabytes, 10<sup>15</sup> or 1,000,000,000,000,000), 'P' or + 'PiB' (pebibytes, 2<sup>50</sup> or 1,125,899,906,842,624), + 'EB' (exabytes, 10<sup>18</sup> or 1,000,000,000,000,000,000), + or 'E' or 'EiB' (exbibytes, 2<sup>60</sup> or + 1,152,921,504,606,846,976).<span class="since">Since 0.4.1, + multi-character<code>unit</code> since 0.9.11</span></dd> <dt><code>capacity</code></dt> <dd>Providing the logical capacity for the volume. This value is in bytes by default, but a<code>unit</code> attribute can be diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index a50349c..cc0bc12 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -140,7 +140,7 @@ <define name='unit'> <data type='string'> -<param name='pattern'>(bytes)|[kKmMgGtTpPeE]</param> +<param name='pattern'>([bB]([yY][tT][eE][sS]?)?)|([kKmMgGtTpPeE]([iI]?[bB])?)</param>
This makes the comment from the last patch obsolete.
</data> </define> <define name='scaledInteger'>
ACK, Peter -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list