forked from mirrors/linux
		
	afs: Use core kernel UUID generation
AFS uses a time based UUID to identify the host itself.  This requires
getting a timestamp which is currently done through the getnstimeofday()
interface that we want to eventually get rid of.
Instead of replacing it with a ktime-based interface, simply remove the
entire function and use generate_random_uuid() instead, which has a v4
("completely random") UUID instead of the time-based one.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David Howells <dhowells@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									ff54877310
								
							
						
					
					
						commit
						b4db2b35fc
					
				
					 3 changed files with 6 additions and 74 deletions
				
			
		| 
						 | 
					@ -560,6 +560,11 @@ extern struct vfsmount *afs_d_automount(struct path *);
 | 
				
			||||||
extern int afs_mntpt_check_symlink(struct afs_vnode *, struct key *);
 | 
					extern int afs_mntpt_check_symlink(struct afs_vnode *, struct key *);
 | 
				
			||||||
extern void afs_mntpt_kill_timer(void);
 | 
					extern void afs_mntpt_kill_timer(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * netdevices.c
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					extern int afs_get_ipv4_interfaces(struct afs_interface *, size_t, bool);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * proc.c
 | 
					 * proc.c
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -623,12 +628,6 @@ extern void __exit afs_purge_servers(void);
 | 
				
			||||||
extern int afs_fs_init(void);
 | 
					extern int afs_fs_init(void);
 | 
				
			||||||
extern void afs_fs_exit(void);
 | 
					extern void afs_fs_exit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * use-rtnetlink.c
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
extern int afs_get_ipv4_interfaces(struct afs_interface *, size_t, bool);
 | 
					 | 
				
			||||||
extern int afs_get_MAC_address(u8 *, size_t);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * vlclient.c
 | 
					 * vlclient.c
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,50 +34,6 @@ MODULE_PARM_DESC(rootcell, "root AFS cell name and VL server IP addr list");
 | 
				
			||||||
struct uuid_v1 afs_uuid;
 | 
					struct uuid_v1 afs_uuid;
 | 
				
			||||||
struct workqueue_struct *afs_wq;
 | 
					struct workqueue_struct *afs_wq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * get a client UUID
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int __init afs_get_client_UUID(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct timespec ts;
 | 
					 | 
				
			||||||
	u64 uuidtime;
 | 
					 | 
				
			||||||
	u16 clockseq, hi_v;
 | 
					 | 
				
			||||||
	int ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* read the MAC address of one of the external interfaces and construct
 | 
					 | 
				
			||||||
	 * a UUID from it */
 | 
					 | 
				
			||||||
	ret = afs_get_MAC_address(afs_uuid.node, sizeof(afs_uuid.node));
 | 
					 | 
				
			||||||
	if (ret < 0)
 | 
					 | 
				
			||||||
		return ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	getnstimeofday(&ts);
 | 
					 | 
				
			||||||
	uuidtime = (u64) ts.tv_sec * 1000 * 1000 * 10;
 | 
					 | 
				
			||||||
	uuidtime += ts.tv_nsec / 100;
 | 
					 | 
				
			||||||
	uuidtime += UUID_TO_UNIX_TIME;
 | 
					 | 
				
			||||||
	afs_uuid.time_low = htonl(uuidtime);
 | 
					 | 
				
			||||||
	afs_uuid.time_mid = htons(uuidtime >> 32);
 | 
					 | 
				
			||||||
	hi_v = (uuidtime >> 48) & UUID_TIMEHI_MASK;
 | 
					 | 
				
			||||||
	hi_v |= UUID_VERSION_TIME;
 | 
					 | 
				
			||||||
	afs_uuid.time_hi_and_version = htons(hi_v);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	get_random_bytes(&clockseq, 2);
 | 
					 | 
				
			||||||
	afs_uuid.clock_seq_low = clockseq;
 | 
					 | 
				
			||||||
	afs_uuid.clock_seq_hi_and_reserved =
 | 
					 | 
				
			||||||
		(clockseq >> 8) & UUID_CLOCKHI_MASK;
 | 
					 | 
				
			||||||
	afs_uuid.clock_seq_hi_and_reserved |= UUID_VARIANT_STD;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_debug("AFS UUID: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
 | 
					 | 
				
			||||||
	       ntohl(afs_uuid.time_low),
 | 
					 | 
				
			||||||
	       ntohs(afs_uuid.time_mid),
 | 
					 | 
				
			||||||
	       ntohs(afs_uuid.time_hi_and_version),
 | 
					 | 
				
			||||||
	       afs_uuid.clock_seq_hi_and_reserved,
 | 
					 | 
				
			||||||
	       afs_uuid.clock_seq_low,
 | 
					 | 
				
			||||||
	       afs_uuid.node[0], afs_uuid.node[1], afs_uuid.node[2],
 | 
					 | 
				
			||||||
	       afs_uuid.node[3], afs_uuid.node[4], afs_uuid.node[5]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * initialise the AFS client FS module
 | 
					 * initialise the AFS client FS module
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -87,9 +43,7 @@ static int __init afs_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering.\n");
 | 
						printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = afs_get_client_UUID();
 | 
						generate_random_uuid((unsigned char *)&afs_uuid);
 | 
				
			||||||
	if (ret < 0)
 | 
					 | 
				
			||||||
		return ret;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* create workqueue */
 | 
						/* create workqueue */
 | 
				
			||||||
	ret = -ENOMEM;
 | 
						ret = -ENOMEM;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,27 +11,6 @@
 | 
				
			||||||
#include <net/net_namespace.h>
 | 
					#include <net/net_namespace.h>
 | 
				
			||||||
#include "internal.h"
 | 
					#include "internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * get a MAC address from a random ethernet interface that has a real one
 | 
					 | 
				
			||||||
 * - the buffer will normally be 6 bytes in size
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int afs_get_MAC_address(u8 *mac, size_t maclen)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct net_device *dev;
 | 
					 | 
				
			||||||
	int ret = -ENODEV;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	BUG_ON(maclen != ETH_ALEN);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rtnl_lock();
 | 
					 | 
				
			||||||
	dev = __dev_getfirstbyhwtype(&init_net, ARPHRD_ETHER);
 | 
					 | 
				
			||||||
	if (dev) {
 | 
					 | 
				
			||||||
		memcpy(mac, dev->dev_addr, maclen);
 | 
					 | 
				
			||||||
		ret = 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	rtnl_unlock();
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * get a list of this system's interface IPv4 addresses, netmasks and MTUs
 | 
					 * get a list of this system's interface IPv4 addresses, netmasks and MTUs
 | 
				
			||||||
 * - maxbufs must be at least 1
 | 
					 * - maxbufs must be at least 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue