Bugzilla : 10651
Description: Nanosecond timestamp support.
+Severity : enhancement
+Bugzilla : 10802
+Description: Move random uuid functions to prng.c.
+
--------------------------------------------------------------------------------
tbd Cluster File Systems, Inc. <info@clusterfs.com>
/* prng.c */
unsigned int ll_rand(void); /* returns a random 32-bit integer */
void ll_srand(unsigned int, unsigned int); /* seed the generator */
+void ll_get_random_bytes(void *buf, int size);
+void ll_generate_random_uuid(unsigned char uuid_out[16]);
/* target.c */
struct ptlrpc_request;
/* uuid.c */
typedef __u8 class_uuid_t[16];
-void class_generate_random_uuid(class_uuid_t uuid);
void class_uuid_unparse(class_uuid_t in, struct obd_uuid *out);
/* lustre_peer.c */
struct obd_connect_data *ocd = NULL;
ENTRY;
- generate_random_uuid(uuid);
+ ll_generate_random_uuid(uuid);
class_uuid_unparse(uuid, &mgc_uuid);
nid = libcfs_str2nid(mgsnid);
((unsigned long)(ptr) == 0 || (unsigned long)(ptr) > -1000UL)
/* llite_lib.c */
-void generate_random_uuid(unsigned char uuid_out[16]);
int liblustre_process_log(struct config_llog_instance *cfg, char *mgsnid,
char *profile, int allow_recov);
int ll_parse_mount_target(const char *target, char **mgsnid,
ll_srand(tv.tv_sec ^ __swab32(seed[0]), tv.tv_usec ^__swab32(getpid()));
}
-void get_random_bytes(void *buf, int size)
-{
- int *p = buf;
- int rem;
- LASSERT(size >= 0);
-
- rem = min((unsigned long)buf & (sizeof(int) - 1), size);
- if (rem) {
- int val = ll_rand();
- memcpy(buf, &val, rem);
- p = buf + rem;
- size -= rem;
- }
-
- while (size >= sizeof(int)) {
- *p = ll_rand();
- size -= sizeof(int);
- p++;
- }
- buf = p;
- if (size) {
- int val = ll_rand();
- memcpy(buf, &val, size);
- }
-}
-
static void init_capability(int *res)
{
#ifdef HAVE_LIBCAP
return 0;
}
-void generate_random_uuid(unsigned char uuid_out[16])
-{
- get_random_bytes(uuid_out, sizeof(uuid_out));
-}
-
int init_lib_portals()
{
int rc;
RETURN(-ENOMEM);
INIT_LIST_HEAD(&sbi->ll_conn_chain);
- generate_random_uuid(uuid);
+ ll_generate_random_uuid(uuid);
class_uuid_unparse(uuid, &sbi->ll_sb_uuid);
/* generate a string unique to this super, let's try
int err;
ENTRY;
- generate_random_uuid(osc_uuid);
+ ll_generate_random_uuid(osc_uuid);
class_uuid_unparse(osc_uuid, &osc_uuid_str);
- generate_random_uuid(echo_uuid);
+ ll_generate_random_uuid(echo_uuid);
class_uuid_unparse(echo_uuid, &echo_uuid_str);
nid = libcfs_str2nid(echo_server_nid);
INIT_LIST_HEAD(&sbi->ll_conn_chain);
INIT_LIST_HEAD(&sbi->ll_orphan_dentry_list);
- class_generate_random_uuid(uuid);
+ ll_generate_random_uuid(uuid);
class_uuid_unparse(uuid, &sbi->ll_sb_uuid);
CDEBUG(D_HA, "generated uuid: %s\n", sbi->ll_sb_uuid.uuid);
int i, rc = 0, recov_bk = 1, failnodes = 0;
ENTRY;
- class_generate_random_uuid(uuid);
+ ll_generate_random_uuid(uuid);
class_uuid_unparse(uuid, &mdc_uuid);
CDEBUG(D_HA, "generated uuid: %s\n", mdc_uuid.uuid);
lustre_register_client_fill_super(ll_fill_super);
lustre_register_client_process_config(ll_process_config);
- get_random_bytes(seed, sizeof(seed));
+ ll_get_random_bytes(seed, sizeof(seed));
/* Nodes with small feet have little entropy
* the NID for this node gives the most entropy in the low bits */
if (lcfg->lcfg_bufcount >= 4 && LUSTRE_CFG_BUFLEN(lcfg, 3) > 0) {
class_uuid_t uuid;
- generate_random_uuid(uuid);
+ ll_generate_random_uuid(uuid);
class_uuid_unparse(uuid, &mds->mds_lov_uuid);
OBD_ALLOC(mds->mds_profile, LUSTRE_CFG_BUFLEN(lcfg, 3));
EXPORT_SYMBOL(class_num2obd);
/* uuid.c */
-EXPORT_SYMBOL(class_generate_random_uuid);
EXPORT_SYMBOL(class_uuid_unparse);
EXPORT_SYMBOL(lustre_uuid_to_peer);
#include <obd_support.h>
#include <lustre_handles.h>
+#include <lustre_lib.h>
spinlock_t handle_lock;
static __u64 handle_base;
bucket--)
CFS_INIT_LIST_HEAD(bucket);
- get_random_bytes(&handle_base, sizeof(handle_base));
+ ll_get_random_bytes(&handle_base, sizeof(handle_base));
LASSERT(handle_base != 0ULL);
return 0;
/* Random uuid for MGC allows easier reconnects */
OBD_ALLOC_PTR(uuid);
- class_generate_random_uuid(uuidc);
+ ll_generate_random_uuid(uuidc);
class_uuid_unparse(uuidc, uuid);
/* Start the MGC */
#ifndef __KERNEL__
#include <liblustre.h>
+#define get_random_bytes(val, size) (*val) = 0
#endif
#include <obd_class.h>
+#include <linux/random.h>
/*
From: George Marsaglia <geo@stat.fsu.edu>
seed_y = seed2;
}
EXPORT_SYMBOL(ll_srand);
+
+void ll_get_random_bytes(void *buf, int size)
+{
+ int *p = buf;
+ int rem, tmp;
+
+ LASSERT(size >= 0);
+
+ rem = min((int)((unsigned long)buf & (sizeof(int) - 1)), size);
+ if (rem) {
+ get_random_bytes(&tmp, sizeof(tmp));
+ tmp ^= ll_rand();
+ memcpy(buf, &tmp, rem);
+ p = buf + rem;
+ size -= rem;
+ }
+
+ while (size >= sizeof(int)) {
+ get_random_bytes(&tmp, sizeof(tmp));
+ *p = ll_rand() ^ tmp;
+ size -= sizeof(int);
+ p++;
+ }
+ buf = p;
+ if (size) {
+ get_random_bytes(&tmp, sizeof(tmp));
+ tmp ^= ll_rand();
+ memcpy(buf, &tmp, size);
+ }
+}
+EXPORT_SYMBOL(ll_get_random_bytes);
+
+void ll_generate_random_uuid(unsigned char uuid_out[16])
+{
+ ll_get_random_bytes(uuid_out, sizeof(uuid_out));
+}
+EXPORT_SYMBOL(ll_generate_random_uuid);
void generate_random_uuid(unsigned char uuid_out[16]);
-/* We need to have some extra twiddling here because some systems have
- * no random state when they start up. */
-void class_generate_random_uuid(class_uuid_t uuid)
-{
- struct timeval t;
- int *i, j, k;
-
- LASSERT(sizeof(class_uuid_t) % sizeof(*i) == 0);
-
- j = jiffies;
- do_gettimeofday(&t);
- k = t.tv_usec;
-
- generate_random_uuid(uuid);
-
- for (i = (int *)uuid; (char *)i < (char *)uuid + sizeof(class_uuid_t); i++) {
- *i ^= j ^ k;
- j = ((j << 8) & 0xffffff00) | ((j >> 24) & 0x000000ff);
- k = ((k >> 8) & 0x00ffffff) | ((k << 24) & 0xff000000);
- }
-}
-
void class_uuid_unparse(class_uuid_t uu, struct obd_uuid *out)
{
struct uuid uuid;