diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index acb21faa81..d0e4319c50 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -236,13 +236,22 @@
By default this is specified in bytes, but an optional attribute unit can be specified to adjust the passed value. - Values can be: 'K' (kibibytes, 210 or 1024 bytes), - 'M' (mebibytes, 220 or 1,048,576 bytes), 'G' - (gibibytes, 230 or 1,073,741,824 bytes), 'T' - (tebibytes, 240 or 1,099,511,627,776 bytes), 'P' - (pebibytes, 250 or 1,125,899,906,842,624 bytes), or - 'E' (exbibytes, 260 or 1,152,921,504,606,846,976 - bytes). Since 0.4.1 + Values can be: 'B' or 'bytes' for bytes, 'KB' (kilobytes, + 103 or 1000 bytes), 'K' or 'KiB' (kibibytes, + 210 or 1024 bytes), 'MB' (megabytes, 106 + or 1,000,000 bytes), 'M' or 'MiB' (mebibytes, 220 + or 1,048,576 bytes), 'GB' (gigabytes, 109 or + 1,000,000,000 bytes), 'G' or 'GiB' (gibibytes, 230 + or 1,073,741,824 bytes), 'TB' (terabytes, 1012 or + 1,000,000,000,000 bytes), 'T' or 'TiB' (tebibytes, + 240 or 1,099,511,627,776 bytes), 'PB' (petabytes, + 1015 or 1,000,000,000,000,000 bytes), 'P' or 'PiB' + (pebibytes, 250 or 1,125,899,906,842,624 bytes), + 'EB' (exabytes, 1018 or 1,000,000,000,000,000,000 + bytes), or 'E' or 'EiB' (exbibytes, 260 or + 1,152,921,504,606,846,976 bytes). Since + 0.4.1, multi-character unit since + 0.9.11
capacity
Providing the logical capacity for the volume. This value is in bytes by default, but a unit attribute can be diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index a50349c602..cc0bc1286d 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -140,7 +140,7 @@ - (bytes)|[kKmMgGtTpPeE] + ([bB]([yY][tT][eE][sS]?)?)|([kKmMgGtTpPeE]([iI]?[bB])?) diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 07f3f5b6dc..bdf62184c4 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -944,64 +944,17 @@ virStoragePoolDefFormat(virStoragePoolDefPtr def) { static int virStorageSize(const char *unit, const char *val, - unsigned long long *ret) { - unsigned long long mult; - char *end; - - if (!unit) { - mult = 1; - } else { - switch (unit[0]) { - case 'k': - case 'K': - mult = 1024ull; - break; - - case 'm': - case 'M': - mult = 1024ull * 1024ull; - break; - - case 'g': - case 'G': - mult = 1024ull * 1024ull * 1024ull; - break; - - case 't': - case 'T': - mult = 1024ull * 1024ull * 1024ull * 1024ull; - break; - - case 'p': - case 'P': - mult = 1024ull * 1024ull * 1024ull * 1024ull * 1024ull; - break; - - case 'e': - case 'E': - mult = 1024ull * 1024ull * 1024ull * 1024ull * 1024ull * - 1024ull; - break; - - default: - virStorageReportError(VIR_ERR_XML_ERROR, - _("unknown size units '%s'"), unit); - return -1; - } - } - - if (virStrToLong_ull (val, &end, 10, ret) < 0) { + unsigned long long *ret) +{ + if (virStrToLong_ull(val, NULL, 10, ret) < 0) { virStorageReportError(VIR_ERR_XML_ERROR, "%s", _("malformed capacity element")); return -1; } - if (*ret > (ULLONG_MAX / mult)) { - virStorageReportError(VIR_ERR_XML_ERROR, - "%s", _("capacity element value too large")); - return -1; - } - - *ret *= mult; + /* off_t is signed, so you cannot create a file larger than 2**63 + * bytes in the first place. */ + if (virScaleInteger(ret, unit, 1, LLONG_MAX) < 0) + return -1; return 0; } diff --git a/tests/storagevolxml2xmlin/vol-file-backing.xml b/tests/storagevolxml2xmlin/vol-file-backing.xml index c1a5837c6a..d23349e658 100644 --- a/tests/storagevolxml2xmlin/vol-file-backing.xml +++ b/tests/storagevolxml2xmlin/vol-file-backing.xml @@ -1,8 +1,8 @@ sparse.img - 10000000000 - 0 + 10 + 0 /var/lib/libvirt/images/sparse.img diff --git a/tests/storagevolxml2xmlin/vol-file.xml b/tests/storagevolxml2xmlin/vol-file.xml index d7de0aa23c..fdca510101 100644 --- a/tests/storagevolxml2xmlin/vol-file.xml +++ b/tests/storagevolxml2xmlin/vol-file.xml @@ -1,8 +1,8 @@ sparse.img - 1 - 0 + 1 + 0 /var/lib/libvirt/images/sparse.img