X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fliblustre%2Flutil.c;h=63c4d216583dba2c0feaa2dbd428877ad06a2b43;hb=467521a236e4c4ef2ad57358cb645083e89f8bdf;hp=248cc333a8c230bae25d175c6b862ed38b7a11f2;hpb=191061ee668400324f4505cf498f1ee2d57e4962;p=fs%2Flustre-release.git diff --git a/lustre/liblustre/lutil.c b/lustre/liblustre/lutil.c index 248cc33..63c4d21 100644 --- a/lustre/liblustre/lutil.c +++ b/lustre/liblustre/lutil.c @@ -1,22 +1,37 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * Copyright (c) 2004 Cluster File Systems, Inc. + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * This file is part of Lustre, http://www.lustre.org. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * GPL HEADER END + */ +/* + * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Copyright (c) 2011, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. */ #include @@ -25,38 +40,33 @@ #include #include -#ifndef REDSTORM #include +#ifdef HAVE_NETDB_H #include -#include +#endif +#ifdef _AIX +#include "syscall_AIX.h" +#else +#include +#endif #include +#ifdef HAVE_NETINET_IN_H #include +#endif #include +#ifdef HAVE_ARPA_INET_H #include -#else -#include -#include #endif #include "lutil.h" -#ifdef CRAY_PORTALS -void portals_debug_dumplog(void){}; -#endif -unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL | - S_GMNAL | S_OPENIBNAL); -unsigned int portal_debug = 0; struct task_struct *current; -ptl_handle_ni_t tcpnal_ni; -ptl_nid_t tcpnal_mynid; void *inter_module_get(char *arg) { - if (!strcmp(arg, "tcpnal_ni")) - return &tcpnal_ni; - else if (!strcmp(arg, "ldlm_cli_cancel_unused")) + if (!strcmp(arg, "ldlm_cli_cancel_unused")) return ldlm_cli_cancel_unused; else if (!strcmp(arg, "ldlm_namespace_cleanup")) return ldlm_namespace_cleanup; @@ -66,68 +76,11 @@ void *inter_module_get(char *arg) return NULL; } -char *portals_nid2str(int nal, ptl_nid_t nid, char *str) -{ - if (nid == PTL_NID_ANY) { - snprintf(str, PTL_NALFMT_SIZE - 1, "%s", - "PTL_NID_ANY"); - return str; - } - - switch(nal){ -#ifndef CRAY_PORTALS - case TCPNAL: - /* userspace NAL */ - case OPENIBNAL: - case SOCKNAL: - snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u", - (__u32)(nid >> 32), HIPQUAD(nid)); - break; - case QSWNAL: - case GMNAL: - snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u", - (__u32)(nid >> 32), (__u32)nid); - break; -#endif - default: - snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx", - nal, (long long)nid); - break; - } - return str; -} - -char *portals_id2str(int nal, ptl_process_id_t id, char *str) -{ - switch(nal){ -#ifndef CRAY_PORTALS - case TCPNAL: - /* userspace NAL */ - case OPENIBNAL: - case SOCKNAL: - snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u,%u", - (__u32)(id.nid >> 32), HIPQUAD((id.nid)) , id.pid); - break; - case QSWNAL: - case GMNAL: - snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u,%u", - (__u32)(id.nid >> 32), (__u32)id.nid, id.pid); - break; -#endif - default: - snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx,%lx", - nal, (long long)id.nid, (long)id.pid ); - break; - } - return str; -} - -#ifndef REDSTORM /* * random number generator stuff */ -static int _rand_dev_fd = -1; +#ifdef HAVE_GETHOSTBYNAME static int get_ipv4_addr() { struct utsname myname; @@ -141,7 +94,7 @@ static int get_ipv4_addr() if (hptr == NULL || hptr->h_addrtype != AF_INET || *hptr->h_addr_list == NULL) { - printf("LibLustre: Warning: fail to get local IPv4 address\n"); + CWARN("Warning: fail to get local IPv4 address\n"); return 0; } @@ -149,45 +102,39 @@ static int get_ipv4_addr() return ip; } +#endif void liblustre_init_random() { - int seed; + int seed[2]; struct timeval tv; +#ifdef LIBLUSTRE_USE_URANDOM + int _rand_dev_fd; _rand_dev_fd = syscall(SYS_open, "/dev/urandom", O_RDONLY); if (_rand_dev_fd >= 0) { - if (syscall(SYS_read, _rand_dev_fd, &seed, sizeof(int)) == - sizeof(int)) { - srand(seed); + if (syscall(SYS_read, _rand_dev_fd, + &seed, sizeof(seed)) == sizeof(seed)) { + cfs_srand(seed[0], seed[1]); + syscall(SYS_close, _rand_dev_fd); return; } syscall(SYS_close, _rand_dev_fd); - _rand_dev_fd = -1; } +#endif /* LIBLUSTRE_USE_URANDOM */ +#ifdef HAVE_GETHOSTBYNAME + seed[0] = get_ipv4_addr(); +#else + seed[0] = _my_pnid; +#endif gettimeofday(&tv, NULL); - srand(tv.tv_sec + tv.tv_usec + getpid() + __swab32(get_ipv4_addr())); + cfs_srand(tv.tv_sec ^ __swab32(seed[0]), tv.tv_usec ^__swab32(getpid())); } -void get_random_bytes(void *buf, int size) -{ - char *p = buf; - LASSERT(size >= 0); - - if (_rand_dev_fd >= 0) { - if (syscall(SYS_read, _rand_dev_fd, buf, size) == size) - return; - syscall(SYS_close, _rand_dev_fd); - _rand_dev_fd = -1; - } - - while (size--) - *p++ = rand(); -} - -static void init_capability(int *res) +static void init_capability(__u32 *res) { +#ifdef HAVE_LIBCAP cap_t syscap; cap_flag_value_t capval; int i; @@ -196,8 +143,8 @@ static void init_capability(int *res) syscap = cap_get_proc(); if (!syscap) { - printf("Liblustre: Warning: failed to get system capability, " - "set to minimal\n"); + CWARN("Warning: failed to get system capability, " + "set to minimal\n"); return; } @@ -208,70 +155,21 @@ static void init_capability(int *res) } } } +#else + /* + * set fake cap flags to ship to linux server + * from client platforms that have none (eg. catamount) + * full capability for root + * no capability for anybody else + */ +#define FAKE_ROOT_CAP 0x1ffffeff +#define FAKE_USER_CAP 0 + + *res = (current->fsuid == 0) ? FAKE_ROOT_CAP: FAKE_USER_CAP; +#endif } -void liblustre_set_nal_nid() -{ - pid_t pid; - uint32_t ip; - struct in_addr in; - - /* need to setup mynid before tcpnal initialization */ - /* a meaningful nid could help debugging */ - ip = get_ipv4_addr(); - if (ip == 0) - get_random_bytes(&ip, sizeof(ip)); - pid = getpid() & 0xffffffff; - tcpnal_mynid = ((uint64_t)ip << 32) | pid; - - in.s_addr = htonl(ip); - printf("LibLustre: TCPNAL NID: %016llx (%s:%u)\n", - tcpnal_mynid, inet_ntoa(in), pid); -} - -#else /* REDSTORM */ - -void liblustre_init_random() -{ - struct timeval tv; - UINT32 nodeid; - - gettimeofday(&tv, NULL); - nodeid = _my_pnid; - srand(tv.tv_sec + tv.tv_usec + getpid() + __swab32(nodeid)); -} - -void get_random_bytes(void *buf, int size) -{ - char *p = buf; - LASSERT(size >= 0); - - while (size--) - *p++ = rand(); -} - -static void init_capability(int *res) -{ - *res = 0; -} - -void liblustre_set_nal_nid() -{ - pid_t pid; - uint32_t ip; - - ip = _my_pnid; - if (ip & 0xFF) - ip <<= 8; - pid = getpid() & 0xFF; - tcpnal_mynid = ip | pid; - printf("LibLustre: NAL NID: %08x (%u)\n", - tcpnal_mynid, pid); -} - -#endif /* REDSOTRM */ - -int in_group_p(gid_t gid) +int cfs_curproc_is_in_groups(gid_t gid) { int i; @@ -293,12 +191,10 @@ int liblustre_init_current(char *comm) CERROR("Not enough memory\n"); return -ENOMEM; } - current->fs = ¤t->__fs; - current->fs->umask = umask(0777); - umask(current->fs->umask); strncpy(current->comm, comm, sizeof(current->comm)); current->pid = getpid(); + current->gid = getgid(); current->fsuid = geteuid(); current->fsgid = getegid(); memset(¤t->pending, 0, sizeof(current->pending)); @@ -320,20 +216,48 @@ int liblustre_init_current(char *comm) return 0; } -void generate_random_uuid(unsigned char uuid_out[16]) +void cfs_cap_raise(cfs_cap_t cap) { - get_random_bytes(uuid_out, sizeof(uuid_out)); + current->cap_effective |= (1 << cap); +} + +void cfs_cap_lower(cfs_cap_t cap) +{ + current->cap_effective &= ~(1 << cap); +} + +int cfs_cap_raised(cfs_cap_t cap) +{ + return current->cap_effective & (1 << cap); +} + +cfs_cap_t cfs_curproc_cap_pack(void) { + return cfs_current()->cap_effective; +} + +void cfs_curproc_cap_unpack(cfs_cap_t cap) { + cfs_current()->cap_effective = cap; +} + +int cfs_capable(cfs_cap_t cap) +{ + return cfs_cap_raised(cap); } int init_lib_portals() { - int max_interfaces; int rc; ENTRY; - rc = PtlInit(&max_interfaces); - if (rc != PTL_OK) { - CERROR("PtlInit failed: %d\n", rc); + rc = libcfs_debug_init(5 * 1024 * 1024); + if (rc != 0) { + CERROR("libcfs_debug_init() failed: %d\n", rc); + RETURN (-ENXIO); + } + + rc = LNetInit(); + if (rc != 0) { + CERROR("LNetInit() failed: %d\n", rc); RETURN (-ENXIO); } RETURN(0); @@ -342,12 +266,6 @@ int init_lib_portals() extern void ptlrpc_exit_portals(void); void cleanup_lib_portals() { + libcfs_debug_cleanup(); ptlrpc_exit_portals(); } - -int -libcfs_nal_cmd(struct portals_cfg *pcfg) -{ - /* handle portals command if we want */ - return 0; -}