aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-03-31 12:24:55 +0100
committerKeir Fraser <keir@xensource.com>2007-03-31 12:24:55 +0100
commitf5db79b2946413bba1eb0c776ce03e4879f3fb67 (patch)
tree71e1f27f75d4ee5e1480b72f89a010065bdebac0 /tools/blktap
parentee4af65156102290fac71db0a9c300459cff0a1c (diff)
downloadxen-f5db79b2946413bba1eb0c776ce03e4879f3fb67.tar.gz
xen-f5db79b2946413bba1eb0c776ce03e4879f3fb67.tar.bz2
xen-f5db79b2946413bba1eb0c776ce03e4879f3fb67.zip
blktap: Fix qcow2raw.
qcow2raw would hang the conversion just short of 100%, because the final write queue was never being submitted. If a blktap drivers read synchronously, then "submit_events" and "complete" variables are checked before getting set, so the fact that reads have finished is not noticed, so the final write queue was never submitted. Note that I have also removed the variables write_complete and read_complete. They were unused, and they were also not set correctly in the synchronous case. Signed-off-by: Charles Coffing <ccoffing@novell.com>
Diffstat (limited to 'tools/blktap')
-rw-r--r--tools/blktap/drivers/qcow2raw.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/tools/blktap/drivers/qcow2raw.c b/tools/blktap/drivers/qcow2raw.c
index 55ae4ad108..cbfe55b8e3 100644
--- a/tools/blktap/drivers/qcow2raw.c
+++ b/tools/blktap/drivers/qcow2raw.c
@@ -51,7 +51,6 @@
#define BLOCK_PROCESSSZ 4096
static int maxfds, *qcowio_fd, *aio_fd, running = 1, complete = 0;
-static int read_complete = 0, write_complete = 0;
static int returned_read_events = 0, returned_write_events = 0;
static int submit_events = 0;
static uint32_t read_idx = 0, write_idx = 0;
@@ -109,8 +108,6 @@ static int send_write_responses(struct disk_driver *dd, int res, uint64_t sec,
written += BLOCK_PROCESSSZ;
returned_write_events++;
write_idx = idx;
- if (complete && (returned_write_events == submit_events))
- write_complete = 1;
debug_output(written, dd->td_state->size << 9);
free(private);
@@ -126,8 +123,6 @@ static int send_read_responses(struct disk_driver *dd, int res, uint64_t sec,
returned_read_events++;
read_idx = idx;
- if (complete && (returned_read_events == submit_events))
- read_complete = 1;
ret = ddaio.drv->td_queue_write(&ddaio, idx, BLOCK_PROCESSSZ>>9, private,
send_write_responses, idx, private);
@@ -136,7 +131,7 @@ static int send_read_responses(struct disk_driver *dd, int res, uint64_t sec,
return 0;
}
- if ( (complete && returned_read_events == submit_events) ||
+ if ( (returned_read_events == submit_events) ||
(returned_read_events % 10 == 0) ) {
ddaio.drv->td_submit(&ddaio);
}
@@ -299,6 +294,7 @@ int main(int argc, char *argv[])
}
/*Attempt to read 4k sized blocks*/
+ submit_events++;
ret = ddqcow.drv->td_queue_read(&ddqcow, i>>9,
BLOCK_PROCESSSZ>>9, buf,
send_read_responses, i>>9, buf);
@@ -309,7 +305,6 @@ int main(int argc, char *argv[])
exit(-1);
} else {
i += BLOCK_PROCESSSZ;
- submit_events++;
}
if (i >= ddqcow.td_state->size<<9) {