[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#531572: backport of mkswap UUID support from git



UUID support has made it upstream after 1.14.2 was
released. I'm attaching a backport to 1.14.2.

Build-tested, not runtime-tested.

	Max
Index: trunk/debian/config/udeb
===================================================================
--- trunk/debian/config/udeb	(revision 59555)
+++ trunk/debian/config/udeb	(working copy)
@@ -497,6 +497,7 @@
 # CONFIG_FEATURE_MDEV_EXEC is not set
 # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
 CONFIG_MKSWAP=y
+CONFIG_FEATURE_MKSWAP_UUID=y
 # CONFIG_FEATURE_MKSWAP_V0 is not set
 CONFIG_MORE=y
 CONFIG_FEATURE_USE_TERMIOS=y
Index: trunk/debian/config/static
===================================================================
--- trunk/debian/config/static	(revision 59555)
+++ trunk/debian/config/static	(working copy)
@@ -501,6 +501,7 @@
 # CONFIG_FEATURE_MDEV_EXEC is not set
 # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
 CONFIG_MKSWAP=y
+# CONFIG_FEATURE_MKSWAP_UUID is not set
 # CONFIG_FEATURE_MKSWAP_V0 is not set
 CONFIG_MORE=y
 CONFIG_FEATURE_USE_TERMIOS=y
Index: trunk/debian/config/deb
===================================================================
--- trunk/debian/config/deb	(revision 59555)
+++ trunk/debian/config/deb	(working copy)
@@ -497,6 +497,7 @@
 # CONFIG_FEATURE_MDEV_EXEC is not set
 # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
 # CONFIG_MKSWAP is not set
+# CONFIG_FEATURE_MKSWAP_UUID is not set
 # CONFIG_FEATURE_MKSWAP_V0 is not set
 CONFIG_MORE=y
 CONFIG_FEATURE_USE_TERMIOS=y
Index: trunk/debian/patches/mkswap-uuid.patch
===================================================================
--- trunk/debian/patches/mkswap-uuid.patch	(revision 0)
+++ trunk/debian/patches/mkswap-uuid.patch	(revision 0)
@@ -0,0 +1,138 @@
+Backport of mkswap UUID support to 1.14.2
+
+This combines the following upstream commits:
+
+  e25ba804dd38009f7b7df6b6efd7e1847e4242fa mkswap: separate UUID feature
+  ae5e96ad6900a287b0c18e3e6713769cead8dd71 mkswap: accidentally committed wrong 
+  a262cddae85667b1c073b35c3d000ae7f4a44b31 mkswap: improve randomness of UUID ge
+  f7ac66b55ffd036d9590f180149b6b7bb85a2d1b mkswap: generate UUID if CONFIG_DESKT
+
+diff --git a/util-linux/Config.in b/util-linux/Config.in
+index e5c053f..e7b0ec7 100644
+--- a/util-linux/Config.in
++++ b/util-linux/Config.in
+@@ -409,6 +409,13 @@ config FEATURE_MKSWAP_V0
+ 	  If your kernel is older than 2.1.117, then v0 support is the
+ 	  only option.
+ 
++config FEATURE_MKSWAP_UUID
++	bool "UUID support"
++	default n
++	depends on MKSWAP
++	help
++	  Generate swap spaces with universally unique identifiers.
++
+ config MORE
+ 	bool "more"
+ 	default n
+diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c
+index 11c411b..f718843 100644
+--- a/util-linux/mkswap.c
++++ b/util-linux/mkswap.c
+@@ -5,7 +5,6 @@
+  *
+  * Licensed under GPL version 2, see file LICENSE in this tarball for details.
+  */
+-
+ #include "libbb.h"
+ 
+ #if ENABLE_SELINUX
+@@ -48,7 +47,85 @@ static void mkswap_selinux_setcontext(int fd, const char *path)
+ 	bb_perror_msg_and_die("SELinux relabeling failed");
+ }
+ #else
+-#define mkswap_selinux_setcontext(fd, path) ((void)0)
++# define mkswap_selinux_setcontext(fd, path) ((void)0)
++#endif
++
++#if ENABLE_FEATURE_MKSWAP_UUID
++static void mkswap_generate_uuid(uint8_t *buf)
++{
++	/* http://www.ietf.org/rfc/rfc4122.txt
++	 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
++	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++	 * |                          time_low                             |
++	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++	 * |       time_mid                |         time_hi_and_version   |
++	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++	 * |clk_seq_and_variant            |         node (0-1)            |
++	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++	 * |                         node (2-5)                            |
++	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++	 * IOW, uuid has this layout:
++	 * uint32_t time_low (big endian)
++	 * uint16_t time_mid (big endian)
++	 * uint16_t time_hi_and_version (big endian)
++	 *  version is a 4-bit field:
++	 *   1 Time-based
++	 *   2 DCE Security, with embedded POSIX UIDs
++	 *   3 Name-based (MD5)
++	 *   4 Randomly generated
++	 *   5 Name-based (SHA-1)
++	 * uint16_t clk_seq_and_variant (big endian)
++	 *  variant is a 3-bit field:
++	 *   0xx Reserved, NCS backward compatibility
++	 *   10x The variant specified in rfc4122
++	 *   110 Reserved, Microsoft backward compatibility
++	 *   111 Reserved for future definition
++	 * uint8_t node[6]
++	 *
++	 * For version 4, these bits are set/cleared:
++	 * time_hi_and_version & 0x0fff | 0x4000
++	 * clk_seq_and_variant & 0x3fff | 0x8000
++	 */
++	pid_t pid;
++	int i;
++	char uuid_string[32];
++
++	i = open("/dev/urandom", O_RDONLY);
++	if (i >= 0) {
++		read(i, buf, 16);
++		close(i);
++	}
++	/* Paranoia. /dev/urandom may be missing.
++	 * rand() is guaranteed to generate at least [0, 2^15) range,
++	 * but lowest bits in some libc are not so "random".  */
++	srand(monotonic_us());
++	pid = getpid();
++	while (1) {
++		for (i = 0; i < 16; i++)
++			buf[i] ^= rand() >> 5;
++		if (pid == 0)
++			break;
++		srand(pid);
++		pid = 0;
++	}
++
++	/* version = 4 */
++	buf[4 + 2    ] = (buf[4 + 2    ] & 0x0f) | 0x40;
++	/* variant = 10x */
++	buf[4 + 2 + 2] = (buf[4 + 2 + 2] & 0x3f) | 0x80;
++
++	bin2hex(uuid_string, (void*) buf, 16);
++	/* f.e. UUID=dfd9c173-be52-4d27-99a5-c34c6c2ff55f */
++	printf("UUID=%.8s"  "-%.4s-%.4s-%.4s-%.12s\n",
++		uuid_string,
++		uuid_string+8,
++		uuid_string+8+4,
++		uuid_string+8+4+4,
++		uuid_string+8+4+4+4
++	);
++}
++#else
++# define mkswap_generate_uuid(buf) ((void)0)
+ #endif
+ 
+ #if 0 /* from Linux 2.6.23 */
+@@ -113,10 +190,10 @@ int mkswap_main(int argc, char **argv)
+ 	// Make a header. hdr is zero-filled so far...
+ 	hdr[0] = 1;
+ 	hdr[1] = (len / pagesize) - 1;
++	mkswap_generate_uuid((void*) &hdr[3]);
+ 
+ 	// Write the header.  Sync to disk because some kernel versions check
+ 	// signature on disk (not in cache) during swapon.
+-
+ 	xlseek(fd, 1024, SEEK_SET);
+ 	xwrite(fd, hdr, NWORDS * 4);
+ 	xlseek(fd, pagesize - 10, SEEK_SET);
Index: trunk/debian/patches/series
===================================================================
--- trunk/debian/patches/series	(revision 59555)
+++ trunk/debian/patches/series	(working copy)
@@ -4,3 +4,4 @@
 version.patch
 init-console.patch
 strip.patch
+mkswap-uuid.patch
Index: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	(revision 59555)
+++ trunk/debian/changelog	(working copy)
@@ -7,6 +7,10 @@
   [ Otavio Salvador ]
   * [udeb] Add an udhcpc script to be used by netcfg.
 
+  [ Max Vozeler ]
+  * Backport mkswap UUID support. (closes: #531572)
+  * [udeb] Enable mkswap UUID support.
+
  -- Otavio Salvador <otavio@ossystems.com.br>  Sun, 19 Jul 2009 14:43:18 -0300
 
 busybox (1:1.13.3-1) unstable; urgency=low

Reply to: