
On Thu, Jun 10, 2010 at 05:03:10AM -0600, Eric Blake wrote:
On 06/10/2010 04:16 AM, Daniel P. Berrange wrote:
- if (virAsprintf(&dest, "exec:%s | dd of=%s bs=%llu seek=%llu", - argstr, safe_target, - QEMU_MONITOR_MIGRATE_TO_FILE_BS, - offset / QEMU_MONITOR_MIGRATE_TO_FILE_BS) < 0) { + /* Two dd processes, sharing the same stdout, are necessary to + * allow starting at an alignment of 512, but without wasting + * padding to get to the larger alignment useful for speed. */ + if (virAsprintf(&dest, "exec:%s | { dd bs=%llu seek=%llu if=/dev/null && " + "dd bs=%llu; } >%s",
Does this work with block devices as the target ? We previously switched from cat>> to dd, because it didn't work correctly with block devs.
Yes - the problem with >>dev was that it appended (which doesn't make sense for a block device); while >dev opens a seekable fd. One difference between 'dd >file' and 'dd of=file' is which process opens the device; but to share the fd between two dd invocations, we have to open the file in the shell rather than with of=file. The other difference is that >file truncates; for block devices, truncation is a no-op, but for regular files, this wipes out any pre-existing contents (such as the header we are skipping over) - is that an issue? If so, then we should use <>file instead of >file, to open a read-write fd without forcing truncation (even if we only use the fd for writing).
Yes, we need to avoid truncation - the seek is there to skip over the metadata header, so we can't truncate that Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|