X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Fuser-prim.c;h=0cc1e3db0e242d688c478f72d985f222d149c9c3;hb=bb8c57032a47020099bad60f7cea89b4530841d3;hp=f7efe729083d285a9788853175827e4bd390a9cb;hpb=004cc2b4c6eb32672985e2f4b4bbf9413e314547;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/user-prim.c b/libcfs/libcfs/user-prim.c index f7efe72..0cc1e3d 100644 --- a/libcfs/libcfs/user-prim.c +++ b/libcfs/libcfs/user-prim.c @@ -1,6 +1,4 @@ -/* -*- 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. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -46,6 +46,7 @@ #ifndef __KERNEL__ +#include #include /* @@ -80,6 +81,11 @@ void cfs_waitq_add_exclusive(struct cfs_waitq *waitq, struct cfs_waitlink *link) (void)link; } +void cfs_waitq_add_exclusive_head(struct cfs_waitq *waitq, struct cfs_waitlink *link) +{ + cfs_waitq_add_exclusive(waitq, link); +} + void cfs_waitq_del(struct cfs_waitq *waitq, struct cfs_waitlink *link) { LASSERT(waitq != NULL); @@ -195,7 +201,7 @@ cfs_time_t cfs_timer_deadline(cfs_timer_t *l) } -#ifdef HAVE_PTHREAD +#ifdef HAVE_LIBPTHREAD /* * Threads @@ -216,7 +222,8 @@ static void *cfs_thread_helper(void *data) (void)f(arg); return NULL; } -int cfs_create_thread(cfs_thread_t func, void *arg) + +int cfs_create_thread(cfs_thread_t func, void *arg, unsigned long flags) { pthread_t tid; pthread_attr_t tattr; @@ -257,6 +264,49 @@ gid_t cfs_curproc_fsgid(void) return getgid(); } +#ifndef HAVE_STRLCPY /* not in glibc for RHEL 5.x, remove when obsolete */ +size_t strlcpy(char *tgt, const char *src, size_t tgt_len) +{ + int src_len = strlen(src); + + strncpy(tgt, src, tgt_len - 1); + tgt[tgt_len - 1] = '\0'; + + return src_len + 1; +} +#endif + +#ifndef HAVE_STRLCAT /* not in glibc for RHEL 5.x, remove when obsolete */ +size_t strlcat(char *tgt, const char *src, size_t size) +{ + size_t tgt_len = strlen(tgt); + + if (size > tgt_len) { + strncat(tgt, src, size - tgt_len - 1); + tgt[size - 1] = '\0'; + } + + return tgt_len + strlen(src); +} +#endif + +/* Read the environment variable of current process specified by @key. */ +int cfs_get_environ(const char *key, char *value, int *val_len) +{ + char *entry; + int len; + + entry = getenv(key); + if (entry == NULL) + return -ENOENT; + + len = strlcpy(value, entry, *val_len); + if (len >= *val_len) + return -EOVERFLOW; + + return 0; +} + void cfs_enter_debugger(void) { /* @@ -276,24 +326,39 @@ int cfs_daemonize_ctxt(char *str) cfs_sigset_t cfs_block_allsigs(void) { - cfs_sigset_t all; - cfs_sigset_t old; - int rc; + cfs_sigset_t all; + cfs_sigset_t old; + int rc; - sigfillset(&all); - rc = sigprocmask(SIG_SETMASK, &all, &old); - LASSERT(rc == 0); + sigfillset(&all); + rc = sigprocmask(SIG_BLOCK, &all, &old); + LASSERT(rc == 0); - return old; + return old; } -cfs_sigset_t cfs_block_sigs(cfs_sigset_t blocks) +cfs_sigset_t cfs_block_sigs(unsigned long sigs) { - cfs_sigset_t old; - int rc; + cfs_sigset_t old; + cfs_sigset_t blocks = { { sigs } }; /* kludge */ + int rc; - rc = sigprocmask(SIG_SETMASK, &blocks, &old); - LASSERT (rc == 0); + rc = sigprocmask(SIG_BLOCK, &blocks, &old); + LASSERT (rc == 0); + + return old; +} + +/* Block all signals except for the @sigs. It's only used in + * Linux kernel, just a dummy here. */ +cfs_sigset_t cfs_block_sigsinv(unsigned long sigs) +{ + cfs_sigset_t old; + int rc; + + /* Return old blocked sigs */ + rc = sigprocmask(SIG_SETMASK, NULL, &old); + LASSERT(rc == 0); return old; } @@ -357,10 +422,10 @@ void *cfs_stack_trace_frame(struct cfs_stack_trace *trace, int frame_no) /* __linux__ */ #endif -void lbug_with_loc(const char *file, const char *func, const int line) +void lbug_with_loc(struct libcfs_debug_msg_data *msgdata) { /* No libcfs_catastrophe in userspace! */ - libcfs_debug_msg(NULL, 0, D_EMERG, file, func, line, "LBUG\n"); + libcfs_debug_msg(msgdata, "LBUG\n"); abort(); }