Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Unified UUID/GUID definition

There are many different UUID/GUID definitions in kernel, such as that
in EFI, many file systems, some drivers, etc. Every kernel components
need UUID/GUID has its own definition. This patch provides a unified
definition for UUID/GUID.

UUID is defined via typedef. This makes that UUID appears more like a
preliminary type, and makes the data type explicit (comparing with
implicit "u8 uuid[16]").

The binary representation of UUID/GUID can be little-endian (used by
EFI, etc) or big-endian (defined by RFC4122), so both is defined.

Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>

authored by

Huang Ying and committed by
Len Brown
fab1c232 801eab81

+124 -1
+70
include/linux/uuid.h
··· 1 + /* 2 + * UUID/GUID definition 3 + * 4 + * Copyright (C) 2010, Intel Corp. 5 + * Huang Ying <ying.huang@intel.com> 6 + * 7 + * This program is free software; you can redistribute it and/or 8 + * modify it under the terms of the GNU General Public License version 9 + * 2 as published by the Free Software Foundation; 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the Free Software 18 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 + */ 20 + 21 + #ifndef _LINUX_UUID_H_ 22 + #define _LINUX_UUID_H_ 23 + 24 + #include <linux/types.h> 25 + #include <linux/string.h> 26 + 27 + typedef struct { 28 + __u8 b[16]; 29 + } uuid_le; 30 + 31 + typedef struct { 32 + __u8 b[16]; 33 + } uuid_be; 34 + 35 + #define UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \ 36 + ((uuid_le) \ 37 + {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ 38 + (b) & 0xff, ((b) >> 8) & 0xff, \ 39 + (c) & 0xff, ((c) >> 8) & 0xff, \ 40 + (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) 41 + 42 + #define UUID_BE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \ 43 + ((uuid_be) \ 44 + {{ ((a) >> 24) & 0xff, ((a) >> 16) & 0xff, ((a) >> 8) & 0xff, (a) & 0xff, \ 45 + ((b) >> 8) & 0xff, (b) & 0xff, \ 46 + ((c) >> 8) & 0xff, (c) & 0xff, \ 47 + (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) 48 + 49 + #define NULL_UUID_LE \ 50 + UUID_LE(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, \ 51 + 0x00, 0x00, 0x00, 0x00) 52 + 53 + #define NULL_UUID_BE \ 54 + UUID_BE(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, \ 55 + 0x00, 0x00, 0x00, 0x00) 56 + 57 + static inline int uuid_le_cmp(const uuid_le u1, const uuid_le u2) 58 + { 59 + return memcmp(&u1, &u2, sizeof(uuid_le)); 60 + } 61 + 62 + static inline int uuid_be_cmp(const uuid_be u1, const uuid_be u2) 63 + { 64 + return memcmp(&u1, &u2, sizeof(uuid_be)); 65 + } 66 + 67 + extern void uuid_le_gen(uuid_le *u); 68 + extern void uuid_be_gen(uuid_be *u); 69 + 70 + #endif
+1 -1
lib/Makefile
··· 21 21 22 22 obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ 23 23 bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ 24 - string_helpers.o gcd.o lcm.o list_sort.o 24 + string_helpers.o gcd.o lcm.o list_sort.o uuid.o 25 25 26 26 ifeq ($(CONFIG_DEBUG_KOBJECT),y) 27 27 CFLAGS_kobject.o += -DDEBUG
+53
lib/uuid.c
··· 1 + /* 2 + * Unified UUID/GUID definition 3 + * 4 + * Copyright (C) 2009, Intel Corp. 5 + * Huang Ying <ying.huang@intel.com> 6 + * 7 + * This program is free software; you can redistribute it and/or 8 + * modify it under the terms of the GNU General Public License version 9 + * 2 as published by the Free Software Foundation; 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the Free Software 18 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 + */ 20 + 21 + #include <linux/kernel.h> 22 + #include <linux/module.h> 23 + #include <linux/uuid.h> 24 + #include <linux/random.h> 25 + 26 + static void __uuid_gen_common(__u8 b[16]) 27 + { 28 + int i; 29 + u32 r; 30 + 31 + for (i = 0; i < 4; i++) { 32 + r = random32(); 33 + memcpy(b + i * 4, &r, 4); 34 + } 35 + /* reversion 0b10 */ 36 + b[8] = (b[8] & 0x3F) | 0x80; 37 + } 38 + 39 + void uuid_le_gen(uuid_le *lu) 40 + { 41 + __uuid_gen_common(lu->b); 42 + /* version 4 : random generation */ 43 + lu->b[7] = (lu->b[7] & 0x0F) | 0x40; 44 + } 45 + EXPORT_SYMBOL_GPL(uuid_le_gen); 46 + 47 + void uuid_be_gen(uuid_be *bu) 48 + { 49 + __uuid_gen_common(bu->b); 50 + /* version 4 : random generation */ 51 + bu->b[6] = (bu->b[6] & 0x0F) | 0x40; 52 + } 53 + EXPORT_SYMBOL_GPL(uuid_be_gen);