1
2
3
4
5
6#ifndef O2CLUSTER_MASKLOG_H
7#define O2CLUSTER_MASKLOG_H
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include <linux/sched.h>
66
67
68
69#define ML_TCP 0x0000000000000001ULL
70#define ML_MSG 0x0000000000000002ULL
71#define ML_SOCKET 0x0000000000000004ULL
72#define ML_HEARTBEAT 0x0000000000000008ULL
73#define ML_HB_BIO 0x0000000000000010ULL
74#define ML_DLMFS 0x0000000000000020ULL
75#define ML_DLM 0x0000000000000040ULL
76#define ML_DLM_DOMAIN 0x0000000000000080ULL
77#define ML_DLM_THREAD 0x0000000000000100ULL
78#define ML_DLM_MASTER 0x0000000000000200ULL
79#define ML_DLM_RECOVERY 0x0000000000000400ULL
80#define ML_DLM_GLUE 0x0000000000000800ULL
81#define ML_VOTE 0x0000000000001000ULL
82#define ML_CONN 0x0000000000002000ULL
83#define ML_QUORUM 0x0000000000004000ULL
84#define ML_BASTS 0x0000000000008000ULL
85#define ML_CLUSTER 0x0000000000010000ULL
86
87
88#define ML_ERROR 0x1000000000000000ULL
89#define ML_NOTICE 0x2000000000000000ULL
90#define ML_KTHREAD 0x4000000000000000ULL
91
92#define MLOG_INITIAL_AND_MASK (ML_ERROR|ML_NOTICE)
93#ifndef MLOG_MASK_PREFIX
94#define MLOG_MASK_PREFIX 0
95#endif
96
97
98
99
100
101
102#if defined(CONFIG_OCFS2_DEBUG_MASKLOG)
103#define ML_ALLOWED_BITS ~0
104#else
105#define ML_ALLOWED_BITS (ML_ERROR|ML_NOTICE)
106#endif
107
108#define MLOG_MAX_BITS 64
109
110struct mlog_bits {
111 unsigned long words[MLOG_MAX_BITS / BITS_PER_LONG];
112};
113
114extern struct mlog_bits mlog_and_bits, mlog_not_bits;
115
116#if BITS_PER_LONG == 32
117
118#define __mlog_test_u64(mask, bits) \
119 ( (u32)(mask & 0xffffffff) & bits.words[0] || \
120 ((u64)(mask) >> 32) & bits.words[1] )
121#define __mlog_set_u64(mask, bits) do { \
122 bits.words[0] |= (u32)(mask & 0xffffffff); \
123 bits.words[1] |= (u64)(mask) >> 32; \
124} while (0)
125#define __mlog_clear_u64(mask, bits) do { \
126 bits.words[0] &= ~((u32)(mask & 0xffffffff)); \
127 bits.words[1] &= ~((u64)(mask) >> 32); \
128} while (0)
129#define MLOG_BITS_RHS(mask) { \
130 { \
131 [0] = (u32)(mask & 0xffffffff), \
132 [1] = (u64)(mask) >> 32, \
133 } \
134}
135
136#else
137
138#define __mlog_test_u64(mask, bits) ((mask) & bits.words[0])
139#define __mlog_set_u64(mask, bits) do { \
140 bits.words[0] |= (mask); \
141} while (0)
142#define __mlog_clear_u64(mask, bits) do { \
143 bits.words[0] &= ~(mask); \
144} while (0)
145#define MLOG_BITS_RHS(mask) { { (mask) } }
146
147#endif
148
149__printf(4, 5)
150void __mlog_printk(const u64 *m, const char *func, int line,
151 const char *fmt, ...);
152
153
154
155
156
157#define mlog(mask, fmt, ...) \
158do { \
159 u64 _m = MLOG_MASK_PREFIX | (mask); \
160 if (_m & ML_ALLOWED_BITS) \
161 __mlog_printk(&_m, __func__, __LINE__, fmt, \
162 ##__VA_ARGS__); \
163} while (0)
164
165#define mlog_ratelimited(mask, fmt, ...) \
166do { \
167 static DEFINE_RATELIMIT_STATE(_rs, \
168 DEFAULT_RATELIMIT_INTERVAL, \
169 DEFAULT_RATELIMIT_BURST); \
170 if (__ratelimit(&_rs)) \
171 mlog(mask, fmt, ##__VA_ARGS__); \
172} while (0)
173
174#define mlog_errno(st) ({ \
175 int _st = (st); \
176 if (_st != -ERESTARTSYS && _st != -EINTR && \
177 _st != AOP_TRUNCATED_PAGE && _st != -ENOSPC && \
178 _st != -EDQUOT) \
179 mlog(ML_ERROR, "status = %lld\n", (long long)_st); \
180 _st; \
181})
182
183#define mlog_bug_on_msg(cond, fmt, args...) do { \
184 if (cond) { \
185 mlog(ML_ERROR, "bug expression: " #cond "\n"); \
186 mlog(ML_ERROR, fmt, ##args); \
187 BUG(); \
188 } \
189} while (0)
190
191#include <linux/kobject.h>
192#include <linux/sysfs.h>
193int mlog_sys_init(struct kset *o2cb_subsys);
194void mlog_sys_shutdown(void);
195
196#endif
197