Commit c3d8103b authored by David S. Miller's avatar David S. Miller

Merge tag 'rxrpc-rewrite-20170210' of...

Merge tag 'rxrpc-rewrite-20170210' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs

David Howells says:

====================
afs: Use system UUID generation

There is now a general function for generating a UUID and AFS should make
use of it.  It's also been recommended to me that I switch to using random
rather than time plus MAC address-based UUIDs which this function does.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents fb585b44 b4db2b35
...@@ -351,7 +351,7 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call) ...@@ -351,7 +351,7 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call)
{ {
struct sockaddr_rxrpc srx; struct sockaddr_rxrpc srx;
struct afs_server *server; struct afs_server *server;
struct afs_uuid *r; struct uuid_v1 *r;
unsigned loop; unsigned loop;
__be32 *b; __be32 *b;
int ret; int ret;
...@@ -381,15 +381,15 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call) ...@@ -381,15 +381,15 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call)
} }
_debug("unmarshall UUID"); _debug("unmarshall UUID");
call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL); call->request = kmalloc(sizeof(struct uuid_v1), GFP_KERNEL);
if (!call->request) if (!call->request)
return -ENOMEM; return -ENOMEM;
b = call->buffer; b = call->buffer;
r = call->request; r = call->request;
r->time_low = ntohl(b[0]); r->time_low = b[0];
r->time_mid = ntohl(b[1]); r->time_mid = htons(ntohl(b[1]));
r->time_hi_and_version = ntohl(b[2]); r->time_hi_and_version = htons(ntohl(b[2]));
r->clock_seq_hi_and_reserved = ntohl(b[3]); r->clock_seq_hi_and_reserved = ntohl(b[3]);
r->clock_seq_low = ntohl(b[4]); r->clock_seq_low = ntohl(b[4]);
...@@ -454,7 +454,7 @@ static int afs_deliver_cb_probe(struct afs_call *call) ...@@ -454,7 +454,7 @@ static int afs_deliver_cb_probe(struct afs_call *call)
static void SRXAFSCB_ProbeUuid(struct work_struct *work) static void SRXAFSCB_ProbeUuid(struct work_struct *work)
{ {
struct afs_call *call = container_of(work, struct afs_call, work); struct afs_call *call = container_of(work, struct afs_call, work);
struct afs_uuid *r = call->request; struct uuid_v1 *r = call->request;
struct { struct {
__be32 match; __be32 match;
...@@ -477,7 +477,7 @@ static void SRXAFSCB_ProbeUuid(struct work_struct *work) ...@@ -477,7 +477,7 @@ static void SRXAFSCB_ProbeUuid(struct work_struct *work)
*/ */
static int afs_deliver_cb_probe_uuid(struct afs_call *call) static int afs_deliver_cb_probe_uuid(struct afs_call *call)
{ {
struct afs_uuid *r; struct uuid_v1 *r;
unsigned loop; unsigned loop;
__be32 *b; __be32 *b;
int ret; int ret;
...@@ -503,15 +503,15 @@ static int afs_deliver_cb_probe_uuid(struct afs_call *call) ...@@ -503,15 +503,15 @@ static int afs_deliver_cb_probe_uuid(struct afs_call *call)
} }
_debug("unmarshall UUID"); _debug("unmarshall UUID");
call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL); call->request = kmalloc(sizeof(struct uuid_v1), GFP_KERNEL);
if (!call->request) if (!call->request)
return -ENOMEM; return -ENOMEM;
b = call->buffer; b = call->buffer;
r = call->request; r = call->request;
r->time_low = ntohl(b[0]); r->time_low = b[0];
r->time_mid = ntohl(b[1]); r->time_mid = htons(ntohl(b[1]));
r->time_hi_and_version = ntohl(b[2]); r->time_hi_and_version = htons(ntohl(b[2]));
r->clock_seq_hi_and_reserved = ntohl(b[3]); r->clock_seq_hi_and_reserved = ntohl(b[3]);
r->clock_seq_low = ntohl(b[4]); r->clock_seq_low = ntohl(b[4]);
...@@ -569,9 +569,9 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *work) ...@@ -569,9 +569,9 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *work)
memset(&reply, 0, sizeof(reply)); memset(&reply, 0, sizeof(reply));
reply.ia.nifs = htonl(nifs); reply.ia.nifs = htonl(nifs);
reply.ia.uuid[0] = htonl(afs_uuid.time_low); reply.ia.uuid[0] = afs_uuid.time_low;
reply.ia.uuid[1] = htonl(afs_uuid.time_mid); reply.ia.uuid[1] = htonl(ntohs(afs_uuid.time_mid));
reply.ia.uuid[2] = htonl(afs_uuid.time_hi_and_version); reply.ia.uuid[2] = htonl(ntohs(afs_uuid.time_hi_and_version));
reply.ia.uuid[3] = htonl((s8) afs_uuid.clock_seq_hi_and_reserved); reply.ia.uuid[3] = htonl((s8) afs_uuid.clock_seq_hi_and_reserved);
reply.ia.uuid[4] = htonl((s8) afs_uuid.clock_seq_low); reply.ia.uuid[4] = htonl((s8) afs_uuid.clock_seq_low);
for (loop = 0; loop < 6; loop++) for (loop = 0; loop < 6; loop++)
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/fscache.h> #include <linux/fscache.h>
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
#include <linux/uuid.h>
#include <net/af_rxrpc.h> #include <net/af_rxrpc.h>
#include "afs.h" #include "afs.h"
...@@ -407,30 +408,6 @@ struct afs_interface { ...@@ -407,30 +408,6 @@ struct afs_interface {
unsigned mtu; /* MTU of interface */ unsigned mtu; /* MTU of interface */
}; };
/*
* UUID definition [internet draft]
* - the timestamp is a 60-bit value, split 32/16/12, and goes in 100ns
* increments since midnight 15th October 1582
* - add AFS_UUID_TO_UNIX_TIME to convert unix time in 100ns units to UUID
* time
* - the clock sequence is a 14-bit counter to avoid duplicate times
*/
struct afs_uuid {
u32 time_low; /* low part of timestamp */
u16 time_mid; /* mid part of timestamp */
u16 time_hi_and_version; /* high part of timestamp and version */
#define AFS_UUID_TO_UNIX_TIME 0x01b21dd213814000ULL
#define AFS_UUID_TIMEHI_MASK 0x0fff
#define AFS_UUID_VERSION_TIME 0x1000 /* time-based UUID */
#define AFS_UUID_VERSION_NAME 0x3000 /* name-based UUID */
#define AFS_UUID_VERSION_RANDOM 0x4000 /* (pseudo-)random generated UUID */
u8 clock_seq_hi_and_reserved; /* clock seq hi and variant */
#define AFS_UUID_CLOCKHI_MASK 0x3f
#define AFS_UUID_VARIANT_STD 0x80
u8 clock_seq_low; /* clock seq low */
u8 node[6]; /* spatially unique node ID (MAC addr) */
};
/*****************************************************************************/ /*****************************************************************************/
/* /*
* cache.c * cache.c
...@@ -565,7 +542,7 @@ extern int afs_drop_inode(struct inode *); ...@@ -565,7 +542,7 @@ extern int afs_drop_inode(struct inode *);
* main.c * main.c
*/ */
extern struct workqueue_struct *afs_wq; extern struct workqueue_struct *afs_wq;
extern struct afs_uuid afs_uuid; extern struct uuid_v1 afs_uuid;
/* /*
* misc.c * misc.c
...@@ -583,6 +560,11 @@ extern struct vfsmount *afs_d_automount(struct path *); ...@@ -583,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
*/ */
...@@ -646,12 +628,6 @@ extern void __exit afs_purge_servers(void); ...@@ -646,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
*/ */
......
...@@ -31,52 +31,9 @@ static char *rootcell; ...@@ -31,52 +31,9 @@ static char *rootcell;
module_param(rootcell, charp, 0); module_param(rootcell, charp, 0);
MODULE_PARM_DESC(rootcell, "root AFS cell name and VL server IP addr list"); MODULE_PARM_DESC(rootcell, "root AFS cell name and VL server IP addr list");
struct afs_uuid 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;
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 += AFS_UUID_TO_UNIX_TIME;
afs_uuid.time_low = uuidtime;
afs_uuid.time_mid = uuidtime >> 32;
afs_uuid.time_hi_and_version = (uuidtime >> 48) & AFS_UUID_TIMEHI_MASK;
afs_uuid.time_hi_and_version |= AFS_UUID_VERSION_TIME;
get_random_bytes(&clockseq, 2);
afs_uuid.clock_seq_low = clockseq;
afs_uuid.clock_seq_hi_and_reserved =
(clockseq >> 8) & AFS_UUID_CLOCKHI_MASK;
afs_uuid.clock_seq_hi_and_reserved |= AFS_UUID_VARIANT_STD;
_debug("AFS UUID: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
afs_uuid.time_low,
afs_uuid.time_mid,
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
*/ */
...@@ -86,9 +43,7 @@ static int __init afs_init(void) ...@@ -86,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 @@ ...@@ -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
......
...@@ -18,6 +18,30 @@ ...@@ -18,6 +18,30 @@
#include <uapi/linux/uuid.h> #include <uapi/linux/uuid.h>
/*
* V1 (time-based) UUID definition [RFC 4122].
* - the timestamp is a 60-bit value, split 32/16/12, and goes in 100ns
* increments since midnight 15th October 1582
* - add AFS_UUID_TO_UNIX_TIME to convert unix time in 100ns units to UUID
* time
* - the clock sequence is a 14-bit counter to avoid duplicate times
*/
struct uuid_v1 {
__be32 time_low; /* low part of timestamp */
__be16 time_mid; /* mid part of timestamp */
__be16 time_hi_and_version; /* high part of timestamp and version */
#define UUID_TO_UNIX_TIME 0x01b21dd213814000ULL
#define UUID_TIMEHI_MASK 0x0fff
#define UUID_VERSION_TIME 0x1000 /* time-based UUID */
#define UUID_VERSION_NAME 0x3000 /* name-based UUID */
#define UUID_VERSION_RANDOM 0x4000 /* (pseudo-)random generated UUID */
u8 clock_seq_hi_and_reserved; /* clock seq hi and variant */
#define UUID_CLOCKHI_MASK 0x3f
#define UUID_VARIANT_STD 0x80
u8 clock_seq_low; /* clock seq low */
u8 node[6]; /* spatially unique node ID (MAC addr) */
};
/* /*
* The length of a UUID string ("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee") * The length of a UUID string ("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
* not including trailing NUL. * not including trailing NUL.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment