int ptlrpc_uuid_to_peer(struct obd_uuid *uuid, lnet_process_id_t *peer, lnet_nid_t *self) { int best_dist = 0; __u32 best_order = 0; int count = 0; int rc = -ENOENT; int portals_compatibility; int dist; __u32 order; lnet_nid_t dst_nid; lnet_nid_t src_nid; portals_compatibility = LNetCtl(IOC_LIBCFS_PORTALS_COMPATIBILITY, NULL); peer->pid = LUSTRE_SRV_LNET_PID; /* Choose the matching UUID that's closest */ while (lustre_uuid_to_peer(uuid->uuid, &dst_nid, count++) == 0) { dist = LNetDist(dst_nid, &src_nid, &order); if (dist < 0) continue; if (dist == 0) { /* local! use loopback LND */ peer->nid = *self = LNET_MKNID(LNET_MKNET(LOLND, 0), 0); rc = 0; break; } if (rc < 0 || dist < best_dist || (dist == best_dist && order < best_order)) { best_dist = dist; best_order = order; if (portals_compatibility > 1) { /* Strong portals compatibility: Zero the nid's * NET, so if I'm reading new config logs, or * getting configured by (new) lconf I can * still talk to old servers. */ dst_nid = LNET_MKNID(0, LNET_NIDADDR(dst_nid)); src_nid = LNET_MKNID(0, LNET_NIDADDR(src_nid)); } peer->nid = dst_nid; *self = src_nid; rc = 0; } } CDEBUG(D_NET,"%s->%s\n", uuid->uuid, libcfs_id2str(*peer)); return rc; }
char * libcfs_nid2str(lnet_nid_t nid) { __u32 addr = LNET_NIDADDR(nid); __u32 net = LNET_NIDNET(nid); int lnd = LNET_NETTYP(net); int nnum = LNET_NETNUM(net); struct netstrfns *nf; char *str; int nob; if (nid == LNET_NID_ANY) return "<?>"; nf = libcfs_lnd2netstrfns(lnd); str = libcfs_next_nidstring(); if (nf == NULL) snprintf(str, LNET_NIDSTR_SIZE, "%x@<%u:%u>", addr, lnd, nnum); else { nf->nf_addr2str(addr, str); nob = strlen(str); if (nnum == 0) snprintf(str + nob, LNET_NIDSTR_SIZE - nob, "@%s", nf->nf_name); else snprintf(str + nob, LNET_NIDSTR_SIZE - nob, "@%s%u", nf->nf_name, nnum); } return str; }
/* * range constructor * * \param min starting nid of the range * \param max ending nid of the range * \param nodemap nodemap that contains this range * \retval lu_nid_range on success, NULL on failure */ struct lu_nid_range *range_create(lnet_nid_t start_nid, lnet_nid_t end_nid, struct lu_nodemap *nodemap) { struct lu_nid_range *range; if (LNET_NIDNET(start_nid) != LNET_NIDNET(end_nid) || LNET_NIDADDR(start_nid) > LNET_NIDADDR(end_nid)) return NULL; OBD_ALLOC_PTR(range); if (range == NULL) { CERROR("cannot allocate lu_nid_range of size %zu bytes\n", sizeof(*range)); return NULL; } range->rn_id = atomic_inc_return(&range_highest_id); range->rn_nodemap = nodemap; interval_set(&range->rn_node, start_nid, end_nid); INIT_LIST_HEAD(&range->rn_list); return range; }
static int __init init_lustre_lite(void) { int i, rc, seed[2]; struct timeval tv; lnet_process_id_t lnet_id; CLASSERT(sizeof(LUSTRE_VOLATILE_HDR) == LUSTRE_VOLATILE_HDR_LEN + 1); /* print an address of _any_ initialized kernel symbol from this * module, to allow debugging with gdb that doesn't support data * symbols from modules.*/ CDEBUG(D_INFO, "Lustre client module (%p).\n", &lustre_super_operations); rc = ll_init_inodecache(); if (rc) return -ENOMEM; ll_file_data_slab = cfs_mem_cache_create("ll_file_data", sizeof(struct ll_file_data), 0, CFS_SLAB_HWCACHE_ALIGN); if (ll_file_data_slab == NULL) { ll_destroy_inodecache(); return -ENOMEM; } ll_remote_perm_cachep = cfs_mem_cache_create("ll_remote_perm_cache", sizeof(struct ll_remote_perm), 0, 0); if (ll_remote_perm_cachep == NULL) { cfs_mem_cache_destroy(ll_file_data_slab); ll_file_data_slab = NULL; ll_destroy_inodecache(); return -ENOMEM; } ll_rmtperm_hash_cachep = cfs_mem_cache_create("ll_rmtperm_hash_cache", REMOTE_PERM_HASHSIZE * sizeof(cfs_list_t), 0, 0); if (ll_rmtperm_hash_cachep == NULL) { cfs_mem_cache_destroy(ll_remote_perm_cachep); ll_remote_perm_cachep = NULL; cfs_mem_cache_destroy(ll_file_data_slab); ll_file_data_slab = NULL; ll_destroy_inodecache(); return -ENOMEM; } proc_lustre_fs_root = proc_lustre_root ? lprocfs_register("llite", proc_lustre_root, NULL, NULL) : NULL; lustre_register_client_fill_super(ll_fill_super); lustre_register_kill_super_cb(ll_kill_super); lustre_register_client_process_config(ll_process_config); cfs_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 */ for (i=0; ; i++) { if (LNetGetId(i, &lnet_id) == -ENOENT) { break; } if (LNET_NETTYP(LNET_NIDNET(lnet_id.nid)) != LOLND) { seed[0] ^= LNET_NIDADDR(lnet_id.nid); } } cfs_gettimeofday(&tv); cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); init_timer(&ll_capa_timer); ll_capa_timer.function = ll_capa_timer_callback; rc = ll_capa_thread_start(); /* * XXX normal cleanup is needed here. */ if (rc == 0) rc = vvp_global_init(); return rc; }
static int __init lustre_init(void) { struct proc_dir_entry *entry; lnet_process_id_t lnet_id; struct timeval tv; int i, rc, seed[2]; CLASSERT(sizeof(LUSTRE_VOLATILE_HDR) == LUSTRE_VOLATILE_HDR_LEN + 1); /* print an address of _any_ initialized kernel symbol from this * module, to allow debugging with gdb that doesn't support data * symbols from modules.*/ CDEBUG(D_INFO, "Lustre client module (%p).\n", &lustre_super_operations); ll_inode_cachep = kmem_cache_create("lustre_inode_cache", sizeof(struct ll_inode_info), 0, SLAB_HWCACHE_ALIGN, NULL); if (ll_inode_cachep == NULL) GOTO(out_cache, rc = -ENOMEM); ll_file_data_slab = kmem_cache_create("ll_file_data", sizeof(struct ll_file_data), 0, SLAB_HWCACHE_ALIGN, NULL); if (ll_file_data_slab == NULL) GOTO(out_cache, rc = -ENOMEM); ll_remote_perm_cachep = kmem_cache_create("ll_remote_perm_cache", sizeof(struct ll_remote_perm), 0, 0, NULL); if (ll_remote_perm_cachep == NULL) GOTO(out_cache, rc = -ENOMEM); ll_rmtperm_hash_cachep = kmem_cache_create("ll_rmtperm_hash_cache", REMOTE_PERM_HASHSIZE * sizeof(struct hlist_head), 0, 0, NULL); if (ll_rmtperm_hash_cachep == NULL) GOTO(out_cache, rc = -ENOMEM); entry = lprocfs_register("llite", proc_lustre_root, NULL, NULL); if (IS_ERR(entry)) { rc = PTR_ERR(entry); CERROR("cannot register '/proc/fs/lustre/llite': rc = %d\n", rc); GOTO(out_cache, rc); } proc_lustre_fs_root = entry; cfs_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. */ for (i = 0;; i++) { if (LNetGetId(i, &lnet_id) == -ENOENT) break; if (LNET_NETTYP(LNET_NIDNET(lnet_id.nid)) != LOLND) seed[0] ^= LNET_NIDADDR(lnet_id.nid); } do_gettimeofday(&tv); cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); rc = vvp_global_init(); if (rc != 0) GOTO(out_proc, rc); cl_inode_fini_env = cl_env_alloc(&cl_inode_fini_refcheck, LCT_REMEMBER | LCT_NOREF); if (IS_ERR(cl_inode_fini_env)) GOTO(out_vvp, rc = PTR_ERR(cl_inode_fini_env)); cl_inode_fini_env->le_ctx.lc_cookie = 0x4; rc = ll_xattr_init(); if (rc != 0) GOTO(out_inode_fini_env, rc); lustre_register_client_fill_super(ll_fill_super); lustre_register_kill_super_cb(ll_kill_super); lustre_register_client_process_config(ll_process_config); RETURN(0); out_inode_fini_env: cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck); out_vvp: vvp_global_fini(); out_proc: lprocfs_remove(&proc_lustre_fs_root); out_cache: if (ll_inode_cachep != NULL) kmem_cache_destroy(ll_inode_cachep); if (ll_file_data_slab != NULL) kmem_cache_destroy(ll_file_data_slab); if (ll_remote_perm_cachep != NULL) kmem_cache_destroy(ll_remote_perm_cachep); if (ll_rmtperm_hash_cachep != NULL) kmem_cache_destroy(ll_rmtperm_hash_cachep); return rc; }
static int __init lustre_init(void) { struct lnet_process_id lnet_id; struct timespec64 ts; int i, rc, seed[2]; BUILD_BUG_ON(sizeof(LUSTRE_VOLATILE_HDR) != LUSTRE_VOLATILE_HDR_LEN + 1); /* print an address of _any_ initialized kernel symbol from this * module, to allow debugging with gdb that doesn't support data * symbols from modules. */ CDEBUG(D_INFO, "Lustre client module (%p).\n", &lustre_super_operations); rc = -ENOMEM; ll_inode_cachep = kmem_cache_create("lustre_inode_cache", sizeof(struct ll_inode_info), 0, SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, NULL); if (!ll_inode_cachep) goto out_cache; ll_file_data_slab = kmem_cache_create("ll_file_data", sizeof(struct ll_file_data), 0, SLAB_HWCACHE_ALIGN, NULL); if (!ll_file_data_slab) goto out_cache; llite_root = debugfs_create_dir("llite", debugfs_lustre_root); if (IS_ERR_OR_NULL(llite_root)) { rc = llite_root ? PTR_ERR(llite_root) : -ENOMEM; llite_root = NULL; goto out_cache; } llite_kset = kset_create_and_add("llite", NULL, lustre_kobj); if (!llite_kset) { rc = -ENOMEM; goto out_debugfs; } cfs_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 */ for (i = 0;; i++) { if (LNetGetId(i, &lnet_id) == -ENOENT) break; if (LNET_NETTYP(LNET_NIDNET(lnet_id.nid)) != LOLND) seed[0] ^= LNET_NIDADDR(lnet_id.nid); } ktime_get_ts64(&ts); cfs_srand(ts.tv_sec ^ seed[0], ts.tv_nsec ^ seed[1]); rc = vvp_global_init(); if (rc != 0) goto out_sysfs; cl_inode_fini_env = cl_env_alloc(&cl_inode_fini_refcheck, LCT_REMEMBER | LCT_NOREF); if (IS_ERR(cl_inode_fini_env)) { rc = PTR_ERR(cl_inode_fini_env); goto out_vvp; } cl_inode_fini_env->le_ctx.lc_cookie = 0x4; rc = ll_xattr_init(); if (rc != 0) goto out_inode_fini_env; lustre_register_client_fill_super(ll_fill_super); lustre_register_kill_super_cb(ll_kill_super); lustre_register_client_process_config(ll_process_config); return 0; out_inode_fini_env: cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck); out_vvp: vvp_global_fini(); out_sysfs: kset_unregister(llite_kset); out_debugfs: debugfs_remove(llite_root); out_cache: kmem_cache_destroy(ll_inode_cachep); kmem_cache_destroy(ll_file_data_slab); return rc; }