Whamcloud - gitweb
bd3979f7b9f2a2e6467c40c95314cedc5ec33707
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-prim.c
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.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2013, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Sun Microsystems, Inc.
31  */
32
33 #define DEBUG_SUBSYSTEM S_LNET
34 #include <linux/module.h>
35 #include <linux/kernel.h>
36 #include <linux/fs_struct.h>
37 #include <linux/sched.h>
38
39 #include <libcfs/libcfs.h>
40
41 #if defined(CONFIG_KGDB)
42 #include <asm/kgdb.h>
43 #endif
44
45 void cfs_init_timer(struct timer_list *t)
46 {
47         init_timer(t);
48 }
49 EXPORT_SYMBOL(cfs_init_timer);
50
51 void cfs_timer_init(struct timer_list *t, cfs_timer_func_t *func, void *arg)
52 {
53         init_timer(t);
54         t->function = func;
55         t->data = (unsigned long)arg;
56 }
57 EXPORT_SYMBOL(cfs_timer_init);
58
59 void cfs_timer_arm(struct timer_list *t, cfs_time_t deadline)
60 {
61         mod_timer(t, deadline);
62 }
63 EXPORT_SYMBOL(cfs_timer_arm);
64
65 void cfs_timer_disarm(struct timer_list *t)
66 {
67         del_timer(t);
68 }
69 EXPORT_SYMBOL(cfs_timer_disarm);
70
71 int  cfs_timer_is_armed(struct timer_list *t)
72 {
73         return timer_pending(t);
74 }
75 EXPORT_SYMBOL(cfs_timer_is_armed);
76
77 cfs_time_t cfs_timer_deadline(struct timer_list *t)
78 {
79         return t->expires;
80 }
81 EXPORT_SYMBOL(cfs_timer_deadline);
82
83 #ifndef HAVE_KTIME_GET_REAL_TS64
84 void ktime_get_real_ts64(struct timespec64 *ts)
85 {
86         *ts = timespec_to_timespec64(CURRENT_TIME);
87 }
88 EXPORT_SYMBOL(ktime_get_real_ts64);
89 #endif /* HAVE_KTIME_GET_REAL_TS64 */
90
91 sigset_t
92 cfs_block_allsigs(void)
93 {
94         unsigned long   flags;
95         sigset_t        old;
96
97         spin_lock_irqsave(&current->sighand->siglock, flags);
98         old = current->blocked;
99         sigfillset(&current->blocked);
100         recalc_sigpending();
101         spin_unlock_irqrestore(&current->sighand->siglock, flags);
102         return old;
103 }
104 EXPORT_SYMBOL(cfs_block_allsigs);
105
106 sigset_t cfs_block_sigs(unsigned long sigs)
107 {
108         unsigned long  flags;
109         sigset_t        old;
110
111         spin_lock_irqsave(&current->sighand->siglock, flags);
112         old = current->blocked;
113         sigaddsetmask(&current->blocked, sigs);
114         recalc_sigpending();
115         spin_unlock_irqrestore(&current->sighand->siglock, flags);
116         return old;
117 }
118 EXPORT_SYMBOL(cfs_block_sigs);
119
120 /* Block all signals except for the @sigs */
121 sigset_t cfs_block_sigsinv(unsigned long sigs)
122 {
123         unsigned long flags;
124         sigset_t old;
125
126         spin_lock_irqsave(&current->sighand->siglock, flags);
127         old = current->blocked;
128         sigaddsetmask(&current->blocked, ~sigs);
129         recalc_sigpending();
130         spin_unlock_irqrestore(&current->sighand->siglock, flags);
131         return old;
132 }
133 EXPORT_SYMBOL(cfs_block_sigsinv);
134
135 void
136 cfs_restore_sigs(sigset_t old)
137 {
138         unsigned long  flags;
139
140         spin_lock_irqsave(&current->sighand->siglock, flags);
141         current->blocked = old;
142         recalc_sigpending();
143         spin_unlock_irqrestore(&current->sighand->siglock, flags);
144 }
145 EXPORT_SYMBOL(cfs_restore_sigs);
146
147 void
148 cfs_clear_sigpending(void)
149 {
150         unsigned long flags;
151
152         spin_lock_irqsave(&current->sighand->siglock, flags);
153         clear_tsk_thread_flag(current, TIF_SIGPENDING);
154         spin_unlock_irqrestore(&current->sighand->siglock, flags);
155 }
156 EXPORT_SYMBOL(cfs_clear_sigpending);