From fd8cab92ddcfab51b00c6e6547476d875182fc83 Mon Sep 17 00:00:00 2001 From: David Limbeck Date: Tue, 30 Oct 2018 13:06:38 +0100 Subject: [PATCH] fix #1808: readonly mount source disk Always readonly mount the source disk so a full clone still works with an immutable base disk. Applies to every disk copy. Signed-off-by: David Limbeck --- src/PVE/LXC.pm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm index 0f2aa5c..1e47faf 100644 --- a/src/PVE/LXC.pm +++ b/src/PVE/LXC.pm @@ -1200,7 +1200,7 @@ sub query_loopdev { # The loop device is always detached afterwards (or set to autoclear). # Returns the loop device. sub run_with_loopdev { - my ($func, $file) = @_; + my ($func, $file, $readonly) = @_; my $device = query_loopdev($file); # Try to reuse an existing device if ($device) { @@ -1216,7 +1216,14 @@ sub run_with_loopdev { $device = $1; } }; - PVE::Tools::run_command(['losetup', '--show', '-f', $file], outfunc => $parser); + my $losetup_cmd = [ + 'losetup', + '--show', + '-f', + $file, + ]; + push @$losetup_cmd, '-r' if $readonly; + PVE::Tools::run_command($losetup_cmd, outfunc => $parser); die "failed to setup loop device for $file\n" if !$device; eval { &$func($device); }; my $err = $@; @@ -1462,7 +1469,7 @@ sub mountpoint_mount { }; my $use_loopdev = 0; if ($scfg->{path}) { - $mounted_dev = run_with_loopdev($domount, $path); + $mounted_dev = run_with_loopdev($domount, $path, $readonly); $use_loopdev = 1; } elsif ($scfg->{type} eq 'drbd' || $scfg->{type} eq 'lvm' || $scfg->{type} eq 'rbd' || $scfg->{type} eq 'lvmthin') { @@ -1825,10 +1832,10 @@ sub run_unshared { my $copy_volume = sub { my ($src_volid, $src, $dst_volid, $dest, $storage_cfg, $snapname) = @_; - my $src_mp = { volume => $src_volid, mp => '/' }; + my $src_mp = { volume => $src_volid, mp => '/', ro => 1 }; $src_mp->{type} = PVE::LXC::Config->classify_mountpoint($src_volid); - my $dst_mp = { volume => $dst_volid, mp => '/' }; + my $dst_mp = { volume => $dst_volid, mp => '/', ro => 0 }; $dst_mp->{type} = PVE::LXC::Config->classify_mountpoint($dst_volid); my @mounted; -- 2.39.2