sub lvm_list_volumes {
my ($vgname) = @_;
- my $cmd = ['/sbin/lvs', '--separator', ':', '--noheadings', '--units', 'b',
- '--unbuffered', '--nosuffix', '--options',
- 'vg_name,lv_name,lv_size,lv_attr,pool_lv,data_percent,metadata_percent,snap_percent,uuid,tags,metadata_size'];
+ my $option_list = 'vg_name,lv_name,lv_size,lv_attr,pool_lv,data_percent,metadata_percent,snap_percent,uuid,tags,metadata_size,time';
+
+ my $cmd = [
+ '/sbin/lvs', '--separator', ':', '--noheadings', '--units', 'b',
+ '--unbuffered', '--nosuffix',
+ '--config', 'report/time_format="%s"',
+ '--options', $option_list,
+ ];
push @$cmd, $vgname if $vgname;
$line = trim($line);
- my ($vg_name, $lv_name, $lv_size, $lv_attr, $pool_lv, $data_percent, $meta_percent, $snap_percent, $uuid, $tags, $meta_size) = split(':', $line);
+ my ($vg_name, $lv_name, $lv_size, $lv_attr, $pool_lv, $data_percent, $meta_percent, $snap_percent, $uuid, $tags, $meta_size, $ctime) = split(':', $line);
return if !$vg_name;
return if !$lv_name;
};
$d->{pool_lv} = $pool_lv if $pool_lv;
$d->{tags} = $tags if $tags;
+ $d->{ctime} = $ctime;
if ($lv_type eq 't') {
$data_percent ||= 0;
lvm_create_volume_group($path, $scfg->{vgname}, $scfg->{shared});
}
+
+ return;
}
sub parse_volname {
push @$res, {
volid => $volid, format => 'raw', size => $info->{lv_size}, vmid => $owner,
+ ctime => $info->{ctime},
};
}
}
}
sub volume_import {
- my ($class, $scfg, $storeid, $fh, $volname, $format, $base_snapshot, $with_snapshots) = @_;
+ my ($class, $scfg, $storeid, $fh, $volname, $format, $base_snapshot, $with_snapshots, $allow_rename) = @_;
die "volume import format $format not available for $class\n"
if $format ne 'raw+size';
die "cannot import volumes together with their snapshots in $class\n"
my $vg = $scfg->{vgname};
my $lvs = lvm_list_volumes($vg);
- die "volume $vg/$volname already exists\n"
- if $lvs->{$vg}->{$volname};
+ if ($lvs->{$vg}->{$volname}) {
+ die "volume $vg/$volname already exists\n" if !$allow_rename;
+ warn "volume $vg/$volname already exists - importing with a different name\n";
+ $name = undef;
+ }
my ($size) = PVE::Storage::Plugin::read_common_header($fh);
$size = int($size/1024);
eval {
my $allocname = $class->alloc_image($storeid, $scfg, $vmid, 'raw', $name, $size);
- if ($allocname ne $volname) {
- my $oldname = $volname;
- $volname = $allocname; # Let the cleanup code know what to free
+ my $oldname = $volname;
+ $volname = $allocname;
+ if (defined($name) && $allocname ne $oldname) {
die "internal error: unexpected allocated name: '$allocname' != '$oldname'\n";
}
my $file = $class->path($scfg, $volname, $storeid)
warn $@ if $@;
die $err;
}
+
+ return "$storeid:$volname";
}
sub volume_import_write {