]>
Commit | Line | Data |
---|---|---|
7336d0e6 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
b3b94faa DT |
2 | /* |
3 | * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. | |
3a8a9a10 | 4 | * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. |
b3b94faa DT |
5 | */ |
6 | ||
7 | #ifndef __UTIL_DOT_H__ | |
8 | #define __UTIL_DOT_H__ | |
9 | ||
d77d1b58 JP |
10 | #ifdef pr_fmt |
11 | #undef pr_fmt | |
12 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | |
13 | #endif | |
14 | ||
75ca61c1 SW |
15 | #include <linux/mempool.h> |
16 | ||
f2f7ba52 | 17 | #include "incore.h" |
b3b94faa | 18 | |
8382e26b JP |
19 | #define fs_emerg(fs, fmt, ...) \ |
20 | pr_emerg("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__) | |
d77d1b58 JP |
21 | #define fs_warn(fs, fmt, ...) \ |
22 | pr_warn("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__) | |
23 | #define fs_err(fs, fmt, ...) \ | |
24 | pr_err("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__) | |
25 | #define fs_info(fs, fmt, ...) \ | |
26 | pr_info("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__) | |
b3b94faa DT |
27 | |
28 | void gfs2_assert_i(struct gfs2_sbd *sdp); | |
29 | ||
30 | #define gfs2_assert(sdp, assertion) \ | |
31 | do { \ | |
32 | if (unlikely(!(assertion))) { \ | |
33 | gfs2_assert_i(sdp); \ | |
1e09ae54 | 34 | BUG(); \ |
b3b94faa DT |
35 | } \ |
36 | } while (0) | |
37 | ||
38 | ||
8e28ef1f | 39 | void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion, |
ca399c96 BP |
40 | const char *function, char *file, unsigned int line, |
41 | bool delayed); | |
b3b94faa DT |
42 | |
43 | #define gfs2_assert_withdraw(sdp, assertion) \ | |
8e28ef1f AG |
44 | ({ \ |
45 | bool _bool = (assertion); \ | |
46 | if (unlikely(!_bool)) \ | |
47 | gfs2_assert_withdraw_i((sdp), #assertion, \ | |
ca399c96 BP |
48 | __func__, __FILE__, __LINE__, false); \ |
49 | !_bool; \ | |
50 | }) | |
51 | ||
52 | #define gfs2_assert_withdraw_delayed(sdp, assertion) \ | |
53 | ({ \ | |
54 | bool _bool = (assertion); \ | |
55 | if (unlikely(!_bool)) \ | |
56 | gfs2_assert_withdraw_i((sdp), #assertion, \ | |
57 | __func__, __FILE__, __LINE__, true); \ | |
8e28ef1f AG |
58 | !_bool; \ |
59 | }) | |
b3b94faa | 60 | |
8e28ef1f AG |
61 | void gfs2_assert_warn_i(struct gfs2_sbd *sdp, char *assertion, |
62 | const char *function, char *file, unsigned int line); | |
b3b94faa DT |
63 | |
64 | #define gfs2_assert_warn(sdp, assertion) \ | |
8e28ef1f AG |
65 | ({ \ |
66 | bool _bool = (assertion); \ | |
67 | if (unlikely(!_bool)) \ | |
68 | gfs2_assert_warn_i((sdp), #assertion, \ | |
69 | __func__, __FILE__, __LINE__); \ | |
70 | !_bool; \ | |
71 | }) | |
b3b94faa | 72 | |
a5ca2f1c AG |
73 | void gfs2_consist_i(struct gfs2_sbd *sdp, |
74 | const char *function, char *file, unsigned int line); | |
b3b94faa DT |
75 | |
76 | #define gfs2_consist(sdp) \ | |
d7e7ab3f | 77 | gfs2_consist_i((sdp), __func__, __FILE__, __LINE__) |
b3b94faa DT |
78 | |
79 | ||
a5ca2f1c AG |
80 | void gfs2_consist_inode_i(struct gfs2_inode *ip, |
81 | const char *function, char *file, unsigned int line); | |
b3b94faa DT |
82 | |
83 | #define gfs2_consist_inode(ip) \ | |
d7e7ab3f | 84 | gfs2_consist_inode_i((ip), __func__, __FILE__, __LINE__) |
b3b94faa DT |
85 | |
86 | ||
a5ca2f1c AG |
87 | void gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd, |
88 | const char *function, char *file, unsigned int line); | |
b3b94faa DT |
89 | |
90 | #define gfs2_consist_rgrpd(rgd) \ | |
d7e7ab3f | 91 | gfs2_consist_rgrpd_i((rgd), __func__, __FILE__, __LINE__) |
b3b94faa DT |
92 | |
93 | ||
94 | int gfs2_meta_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh, | |
95 | const char *type, const char *function, | |
96 | char *file, unsigned int line); | |
97 | ||
1b8ba31a SW |
98 | static inline int gfs2_meta_check(struct gfs2_sbd *sdp, |
99 | struct buffer_head *bh) | |
b3b94faa DT |
100 | { |
101 | struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data; | |
b44b84d7 | 102 | u32 magic = be32_to_cpu(mh->mh_magic); |
1b8ba31a | 103 | if (unlikely(magic != GFS2_MAGIC)) { |
e54c78a2 | 104 | fs_err(sdp, "Magic number missing at %llu\n", |
1b8ba31a SW |
105 | (unsigned long long)bh->b_blocknr); |
106 | return -EIO; | |
107 | } | |
b3b94faa DT |
108 | return 0; |
109 | } | |
110 | ||
b3b94faa | 111 | int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh, |
cd915493 | 112 | u16 type, u16 t, |
b3b94faa DT |
113 | const char *function, |
114 | char *file, unsigned int line); | |
115 | ||
116 | static inline int gfs2_metatype_check_i(struct gfs2_sbd *sdp, | |
117 | struct buffer_head *bh, | |
cd915493 | 118 | u16 type, |
b3b94faa DT |
119 | const char *function, |
120 | char *file, unsigned int line) | |
121 | { | |
122 | struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data; | |
b44b84d7 | 123 | u32 magic = be32_to_cpu(mh->mh_magic); |
cd915493 | 124 | u16 t = be32_to_cpu(mh->mh_type); |
b3b94faa DT |
125 | if (unlikely(magic != GFS2_MAGIC)) |
126 | return gfs2_meta_check_ii(sdp, bh, "magic number", function, | |
127 | file, line); | |
b3b94faa DT |
128 | if (unlikely(t != type)) |
129 | return gfs2_metatype_check_ii(sdp, bh, type, t, function, | |
130 | file, line); | |
131 | return 0; | |
132 | } | |
133 | ||
134 | #define gfs2_metatype_check(sdp, bh, type) \ | |
8e24eea7 | 135 | gfs2_metatype_check_i((sdp), (bh), (type), __func__, __FILE__, __LINE__) |
b3b94faa | 136 | |
cd915493 SW |
137 | static inline void gfs2_metatype_set(struct buffer_head *bh, u16 type, |
138 | u16 format) | |
b3b94faa DT |
139 | { |
140 | struct gfs2_meta_header *mh; | |
141 | mh = (struct gfs2_meta_header *)bh->b_data; | |
e3167ded SW |
142 | mh->mh_type = cpu_to_be32(type); |
143 | mh->mh_format = cpu_to_be32(format); | |
b3b94faa DT |
144 | } |
145 | ||
146 | ||
147 | int gfs2_io_error_i(struct gfs2_sbd *sdp, const char *function, | |
148 | char *file, unsigned int line); | |
7d9f9249 BP |
149 | |
150 | extern int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, | |
151 | bool verbose); | |
b3b94faa DT |
152 | |
153 | #define gfs2_io_error(sdp) \ | |
8e24eea7 | 154 | gfs2_io_error_i((sdp), __func__, __FILE__, __LINE__); |
b3b94faa DT |
155 | |
156 | ||
9e1a9ecd AG |
157 | void gfs2_io_error_bh_i(struct gfs2_sbd *sdp, struct buffer_head *bh, |
158 | const char *function, char *file, unsigned int line, | |
159 | bool withdraw); | |
160 | ||
161 | #define gfs2_io_error_bh_wd(sdp, bh) \ | |
162 | gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, true); | |
b3b94faa DT |
163 | |
164 | #define gfs2_io_error_bh(sdp, bh) \ | |
9e1a9ecd | 165 | gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, false); |
b3b94faa DT |
166 | |
167 | ||
e18b890b | 168 | extern struct kmem_cache *gfs2_glock_cachep; |
009d8518 | 169 | extern struct kmem_cache *gfs2_glock_aspace_cachep; |
e18b890b CL |
170 | extern struct kmem_cache *gfs2_inode_cachep; |
171 | extern struct kmem_cache *gfs2_bufdata_cachep; | |
6bdd9be6 | 172 | extern struct kmem_cache *gfs2_rgrpd_cachep; |
37b2c837 | 173 | extern struct kmem_cache *gfs2_quotad_cachep; |
b54e9a0b | 174 | extern struct kmem_cache *gfs2_qadata_cachep; |
b839dada | 175 | extern struct kmem_cache *gfs2_trans_cachep; |
e8c92ed7 | 176 | extern mempool_t *gfs2_page_pool; |
27c3b415 | 177 | extern struct workqueue_struct *gfs2_control_wq; |
b3b94faa | 178 | |
b3b94faa DT |
179 | static inline unsigned int gfs2_tune_get_i(struct gfs2_tune *gt, |
180 | unsigned int *p) | |
181 | { | |
182 | unsigned int x; | |
183 | spin_lock(>->gt_spin); | |
184 | x = *p; | |
185 | spin_unlock(>->gt_spin); | |
186 | return x; | |
187 | } | |
188 | ||
69511080 BP |
189 | /** |
190 | * gfs2_withdraw_delayed - withdraw as soon as possible without deadlocks | |
191 | * @sdp: the superblock | |
192 | */ | |
193 | static inline void gfs2_withdraw_delayed(struct gfs2_sbd *sdp) | |
194 | { | |
195 | set_bit(SDF_WITHDRAWING, &sdp->sd_flags); | |
196 | } | |
197 | ||
eb43e660 BP |
198 | /** |
199 | * gfs2_withdrawn - test whether the file system is withdrawing or withdrawn | |
200 | * @sdp: the superblock | |
201 | */ | |
202 | static inline bool gfs2_withdrawn(struct gfs2_sbd *sdp) | |
203 | { | |
69511080 BP |
204 | return test_bit(SDF_WITHDRAWN, &sdp->sd_flags) || |
205 | test_bit(SDF_WITHDRAWING, &sdp->sd_flags); | |
eb43e660 BP |
206 | } |
207 | ||
5a61ae14 AG |
208 | /** |
209 | * gfs2_withdrawing - check if a withdraw is pending | |
210 | * @sdp: the superblock | |
211 | */ | |
212 | static inline bool gfs2_withdrawing(struct gfs2_sbd *sdp) | |
213 | { | |
214 | return test_bit(SDF_WITHDRAWING, &sdp->sd_flags) && | |
215 | !test_bit(SDF_WITHDRAWN, &sdp->sd_flags); | |
216 | } | |
217 | ||
b3b94faa DT |
218 | #define gfs2_tune_get(sdp, field) \ |
219 | gfs2_tune_get_i(&(sdp)->sd_tune, &(sdp)->sd_tune.field) | |
220 | ||
cb94eb06 | 221 | __printf(2, 3) |
badb55ec AG |
222 | void gfs2_lm(struct gfs2_sbd *sdp, const char *fmt, ...); |
223 | int gfs2_withdraw(struct gfs2_sbd *sdp); | |
b3b94faa DT |
224 | |
225 | #endif /* __UTIL_DOT_H__ */ |