diff options
author | Keir Fraser <keir@xensource.com> | 2007-03-31 12:24:55 +0100 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-03-31 12:24:55 +0100 |
commit | f5db79b2946413bba1eb0c776ce03e4879f3fb67 (patch) | |
tree | 71e1f27f75d4ee5e1480b72f89a010065bdebac0 /tools/blktap | |
parent | ee4af65156102290fac71db0a9c300459cff0a1c (diff) | |
download | xen-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.c | 9 |
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) { |