summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Wolf2009-07-20 16:48:43 +0200
committerAnthony Liguori2009-07-22 17:58:47 +0200
commita7824a886ed50eb4fe3c6fcd6afd8814a6973583 (patch)
treeca62f5be8f6e47a181bc27ad9555941472f9b914
parentqmu-img: fix qemu-img convert to generate a valid image when the source refer... (diff)
downloadqemu-a7824a886ed50eb4fe3c6fcd6afd8814a6973583.tar.gz
qemu-a7824a886ed50eb4fe3c6fcd6afd8814a6973583.tar.xz
qemu-a7824a886ed50eb4fe3c6fcd6afd8814a6973583.zip
qemu-io: Rework alloc command
The alloc command in qemu-io is mostly useless currently. Instead of doing a single call to bdrv_is_allocated, we must call bdrv_is_allocated in a loop until we have found out for each requested sector if it is allocated or not (bdrv_is_allocated returns a number of sectors that are known to be in the same state as the first one, but it is not required to include all of them) This changes the output format of the alloc command so that a change to the expected output of qemu-iotests 019 is necessary once this is included. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--qemu-io.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/qemu-io.c b/qemu-io.c
index 6c35a071c4..f9385751d2 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -1170,11 +1170,10 @@ static int
alloc_f(int argc, char **argv)
{
int64_t offset;
- int nb_sectors;
+ int nb_sectors, remaining;
char s1[64];
- int num;
+ int num, sum_alloc;
int ret;
- const char *retstr;
offset = cvtnum(argv[1]);
if (offset & 0x1ff) {
@@ -1188,16 +1187,23 @@ alloc_f(int argc, char **argv)
else
nb_sectors = 1;
- ret = bdrv_is_allocated(bs, offset >> 9, nb_sectors, &num);
+ remaining = nb_sectors;
+ sum_alloc = 0;
+ while (remaining) {
+ ret = bdrv_is_allocated(bs, offset >> 9, nb_sectors, &num);
+ remaining -= num;
+ if (ret) {
+ sum_alloc += num;
+ }
+ }
cvtstr(offset, s1, sizeof(s1));
- retstr = ret ? "allocated" : "not allocated";
if (nb_sectors == 1)
- printf("sector %s at offset %s\n", retstr, s1);
+ printf("sector allocated at offset %s\n", s1);
else
- printf("%d/%d sectors %s at offset %s\n",
- num, nb_sectors, retstr, s1);
+ printf("%d/%d sectors allocated at offset %s\n",
+ sum_alloc, nb_sectors, s1);
return 0;
}