Fix #2050: only provide 'conv=sparse' for LvmThin
LVMPlugin->volume_import (used by storage_migrate on either offline migration with local disks, or online migration with storage-only referenced disks) passed 'conv=sparse' to `dd`. This can lead to data-corruption, if the target volume is not zero-initialized. dropping the sparse argument completely would fix the problem, but breaks keeping data sparse for LvmThinPlugin. This patch moves the dd out into (LVM*) plugin specific sub so that each can control the parameters. Steps for reproducing the issue: * create a cluster with (at least) 2 nodes A and B, with a free disk-device (/dev/sdx) * write a recognizable pattern to /dev/sdx on B: `dd if=/dev/zero bs=10M | tr '\000' '\255' | dd of=/dev/sdb bs=10M` (would be grateful for alternatives to the dd| tr| dd) * on both A and B create a lvm-vg (pvcreate, vgcreate) * add it as _not_ shared storage, which is available on nodes A and B * create a small guest on A * fill a file in the guest with zeros `dd if=/dev/zero of=/zerofil bs=10M` * stop the guest, migrate it to B * start the guest - check that the file `/zerofil` contains `ad` instead of `00` Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
committed by
Thomas Lamprecht
parent
a31cb84fd4
commit
4e8de9ad56
@ -620,8 +620,8 @@ sub volume_import {
|
||||
}
|
||||
my $file = $class->path($scfg, $volname, $storeid)
|
||||
or die "internal error: failed to get path to newly allocated volume $volname\n";
|
||||
run_command(['dd', "of=$file", 'conv=sparse', 'bs=64k'],
|
||||
input => '<&'.fileno($fh));
|
||||
|
||||
$class->volume_import_write($fh, $file);
|
||||
};
|
||||
if (my $err = $@) {
|
||||
eval { $class->free_image($storeid, $scfg, $volname, 0) };
|
||||
@ -630,4 +630,10 @@ sub volume_import {
|
||||
}
|
||||
}
|
||||
|
||||
sub volume_import_write {
|
||||
my ($class, $input_fh, $output_file) = @_;
|
||||
run_command(['dd', "of=$output_file", 'bs=64k'],
|
||||
input => '<&'.fileno($input_fh));
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
@ -374,4 +374,11 @@ sub volume_has_feature {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# used in LVMPlugin->volume_import
|
||||
sub volume_import_write {
|
||||
my ($class, $input_fh, $output_file) = @_;
|
||||
run_command(['dd', "of=$output_file", 'conv=sparse', 'bs=64k'],
|
||||
input => '<&'.fileno($input_fh));
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
Reference in New Issue
Block a user