0001
0002
0003
0004
0005
0006 #ifndef O2CLUSTER_MASKLOG_H
0007 #define O2CLUSTER_MASKLOG_H
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065 #include <linux/sched.h>
0066
0067
0068
0069 #define ML_TCP 0x0000000000000001ULL
0070 #define ML_MSG 0x0000000000000002ULL
0071 #define ML_SOCKET 0x0000000000000004ULL
0072 #define ML_HEARTBEAT 0x0000000000000008ULL
0073 #define ML_HB_BIO 0x0000000000000010ULL
0074 #define ML_DLMFS 0x0000000000000020ULL
0075 #define ML_DLM 0x0000000000000040ULL
0076 #define ML_DLM_DOMAIN 0x0000000000000080ULL
0077 #define ML_DLM_THREAD 0x0000000000000100ULL
0078 #define ML_DLM_MASTER 0x0000000000000200ULL
0079 #define ML_DLM_RECOVERY 0x0000000000000400ULL
0080 #define ML_DLM_GLUE 0x0000000000000800ULL
0081 #define ML_VOTE 0x0000000000001000ULL
0082 #define ML_CONN 0x0000000000002000ULL
0083 #define ML_QUORUM 0x0000000000004000ULL
0084 #define ML_BASTS 0x0000000000008000ULL
0085 #define ML_CLUSTER 0x0000000000010000ULL
0086
0087
0088 #define ML_ERROR 0x1000000000000000ULL
0089 #define ML_NOTICE 0x2000000000000000ULL
0090 #define ML_KTHREAD 0x4000000000000000ULL
0091
0092 #define MLOG_INITIAL_AND_MASK (ML_ERROR|ML_NOTICE)
0093 #ifndef MLOG_MASK_PREFIX
0094 #define MLOG_MASK_PREFIX 0
0095 #endif
0096
0097
0098
0099
0100
0101
0102 #if defined(CONFIG_OCFS2_DEBUG_MASKLOG)
0103 #define ML_ALLOWED_BITS ~0
0104 #else
0105 #define ML_ALLOWED_BITS (ML_ERROR|ML_NOTICE)
0106 #endif
0107
0108 #define MLOG_MAX_BITS 64
0109
0110 struct mlog_bits {
0111 unsigned long words[MLOG_MAX_BITS / BITS_PER_LONG];
0112 };
0113
0114 extern struct mlog_bits mlog_and_bits, mlog_not_bits;
0115
0116 #if BITS_PER_LONG == 32
0117
0118 #define __mlog_test_u64(mask, bits) \
0119 ( (u32)(mask & 0xffffffff) & bits.words[0] || \
0120 ((u64)(mask) >> 32) & bits.words[1] )
0121 #define __mlog_set_u64(mask, bits) do { \
0122 bits.words[0] |= (u32)(mask & 0xffffffff); \
0123 bits.words[1] |= (u64)(mask) >> 32; \
0124 } while (0)
0125 #define __mlog_clear_u64(mask, bits) do { \
0126 bits.words[0] &= ~((u32)(mask & 0xffffffff)); \
0127 bits.words[1] &= ~((u64)(mask) >> 32); \
0128 } while (0)
0129 #define MLOG_BITS_RHS(mask) { \
0130 { \
0131 [0] = (u32)(mask & 0xffffffff), \
0132 [1] = (u64)(mask) >> 32, \
0133 } \
0134 }
0135
0136 #else
0137
0138 #define __mlog_test_u64(mask, bits) ((mask) & bits.words[0])
0139 #define __mlog_set_u64(mask, bits) do { \
0140 bits.words[0] |= (mask); \
0141 } while (0)
0142 #define __mlog_clear_u64(mask, bits) do { \
0143 bits.words[0] &= ~(mask); \
0144 } while (0)
0145 #define MLOG_BITS_RHS(mask) { { (mask) } }
0146
0147 #endif
0148
0149 __printf(4, 5)
0150 void __mlog_printk(const u64 *m, const char *func, int line,
0151 const char *fmt, ...);
0152
0153
0154
0155
0156
0157 #define mlog(mask, fmt, ...) \
0158 do { \
0159 u64 _m = MLOG_MASK_PREFIX | (mask); \
0160 if (_m & ML_ALLOWED_BITS) \
0161 __mlog_printk(&_m, __func__, __LINE__, fmt, \
0162 ##__VA_ARGS__); \
0163 } while (0)
0164
0165 #define mlog_ratelimited(mask, fmt, ...) \
0166 do { \
0167 static DEFINE_RATELIMIT_STATE(_rs, \
0168 DEFAULT_RATELIMIT_INTERVAL, \
0169 DEFAULT_RATELIMIT_BURST); \
0170 if (__ratelimit(&_rs)) \
0171 mlog(mask, fmt, ##__VA_ARGS__); \
0172 } while (0)
0173
0174 #define mlog_errno(st) ({ \
0175 int _st = (st); \
0176 if (_st != -ERESTARTSYS && _st != -EINTR && \
0177 _st != AOP_TRUNCATED_PAGE && _st != -ENOSPC && \
0178 _st != -EDQUOT) \
0179 mlog(ML_ERROR, "status = %lld\n", (long long)_st); \
0180 _st; \
0181 })
0182
0183 #define mlog_bug_on_msg(cond, fmt, args...) do { \
0184 if (cond) { \
0185 mlog(ML_ERROR, "bug expression: " #cond "\n"); \
0186 mlog(ML_ERROR, fmt, ##args); \
0187 BUG(); \
0188 } \
0189 } while (0)
0190
0191 #include <linux/kobject.h>
0192 #include <linux/sysfs.h>
0193 int mlog_sys_init(struct kset *o2cb_subsys);
0194 void mlog_sys_shutdown(void);
0195
0196 #endif