[pve-devel] applied: [PATCH container] fix #1808: readonly mount source disk

Wolfgang Bumiller w.bumiller at proxmox.com
Fri Nov 9 14:13:27 CET 2018


applied,

Currently the code calling this is protected by a config lock, so it
should be safe. But we should also update query_loopdev() to not attempt
to reuse a read-only loop device when we want a read-write one, or only
pass the ro flag when we're cloning from an actual template.

On Tue, Oct 30, 2018 at 01:06:38PM +0100, David Limbeck wrote:
> 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 <d.limbeck at proxmox.com>
> ---
>  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.11.0




More information about the pve-devel mailing list