linux/drivers/staging/lustre/include/linux/libcfs/linux/linux-prim.h
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 only,
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License version 2 for more details (a copy is included
  14 * in the LICENSE file that accompanied this code).
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * version 2 along with this program; If not, see
  18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2012, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 *
  36 * libcfs/include/libcfs/linux/linux-prim.h
  37 *
  38 * Basic library routines.
  39 */
  40
  41#ifndef __LIBCFS_LINUX_CFS_PRIM_H__
  42#define __LIBCFS_LINUX_CFS_PRIM_H__
  43
  44#ifndef __LIBCFS_LIBCFS_H__
  45#error Do not #include this file directly. #include <linux/libcfs/libcfs.h> instead
  46#endif
  47
  48
  49#include <linux/module.h>
  50#include <linux/init.h>
  51#include <linux/kernel.h>
  52#include <linux/version.h>
  53#include <linux/proc_fs.h>
  54#include <linux/mm.h>
  55#include <linux/timer.h>
  56#include <linux/signal.h>
  57#include <linux/sched.h>
  58#include <linux/kthread.h>
  59#include <linux/random.h>
  60
  61#include <linux/miscdevice.h>
  62#include <linux/libcfs/linux/portals_compat25.h>
  63#include <asm/div64.h>
  64
  65#include <linux/libcfs/linux/linux-time.h>
  66
  67
  68/*
  69 * CPU
  70 */
  71#ifdef for_each_possible_cpu
  72#define cfs_for_each_possible_cpu(cpu) for_each_possible_cpu(cpu)
  73#elif defined(for_each_cpu)
  74#define cfs_for_each_possible_cpu(cpu) for_each_cpu(cpu)
  75#endif
  76
  77#ifdef NR_CPUS
  78#else
  79#define NR_CPUS     1
  80#endif
  81
  82/*
  83 * cache
  84 */
  85
  86/*
  87 * IRQs
  88 */
  89
  90
  91/*
  92 * Pseudo device register
  93 */
  94typedef struct miscdevice               psdev_t;
  95
  96/*
  97 * Sysctl register
  98 */
  99typedef struct ctl_table                ctl_table_t;
 100typedef struct ctl_table_header         ctl_table_header_t;
 101
 102#define cfs_register_sysctl_table(t, a) register_sysctl_table(t)
 103
 104#define DECLARE_PROC_HANDLER(name)                    \
 105static int                                            \
 106LL_PROC_PROTO(name)                                  \
 107{                                                      \
 108        DECLARE_LL_PROC_PPOS_DECL;                    \
 109                                                        \
 110        return proc_call_handler(table->data, write,    \
 111                                 ppos, buffer, lenp,    \
 112                                 __##name);          \
 113}
 114
 115/*
 116 * Symbol register
 117 */
 118#define cfs_symbol_register(s, p)       do {} while(0)
 119#define cfs_symbol_unregister(s)        do {} while(0)
 120#define cfs_symbol_get(s)              symbol_get(s)
 121#define cfs_symbol_put(s)              symbol_put(s)
 122
 123typedef struct module module_t;
 124
 125/*
 126 * Proc file system APIs
 127 */
 128typedef struct proc_dir_entry      proc_dir_entry_t;
 129
 130/*
 131 * Wait Queue
 132 */
 133
 134
 135typedef long                        cfs_task_state_t;
 136
 137#define CFS_DECL_WAITQ(wq)              DECLARE_WAIT_QUEUE_HEAD(wq)
 138
 139/*
 140 * Task struct
 141 */
 142typedef struct task_struct            task_t;
 143#define DECL_JOURNAL_DATA          void *journal_info
 144#define PUSH_JOURNAL            do {    \
 145        journal_info = current->journal_info;   \
 146        current->journal_info = NULL;      \
 147        } while(0)
 148#define POP_JOURNAL              do {    \
 149        current->journal_info = journal_info;   \
 150        } while(0)
 151
 152/* Module interfaces */
 153#define cfs_module(name, version, init, fini) \
 154        module_init(init);                  \
 155        module_exit(fini)
 156
 157/*
 158 * Signal
 159 */
 160
 161/*
 162 * Timer
 163 */
 164typedef struct timer_list timer_list_t;
 165
 166
 167#ifndef wait_event_timeout /* Only for RHEL3 2.4.21 kernel */
 168#define __wait_event_timeout(wq, condition, timeout, ret)       \
 169do {                                                         \
 170        int __ret = 0;                                     \
 171        if (!(condition)) {                                   \
 172                wait_queue_t __wait;                         \
 173                unsigned long expire;                       \
 174                                                                 \
 175                init_waitqueue_entry(&__wait, current);   \
 176                expire = timeout + jiffies;                   \
 177                add_wait_queue(&wq, &__wait);               \
 178                for (;;) {                                     \
 179                        set_current_state(TASK_UNINTERRUPTIBLE); \
 180                        if (condition)                     \
 181                                break;                     \
 182                        if (jiffies > expire) {           \
 183                                ret = jiffies - expire;   \
 184                                break;                     \
 185                        }                                       \
 186                        schedule_timeout(timeout);             \
 187                }                                               \
 188                current->state = TASK_RUNNING;             \
 189                remove_wait_queue(&wq, &__wait);                 \
 190        }                                                       \
 191} while (0)
 192/*
 193   retval == 0; condition met; we're good.
 194   retval > 0; timed out.
 195*/
 196#define cfs_waitq_wait_event_timeout(wq, condition, timeout, ret)    \
 197do {                                                             \
 198        ret = 0;                                                     \
 199        if (!(condition))                                           \
 200                __wait_event_timeout(wq, condition, timeout, ret);   \
 201} while (0)
 202#else
 203#define cfs_waitq_wait_event_timeout(wq, condition, timeout, ret)    \
 204        ret = wait_event_timeout(wq, condition, timeout)
 205#endif
 206
 207#define cfs_waitq_wait_event_interruptible_timeout(wq, c, timeout, ret) \
 208        ret = wait_event_interruptible_timeout(wq, c, timeout)
 209
 210/*
 211 * atomic
 212 */
 213
 214
 215#define cfs_atomic_add_unless(atom, a, u)    atomic_add_unless(atom, a, u)
 216#define cfs_atomic_cmpxchg(atom, old, nv)    atomic_cmpxchg(atom, old, nv)
 217
 218/*
 219 * membar
 220 */
 221
 222
 223/*
 224 * interrupt
 225 */
 226
 227
 228/*
 229 * might_sleep
 230 */
 231
 232/*
 233 * group_info
 234 */
 235typedef struct group_info group_info_t;
 236
 237
 238/*
 239 * Random bytes
 240 */
 241#endif
 242