RxRPC rewrite
-----BEGIN PGP SIGNATURE----- iQIVAwUAWJ3sKfSw1s6N8H32AQLYMw//ViDsOuAu/NwJXW86Xzgh/pRtjOC1481j AaonMTY1c5WbXN8cFEthst6GERL4BBVV3goF758SJZgnTJSrT4HwYFE1J2Tf0Pc+ Z8UTUoaAhvDl+wVWlKCJ+XaZb5i6+FpnPpnm8F6noQ/Lv3F1LpTWqdybBquGhZ07 K+izTo2isXBhplRVPHfyXyExgpHHHXQpKIW2FVYD/OJ1+/WMUIuep7e98fyO7lcI 5ROA29YzdjdRJP9AZbqd8uFcJA4tBcwSP5yt6sUGOW52ncYYUCVuK0Q9H9LvFMJG WQm3NhXCt4sTGyHsghcpetp2Jccz+Tk/547HJRqbsb6XznxROENUx4L5hS1YthFM WbB24rmV5fWchNW5hkGTPOyapjdZujoAlr6JzXawvcx2u9Xdyf/1nO47gCvQBdtg eyrYpNpKp/CUzrMa1tl8pFK/DbPWCPeDnuZOfygvoCVJaTa15Q59KPItxHrO/p5i Vj3ExFdVWnDyLmol3U4ffENAuVvSy2xaQhmLVJt6u/npltGD6oq45XFia2naMw5L ShXTmQh5/dspORrNsVEHh0M6ZVCSlpPQwLyAoIP1+D14+5V035ebzgOOounOhsOa Zf+mvPfp5yq1BJqsBWTx8qoC+jrSYMYIiRi030+xgu6pXe7t7xPIxHOTjS2X8RCZ ERlnE3qonXY= =ol7H -----END PGP SIGNATURE----- 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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
c3d8103bc0
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
_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)
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
_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)
|
||||||
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 @@
|
||||||
#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 {
|
||||||
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 *);
|
||||||
* 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 *);
|
||||||
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);
|
||||||
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;
|
||||||
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)
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue