From 6f68b713ee58bee00f087f64b57aa96fa1585bff Mon Sep 17 00:00:00 2001 From: Axel Burri Date: Mon, 4 Mar 2019 16:05:38 +0100 Subject: [PATCH] btrbk: fix scheduler when overriding "target_preserve_min" in combination with global "target" section When configuring "target" in a global (or "volume") context, and overriding target_preserve_min in "subvolume" section, the scheduler has undefined behavior (mixing up the "min" values). Fixed by returning a copy of the preserve hash in config_preserve_hash(). --- btrbk | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/btrbk b/btrbk index b4acb95..e3f96da 100755 --- a/btrbk +++ b/btrbk @@ -3216,22 +3216,24 @@ sub config_preserve_hash($$;@) if($opts{wipe}) { return { hod => 0, dow => 'sunday', min => 'latest', min_q => 'latest' }; } - my $ret = config_key($config, $prefix . "_preserve") // {}; + my $preserve = config_key($config, $prefix . "_preserve") // {}; + my %ret = ( %$preserve, # make a copy (don't pollute config) + hod => config_key($config, "preserve_hour_of_day"), + dow => config_key($config, "preserve_day_of_week") + ); my $preserve_min = config_key($config, $prefix . "_preserve_min"); if(defined($preserve_min)) { - $ret->{min} = $preserve_min; # used for raw schedule output + $ret{min} = $preserve_min; # used for raw schedule output if(($preserve_min eq 'all') || ($preserve_min eq 'latest')) { - $ret->{min_q} = $preserve_min; + $ret{min_q} = $preserve_min; } elsif($preserve_min =~ /^([0-9]+)([hdwmy])$/) { - $ret->{min_n} = $1; - $ret->{min_q} = $2; + $ret{min_n} = $1; + $ret{min_q} = $2; } else { die; } } - $ret->{hod} = config_key($config, "preserve_hour_of_day"); - $ret->{dow} = config_key($config, "preserve_day_of_week"); - return $ret; + return \%ret; }