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)/
         {

Reply via email to