[kernel] r15347 - in dists/trunk/linux-2.6/debian: . templates

Ben Hutchings benh at alioth.debian.org
Wed Mar 10 03:57:53 UTC 2010


Author: benh
Date: Wed Mar 10 03:57:49 2010
New Revision: 15347

Log:
linux-base: For consistency with fresh installations, use or assign UUIDs rather than labels where both are available (Closes: #572376)

Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/linux-base.postinst
   dists/trunk/linux-2.6/debian/linux-base.templates
   dists/trunk/linux-2.6/debian/templates/control.main.in

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	Wed Mar 10 01:06:40 2010	(r15346)
+++ dists/trunk/linux-2.6/debian/changelog	Wed Mar 10 03:57:49 2010	(r15347)
@@ -11,6 +11,8 @@
     of unknown filesystem type (Closes: #572341, #572445)
   * linux-base: Don't accept empty filesystem labels as identifiers
     (Closes: #572438)
+  * linux-base: For consistency with fresh installations, use or assign
+    UUIDs rather than labels where both are available (Closes: #572376)
 
  -- Ben Hutchings <ben at decadent.org.uk>  Sun, 28 Feb 2010 17:01:33 +0000
 

Modified: dists/trunk/linux-2.6/debian/linux-base.postinst
==============================================================================
--- dists/trunk/linux-2.6/debian/linux-base.postinst	Wed Mar 10 01:06:40 2010	(r15346)
+++ dists/trunk/linux-2.6/debian/linux-base.postinst	Wed Mar 10 03:57:49 2010	(r15347)
@@ -22,6 +22,7 @@
 use Debconf::Client::ConfModule ':all';
 use FileHandle;
 use POSIX ();
+use UUID;
 
 package DebianKernel::DiskId;
 
@@ -1086,33 +1087,46 @@
 		     # with few exceptions.  Such as including a '^'.
 		     suffix => '^old'});
 
-### Filesystem relabelling
+### Filesystem labels and UUIDs
 
-sub ext2_label {
+sub ext2_set_label {
     my ($bdev, $label) = @_;
-    system('e2label', $bdev, $label) == 0 or die "e2label failed: $?";
+    system('tune2fs', '-L', $label, $bdev) == 0 or die "tune2fs failed: $?";
+}
+sub ext2_set_uuid {
+    my ($bdev, $uuid) = @_;
+    system('tune2fs', '-U', $uuid, $bdev) == 0 or die "tune2fs failed: $?";
 }
 
-sub jfs_label {
+sub jfs_set_label {
     my ($bdev, $label) = @_;
     system('jfs_tune', '-L', $label, $bdev) == 0 or die "jfs_tune failed: $?";
 }
+sub jfs_set_uuid {
+    my ($bdev, $uuid) = @_;
+    system('jfs_tune', '-U', $uuid, $bdev) == 0 or die "jfs_tune failed: $?";
+}
 
-sub fat_label {
+sub fat_set_label {
     my ($bdev, $label) = @_;
-    system('dosfslabel', $bdev, $label) == 0 or die "dosfslabel failed: $?";;
+    system('dosfslabel', $bdev, $label) == 0 or die "dosfslabel failed: $?";
 }
 
-sub ntfs_label {
+sub ntfs_set_label {
     my ($bdev, $label) = @_;
     system('ntfslabel', $bdev, $label) == 0 or die "ntfslabel failed: $?";
 }
 
-sub reiserfs_label {
+sub reiserfs_set_label {
     my ($bdev, $label) = @_;
     system('reiserfstune', '--label', $label, $bdev)
 	or die "reiserfstune failed: $?";
 }
+sub reiserfs_set_uuid {
+    my ($bdev, $uuid) = @_;
+    system('reiserfstune', '--uuid', $uuid, $bdev)
+	or die "reiserfstune failed: $?";
+}
 
 # There is no command to relabel swap, and we mustn't run mkswap if
 # the partition is already in use.  Thankfully the header format is
@@ -1129,9 +1143,10 @@
 # };
 # and has the signature 'SWAPSPACE2' at the end of the first page.
 use constant { SWAP_SIGNATURE => 'SWAPSPACE2',
+	       SWAP_UUID_OFFSET => 1036, SWAP_UUID_LEN => 16,
 	       SWAP_LABEL_OFFSET => 1052, SWAP_LABEL_LEN => 16 };
-sub swap_label {
-    my ($bdev, $label) = @_;
+sub _swap_set_field {
+    my ($bdev, $offset, $value) = @_;
     my $pagesize = POSIX::sysconf(POSIX::_SC_PAGESIZE) or die "$!";
     my ($length, $signature);
 
@@ -1146,11 +1161,10 @@
 	die "swap signature not found on $bdev";
     }
 
-    # Set the label
-    $label = pack('Z' . SWAP_LABEL_LEN, $label);
-    POSIX::lseek($fd, SWAP_LABEL_OFFSET, POSIX::SEEK_SET);
-    $length = POSIX::write($fd, $label, SWAP_LABEL_LEN);
-    if (!defined($length) || $length != SWAP_LABEL_LEN) {
+    # Set the field
+    POSIX::lseek($fd, $offset, POSIX::SEEK_SET);
+    $length = POSIX::write($fd, $value, length($value));
+    if (!defined($length) || $length != length($value)) {
 	my $error = "$!";
 	POSIX::close($fd);
 	die $error;
@@ -1158,29 +1172,54 @@
 
     POSIX::close($fd);
 }
+sub swap_set_label {
+    my ($bdev, $label) = @_;
+    _swap_set_field($bdev, SWAP_LABEL_OFFSET, pack('Z' . SWAP_LABEL_LEN, $label));
+}
+sub swap_set_uuid {
+    my ($bdev, $uuid) = @_;
+    my $uuid_bin;
+    if (UUID::parse($uuid, $uuid_bin) != 0 ||
+	length($uuid_bin) != SWAP_UUID_LEN) {
+	die "internal error: invalid UUID string";
+    }
+    _swap_set_field($bdev, SWAP_UUID_OFFSET, $uuid_bin);
+}
 
-sub ufs_label {
+sub ufs_set_label {
     my ($bdev, $label) = @_;
     system('tunefs.ufs', '-L', $label, $bdev) or die "tunefs.ufs failed: $?";
 }
 
-sub xfs_label {
+sub xfs_set_label {
     my ($bdev, $label) = @_;
     system('xfs_admin', '-L', $label, $bdev) or die "xfs_admin failed: $?";
 }
-
-my %label_types = (ext2     => { len => 16,  relabel => \&ext2_label },
-		   ext3     => { len => 16,  relabel => \&ext2_label },
-		   ext4     => { len => 16,  relabel => \&ext2_label },
-		   jfs      => { len => 16,  relabel => \&jfs_label },
-		   msdos    => { len => 11,  relabel => \&fat_label },
-		   ntfs     => { len => 128, relabel => \&ntfs_label },
-		   reiserfs => { len => 16,  relabel => \&reiserfs_label },
-		   swap     => { len => SWAP_LABEL_LEN,
-				 relabel => \&swap_label },
-		   ufs      => { len => 32,  relabel => \&ufs_label },
-		   vfat     => { len => 11,  relabel => \&fat_label },
-		   xfs      => { len => 12,  relabel => \&xfs_label });
+sub xfs_set_uuid {
+    my ($bdev, $uuid) = @_;
+    system('xfs_admin', '-U', $uuid, $bdev) or die "xfs_admin failed: $?";
+}
+
+my %filesystem_types = (
+    ext2     => { label_len => 16,             set_label => \&ext2_set_label,
+		  set_uuid  => \&ext2_set_uuid },
+    ext3     => { label_len => 16,             set_label => \&ext2_set_label,
+		  set_uuid  => \&ext2_set_uuid },
+    ext4     => { label_len => 16,             set_label => \&ext2_set_label,
+		  set_uuid  => \&ext2_set_uuid },
+    jfs      => { label_len => 16,             set_label => \&jfs_set_label,
+		  set_uuid  => \&jfs_set_uuid },
+    msdos    => { label_len => 11,             set_label => \&fat_set_label },
+    ntfs     => { label_len => 128,            set_label => \&ntfs_set_label },
+    reiserfs => { label_len => 16,             set_label => \&reiserfs_set_label,
+		  set_uuid  => \&reiserfs_set_uuid },
+    swap     => { label_len => SWAP_LABEL_LEN, set_label => \&swap_set_label,
+		  set_uuid  => \&swap_set_uuid },
+    ufs      => { label_len => 32,             set_label => \&ufs_set_label },
+    vfat     => { label_len => 11,             set_label => \&fat_set_label },
+    xfs      => { label_len => 12,             set_label => \&xfs_set_label,
+		  set_uuid  => \&xfs_set_uuid }
+    );
 
 my %bdev_map;
 my @matched_configs;
@@ -1253,13 +1292,16 @@
 sub add_tag {
     # Map disks to labels/UUIDs and vice versa.  Include all disks in
     # the reverse mapping so we can detect ambiguity.
-    my ($bdev, $name, $value) = @_;
+    my ($bdev, $name, $value, $new) = @_;
     my $id = "$name=$value";
     push @{$id_map{$id}}, $bdev;
     if (exists($bdev_map{$bdev})) {
 	$bdev_map{$bdev}->{$name} = $value;
 	push @{$bdev_map{$bdev}->{ids}}, $id;
     }
+    if ($new) {
+	$bdev_map{$bdev}->{new_id} = $id;
+    }
 }
 
 sub scan_devices {
@@ -1280,18 +1322,26 @@
     }
 }
 
-sub assign_labels {
+sub assign_new_ids {
     my $hostname = (POSIX::uname())[1];
 
-    # For all devices that have no alternate device ids, suggest labelling
-    # them based on fstab or just using a generic label.
+    # For all devices that have no alternate device ids, suggest setting
+    # UUIDs, labelling them based on fstab or just using a generic label.
     for my $bdev (keys(%bdev_map)) {
 	next if $#{$bdev_map{$bdev}->{ids}} >= 0;
 
 	my $type = $bdev_map{$bdev}->{type};
-	next unless defined($type) && exists($label_types{$type});
+	next unless defined($type) && exists($filesystem_types{$type});
 
-	my $label_len = $label_types{$type}->{len};
+	if (defined($filesystem_types{$type}->{set_uuid})) {
+	    my ($uuid_bin, $uuid);
+	    UUID::generate($uuid_bin);
+	    UUID::unparse($uuid_bin, $uuid);
+	    add_tag($bdev, 'UUID', $uuid, 1);
+	    next;
+	}
+
+	my $label_len = $filesystem_types{$type}->{len};
 	my $label;
 	use bytes; # string lengths are in bytes
 
@@ -1331,17 +1381,23 @@
 	    } while (exists($id_map{"LABEL=$label"}));
 	}
 
-	add_tag($bdev, 'LABEL', $label);
-	$bdev_map{$bdev}->{relabel} = 1;
+	add_tag($bdev, 'LABEL', $label, 1);
     }
 }
 
-sub relabel {
+sub set_new_ids {
     for my $bdev (keys(%bdev_map)) {
 	my $bdev_info = $bdev_map{$bdev};
-	if ($bdev_info->{relabel}) {
-	    my $relabel = $label_types{$bdev_info->{type}}->{relabel};
-	    &{$relabel}($bdev, $bdev_info->{LABEL});
+	if ($bdev_info->{new_id}) {
+	    my ($name, $value) = split(/=/, $bdev_info->{new_id}, 2);
+	    my $setter;
+	    if ($name eq 'UUID') {
+		$setter = $filesystem_types{$bdev_info->{type}}->{set_uuid};
+	    } elsif ($name eq 'LABEL') {
+		$setter = $filesystem_types{$bdev_info->{type}}->{set_label};
+	    }
+	    defined($setter) or die "internal error: invalid new_id type";
+	    &{$setter}($bdev, $value);
 	}
     }
 }
@@ -1410,14 +1466,15 @@
 
     if ($answer eq 'true') {
 	scan_devices();
-	assign_labels();
+	assign_new_ids();
 
-	if (grep({$bdev_map{$_}->{relabel}} keys(%bdev_map))) {
+	if (grep({$bdev_map{$_}->{new_id}} keys(%bdev_map))) {
 	    $question = 'linux-base/disk-id-convert-plan';
 	    ($ret, $seen) = subst($question, 'relabel',
 				  join("\\n",
-				       map({sprintf("%s: %s", $_, $bdev_map{$_}->{LABEL})}
-					   grep({$bdev_map{$_}->{relabel}}
+				       map({sprintf("%s: %s",
+						    $_, $bdev_map{$_}->{new_id})}
+					   grep({$bdev_map{$_}->{new_id}}
 						keys(%bdev_map)))));
 	    die "Error setting debconf substitutions in $question: $seen" if $ret;
 	} else {
@@ -1448,7 +1505,7 @@
 	if ($answer ne 'true') {
 	    # TODO: go back to the auto/manual question or allow editing the plan
 	} else {
-	    relabel();
+	    set_new_ids();
 	    update_config();
 	}
     }

Modified: dists/trunk/linux-2.6/debian/linux-base.templates
==============================================================================
--- dists/trunk/linux-2.6/debian/linux-base.templates	Wed Mar 10 01:06:40 2010	(r15346)
+++ dists/trunk/linux-2.6/debian/linux-base.templates	Wed Mar 10 03:57:49 2010	(r15347)
@@ -15,7 +15,7 @@
 Type: boolean
 Default: true
 Description: Apply these configuration changes to disk device ids?
- These devices will be relabelled:
+ These devices will be assigned UUIDs or labels:
  .
  ${relabel}
  .

Modified: dists/trunk/linux-2.6/debian/templates/control.main.in
==============================================================================
--- dists/trunk/linux-2.6/debian/templates/control.main.in	Wed Mar 10 01:06:40 2010	(r15346)
+++ dists/trunk/linux-2.6/debian/templates/control.main.in	Wed Mar 10 03:57:49 2010	(r15347)
@@ -79,7 +79,7 @@
 
 Package: linux-base
 Architecture: all
-Depends: libapt-pkg-perl, ${misc:Depends}
+Depends: libapt-pkg-perl, libuuid-perl, ${misc:Depends}
 Description: Linux image base package
  This package contains files and support scripts for all Linux
  images.



More information about the Kernel-svn-changes mailing list