Hello The bug: sameas:disk1 works, sameas:sda does not Proposed patches and sample config attached to mail.
Output for sameas:disk1 # cat /var/lib/fai/config/disk_config/SAMEAS_DISK1 disk_config disk1 disklabel:msdos align-at:4k primary - 1G-50% - - primary - 1G-50% - - disk_config disk2 sameas:disk1 # setup-storage -X -f /var/lib/fai/config/disk_config/SAMEAS_DISK1 Starting setup-storage 1.5 Using config file: /var/lib/fai/config/disk_config/SAMEAS_DISK1 Executing: wipefs -a /dev/sdb1 Executing: wipefs -a /dev/sdb2 Executing: parted -s /dev/sdb mklabel msdos Executing: parted -s /dev/sdb mkpart primary "" 1048576B 107374706687B Executing: parted -s /dev/sdb mkpart primary "" 107374706688B 214748364799B Executing: wipefs -a /dev/sda1 Executing: wipefs -a /dev/sda2 Executing: parted -s /dev/sda mklabel msdos Executing: parted -s /dev/sda mkpart primary "" 1048576B 107374706687B Executing: parted -s /dev/sda mkpart primary "" 107374706688B 214748364799B Output for sameas:sda # cat /var/lib/fai/config/disk_config/SAMEAS_SDA disk_config sda disklabel:msdos align-at:4k primary - 1G-50% - - primary - 1G-50% - - disk_config sdb sameas:sda # setup-storage -X -f /var/lib/fai/config/disk_config/SAMEAS_SDA Starting setup-storage 1.5 Using config file: /var/lib/fai/config/disk_config/SAMEAS_SDA Undefined subroutine &Storable::clone called at (eval 93) line 3547, <$config_file> line 1. The only change is replacing 'disk1' with 'sda'. 'patch2_fix' is the actual fix. (replace call to clone with dclone), patch1_indentation fixes the indentation of Parser.pm (replace all leading tabs with spaces, since that's the intended style.), patch3_rewrite get's rid of the distinction between 'sameas:disk(\d+)' and sameas:(\S+) and changes the code into something I consider to be an improvement. YMMV. Result after patching: # setup-storage -X -f /var/lib/fai/config/disk_config/SAMEAS_SDA Starting setup-storage 1.5 Using config file: /var/lib/fai/config/disk_config/SAMEAS_SDA Executing: wipefs -a /dev/sdb1 Executing: wipefs -a /dev/sdb2 Executing: parted -s /dev/sdb mklabel msdos Executing: parted -s /dev/sdb mkpart primary "" 1048576B 107374706687B Executing: parted -s /dev/sdb mkpart primary "" 107374706688B 214748364799B Executing: wipefs -a /dev/sda1 Executing: wipefs -a /dev/sda2 Executing: parted -s /dev/sda mklabel msdos Executing: parted -s /dev/sda mkpart primary "" 1048576B 107374706687B Executing: parted -s /dev/sda mkpart primary "" 107374706688B 214748364799B # setup-storage -X -f /var/lib/fai/config/disk_config/SAMEAS_DISK1 Starting setup-storage 1.5 Using config file: /var/lib/fai/config/disk_config/SAMEAS_DISK1 Executing: wipefs -a /dev/sdb1 Executing: wipefs -a /dev/sdb2 Executing: parted -s /dev/sdb mklabel msdos Executing: parted -s /dev/sdb mkpart primary "" 1048576B 107374706687B Executing: parted -s /dev/sdb mkpart primary "" 107374706688B 214748364799B Executing: wipefs -a /dev/sda1 Executing: wipefs -a /dev/sda2 Executing: parted -s /dev/sda mklabel msdos Executing: parted -s /dev/sda mkpart primary "" 1048576B 107374706687B Executing: parted -s /dev/sda mkpart primary "" 107374706688B 214748364799B
diff -Nur vanilla/usr/share/fai/setup-storage/Parser.pm parser1/usr/share/fai/setup-storage/Parser.pm --- vanilla/usr/share/fai/setup-storage/Parser.pm 2014-06-03 10:55:00.000000000 +0200 +++ parser1/usr/share/fai/setup-storage/Parser.pm 2014-06-24 14:31:08.928367921 +0200 @@ -686,44 +686,44 @@ # the information preferred for fstab device identifieres $FAI::configs{$FAI::device}{fstabkey} = $1; } - | /^sameas:disk(\d+)/ - { - my $ref_dev = &FAI::resolve_disk_shortname($1); - defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; + | /^sameas:disk(\d+)/ + { + my $ref_dev = &FAI::resolve_disk_shortname($1); + defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; - $FAI::configs{$FAI::device} = Storable::dclone($FAI::configs{"PHY_" . $ref_dev}); - # add entries to device tree - defined($FAI::dev_children{$ref_dev}) or - &FAI::internal_error("dev_children missing reference entry"); - ($FAI::device =~ /^PHY_(.+)$/) or - &FAI::internal_error("unexpected device name"); - my $disk = $1; - foreach my $p (@{ $FAI::dev_children{$ref_dev} }) { - my ($i_p_d, $rd, $pd) = &FAI::phys_dev($p); - (1 == $i_p_d) or next; - ($rd eq $ref_dev) or &FAI::internal_error("dev_children is inconsistent"); - push @{ $FAI::dev_children{$disk} }, &FAI::make_device_name($disk, $pd); - } - } - | /^sameas:(\S+)/ - { - my $ref_dev = &FAI::resolve_disk_shortname($1); - defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; + $FAI::configs{$FAI::device} = Storable::dclone($FAI::configs{"PHY_" . $ref_dev}); + # add entries to device tree + defined($FAI::dev_children{$ref_dev}) or + &FAI::internal_error("dev_children missing reference entry"); + ($FAI::device =~ /^PHY_(.+)$/) or + &FAI::internal_error("unexpected device name"); + my $disk = $1; + foreach my $p (@{ $FAI::dev_children{$ref_dev} }) { + my ($i_p_d, $rd, $pd) = &FAI::phys_dev($p); + (1 == $i_p_d) or next; + ($rd eq $ref_dev) or &FAI::internal_error("dev_children is inconsistent"); + push @{ $FAI::dev_children{$disk} }, &FAI::make_device_name($disk, $pd); + } + } + | /^sameas:(\S+)/ + { + my $ref_dev = &FAI::resolve_disk_shortname($1); + defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; - $FAI::configs{$FAI::device} = Storable::clone($FAI::configs{"PHY_" . $ref_dev}); - # add entries to device tree - defined($FAI::dev_children{$ref_dev}) or - &FAI::internal_error("dev_children missing reference entry"); - ($FAI::device =~ /^PHY_(.+)$/) or - &FAI::internal_error("unexpected device name"); - my $disk = $1; - foreach my $p (@{ $FAI::dev_children{$ref_dev} }) { - my ($i_p_d, $rd, $pd) = &FAI::phys_dev($p); - (1 == $i_p_d) or next; - ($rd eq $ref_dev) or &FAI::internal_error("dev_children is inconsistent"); - push @{ $FAI::dev_children{$disk} }, &FAI::make_device_name($disk, $pd); - } - } + $FAI::configs{$FAI::device} = Storable::clone($FAI::configs{"PHY_" . $ref_dev}); + # add entries to device tree + defined($FAI::dev_children{$ref_dev}) or + &FAI::internal_error("dev_children missing reference entry"); + ($FAI::device =~ /^PHY_(.+)$/) or + &FAI::internal_error("unexpected device name"); + my $disk = $1; + foreach my $p (@{ $FAI::dev_children{$ref_dev} }) { + my ($i_p_d, $rd, $pd) = &FAI::phys_dev($p); + (1 == $i_p_d) or next; + ($rd eq $ref_dev) or &FAI::internal_error("dev_children is inconsistent"); + push @{ $FAI::dev_children{$disk} }, &FAI::make_device_name($disk, $pd); + } + } | /^always_format:((\d+(,\d+)*)|all)/ { if ($1 eq "all") {
diff -Nur parser1/usr/share/fai/setup-storage/Parser.pm parser2/usr/share/fai/setup-storage/Parser.pm --- parser1/usr/share/fai/setup-storage/Parser.pm 2014-06-24 14:31:08.928367921 +0200 +++ parser2/usr/share/fai/setup-storage/Parser.pm 2014-06-24 14:33:29.849749209 +0200 @@ -710,7 +710,7 @@ my $ref_dev = &FAI::resolve_disk_shortname($1); defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; - $FAI::configs{$FAI::device} = Storable::clone($FAI::configs{"PHY_" . $ref_dev}); + $FAI::configs{$FAI::device} = Storable::dclone($FAI::configs{"PHY_" . $ref_dev}); # add entries to device tree defined($FAI::dev_children{$ref_dev}) or &FAI::internal_error("dev_children missing reference entry");
disk_config disk1 disklabel:msdos align-at:4k primary - 1G-50% - - primary - 1G-50% - - disk_config disk2 sameas:disk1
disk_config sda disklabel:msdos align-at:4k primary - 1G-50% - - primary - 1G-50% - - disk_config sdb sameas:sda
diff -Nur parser2/usr/share/fai/setup-storage/Parser.pm parser3/usr/share/fai/setup-storage/Parser.pm --- parser2/usr/share/fai/setup-storage/Parser.pm 2014-06-24 14:33:29.849749209 +0200 +++ parser3/usr/share/fai/setup-storage/Parser.pm 2014-06-24 15:10:41.000000000 +0200 @@ -686,43 +686,38 @@ # the information preferred for fstab device identifieres $FAI::configs{$FAI::device}{fstabkey} = $1; } - | /^sameas:disk(\d+)/ - { - my $ref_dev = &FAI::resolve_disk_shortname($1); - defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; - - $FAI::configs{$FAI::device} = Storable::dclone($FAI::configs{"PHY_" . $ref_dev}); - # add entries to device tree - defined($FAI::dev_children{$ref_dev}) or - &FAI::internal_error("dev_children missing reference entry"); - ($FAI::device =~ /^PHY_(.+)$/) or - &FAI::internal_error("unexpected device name"); - my $disk = $1; - foreach my $p (@{ $FAI::dev_children{$ref_dev} }) { - my ($i_p_d, $rd, $pd) = &FAI::phys_dev($p); - (1 == $i_p_d) or next; - ($rd eq $ref_dev) or &FAI::internal_error("dev_children is inconsistent"); - push @{ $FAI::dev_children{$disk} }, &FAI::make_device_name($disk, $pd); - } - } | /^sameas:(\S+)/ { - my $ref_dev = &FAI::resolve_disk_shortname($1); - defined($FAI::configs{"PHY_" . $ref_dev}) or die "Reference device $ref_dev not found in config\n"; + my $ref_name = $1; # disk1, sda + my $ref_id = $ref_name; $ref_id =~ s/^disk//; # 1 sda + my $ref_dev = &FAI::resolve_disk_shortname($ref_id); # /dev/sda + my $ref_tag = "PHY_" . $ref_dev; # PHY_/dev/sda + + defined $FAI::configs{$ref_tag } + or die "Reference device $ref_dev not found in config\n"; + + $FAI::configs{$FAI::device} = Storable::dclone($FAI::configs{$ref_tag }); - $FAI::configs{$FAI::device} = Storable::dclone($FAI::configs{"PHY_" . $ref_dev}); - # add entries to device tree - defined($FAI::dev_children{$ref_dev}) or - &FAI::internal_error("dev_children missing reference entry"); - ($FAI::device =~ /^PHY_(.+)$/) or - &FAI::internal_error("unexpected device name"); - my $disk = $1; + # add entries to device tree + defined $FAI::dev_children{$ref_dev} + or FAI::internal_error("dev_children missing reference entry"); + if ($FAI::device =~ /^PHY_(.+)$/) { + my $tgt_dev = $1; # /dev/sdb foreach my $p (@{ $FAI::dev_children{$ref_dev} }) { - my ($i_p_d, $rd, $pd) = &FAI::phys_dev($p); - (1 == $i_p_d) or next; - ($rd eq $ref_dev) or &FAI::internal_error("dev_children is inconsistent"); - push @{ $FAI::dev_children{$disk} }, &FAI::make_device_name($disk, $pd); + my ($i_p_d, $rd, $pd) = FAI::phys_dev($p); + if (1 == $i_p_d) { + if ($rd eq $ref_dev) { + push @{ $FAI::dev_children{$tgt_dev} }, FAI::make_device_name($tgt_dev, $pd); + } + else { + FAI::internal_error("dev_children is inconsistent"); + } + } } + } + else { + FAI::internal_error("unexpected device name"); + } } | /^always_format:((\d+(,\d+)*)|all)/ {