xref: /openbmc/linux/fs/gfs2/util.h (revision b181f7029bd71238ac2754ce7052dffd69432085)
17336d0e6SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2b3b94faaSDavid Teigland /*
3b3b94faaSDavid Teigland  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
43a8a9a10SSteven Whitehouse  * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
5b3b94faaSDavid Teigland  */
6b3b94faaSDavid Teigland 
7b3b94faaSDavid Teigland #ifndef __UTIL_DOT_H__
8b3b94faaSDavid Teigland #define __UTIL_DOT_H__
9b3b94faaSDavid Teigland 
10d77d1b58SJoe Perches #ifdef pr_fmt
11d77d1b58SJoe Perches #undef pr_fmt
12d77d1b58SJoe Perches #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13d77d1b58SJoe Perches #endif
14d77d1b58SJoe Perches 
1575ca61c1SSteven Whitehouse #include <linux/mempool.h>
1675ca61c1SSteven Whitehouse 
17f2f7ba52SSteven Whitehouse #include "incore.h"
18b3b94faaSDavid Teigland 
198382e26bSJoe Perches #define fs_emerg(fs, fmt, ...)						\
208382e26bSJoe Perches 	pr_emerg("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__)
21d77d1b58SJoe Perches #define fs_warn(fs, fmt, ...)						\
22d77d1b58SJoe Perches 	pr_warn("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__)
23d77d1b58SJoe Perches #define fs_err(fs, fmt, ...)						\
24d77d1b58SJoe Perches 	pr_err("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__)
25d77d1b58SJoe Perches #define fs_info(fs, fmt, ...)						\
26d77d1b58SJoe Perches 	pr_info("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__)
27b3b94faaSDavid Teigland 
28b3b94faaSDavid Teigland void gfs2_assert_i(struct gfs2_sbd *sdp);
29b3b94faaSDavid Teigland 
30b3b94faaSDavid Teigland #define gfs2_assert(sdp, assertion) \
31b3b94faaSDavid Teigland do { \
32b3b94faaSDavid Teigland 	if (unlikely(!(assertion))) { \
33b3b94faaSDavid Teigland 		gfs2_assert_i(sdp); \
341e09ae54SSteven Whitehouse 		BUG(); \
35b3b94faaSDavid Teigland         } \
36b3b94faaSDavid Teigland } while (0)
37b3b94faaSDavid Teigland 
38b3b94faaSDavid Teigland 
398e28ef1fSAndreas Gruenbacher void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
40ca399c96SBob Peterson 			    const char *function, char *file, unsigned int line,
41ca399c96SBob Peterson 			    bool delayed);
42b3b94faaSDavid Teigland 
43b3b94faaSDavid Teigland #define gfs2_assert_withdraw(sdp, assertion) \
448e28ef1fSAndreas Gruenbacher 	({ \
458e28ef1fSAndreas Gruenbacher 		bool _bool = (assertion); \
468e28ef1fSAndreas Gruenbacher 		if (unlikely(!_bool)) \
478e28ef1fSAndreas Gruenbacher 			gfs2_assert_withdraw_i((sdp), #assertion, \
48ca399c96SBob Peterson 					__func__, __FILE__, __LINE__, false); \
49ca399c96SBob Peterson 		!_bool; \
50ca399c96SBob Peterson 	})
51ca399c96SBob Peterson 
52ca399c96SBob Peterson #define gfs2_assert_withdraw_delayed(sdp, assertion) \
53ca399c96SBob Peterson 	({ \
54ca399c96SBob Peterson 		bool _bool = (assertion); \
55ca399c96SBob Peterson 		if (unlikely(!_bool)) \
56ca399c96SBob Peterson 			gfs2_assert_withdraw_i((sdp), #assertion, \
57ca399c96SBob Peterson 					__func__, __FILE__, __LINE__, true); \
588e28ef1fSAndreas Gruenbacher 		!_bool; \
598e28ef1fSAndreas Gruenbacher 	})
60b3b94faaSDavid Teigland 
618e28ef1fSAndreas Gruenbacher void gfs2_assert_warn_i(struct gfs2_sbd *sdp, char *assertion,
62b3b94faaSDavid Teigland 			const char *function, char *file, unsigned int line);
63b3b94faaSDavid Teigland 
64b3b94faaSDavid Teigland #define gfs2_assert_warn(sdp, assertion) \
658e28ef1fSAndreas Gruenbacher 	({ \
668e28ef1fSAndreas Gruenbacher 		bool _bool = (assertion); \
678e28ef1fSAndreas Gruenbacher 		if (unlikely(!_bool)) \
688e28ef1fSAndreas Gruenbacher 			gfs2_assert_warn_i((sdp), #assertion, \
698e28ef1fSAndreas Gruenbacher 					__func__, __FILE__, __LINE__); \
708e28ef1fSAndreas Gruenbacher 		!_bool; \
718e28ef1fSAndreas Gruenbacher 	})
72b3b94faaSDavid Teigland 
73a5ca2f1cSAndreas Gruenbacher void gfs2_consist_i(struct gfs2_sbd *sdp,
74b3b94faaSDavid Teigland 		    const char *function, char *file, unsigned int line);
75b3b94faaSDavid Teigland 
76b3b94faaSDavid Teigland #define gfs2_consist(sdp) \
77d7e7ab3fSAndreas Gruenbacher gfs2_consist_i((sdp), __func__, __FILE__, __LINE__)
78b3b94faaSDavid Teigland 
79b3b94faaSDavid Teigland 
80a5ca2f1cSAndreas Gruenbacher void gfs2_consist_inode_i(struct gfs2_inode *ip,
81b3b94faaSDavid Teigland 			  const char *function, char *file, unsigned int line);
82b3b94faaSDavid Teigland 
83b3b94faaSDavid Teigland #define gfs2_consist_inode(ip) \
84d7e7ab3fSAndreas Gruenbacher gfs2_consist_inode_i((ip), __func__, __FILE__, __LINE__)
85b3b94faaSDavid Teigland 
86b3b94faaSDavid Teigland 
87a5ca2f1cSAndreas Gruenbacher void gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd,
88b3b94faaSDavid Teigland 			  const char *function, char *file, unsigned int line);
89b3b94faaSDavid Teigland 
90b3b94faaSDavid Teigland #define gfs2_consist_rgrpd(rgd) \
91d7e7ab3fSAndreas Gruenbacher gfs2_consist_rgrpd_i((rgd), __func__, __FILE__, __LINE__)
92b3b94faaSDavid Teigland 
93b3b94faaSDavid Teigland 
94b3b94faaSDavid Teigland int gfs2_meta_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
95b3b94faaSDavid Teigland 		       const char *type, const char *function,
96b3b94faaSDavid Teigland 		       char *file, unsigned int line);
97b3b94faaSDavid Teigland 
gfs2_meta_check(struct gfs2_sbd * sdp,struct buffer_head * bh)981b8ba31aSSteven Whitehouse static inline int gfs2_meta_check(struct gfs2_sbd *sdp,
991b8ba31aSSteven Whitehouse 				    struct buffer_head *bh)
100b3b94faaSDavid Teigland {
101b3b94faaSDavid Teigland 	struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
102b44b84d7SAl Viro 	u32 magic = be32_to_cpu(mh->mh_magic);
1031b8ba31aSSteven Whitehouse 	if (unlikely(magic != GFS2_MAGIC)) {
104e54c78a2SBob Peterson 		fs_err(sdp, "Magic number missing at %llu\n",
1051b8ba31aSSteven Whitehouse 		       (unsigned long long)bh->b_blocknr);
1061b8ba31aSSteven Whitehouse 		return -EIO;
1071b8ba31aSSteven Whitehouse 	}
108b3b94faaSDavid Teigland 	return 0;
109b3b94faaSDavid Teigland }
110b3b94faaSDavid Teigland 
111b3b94faaSDavid Teigland int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
112cd915493SSteven Whitehouse 			   u16 type, u16 t,
113b3b94faaSDavid Teigland 			   const char *function,
114b3b94faaSDavid Teigland 			   char *file, unsigned int line);
115b3b94faaSDavid Teigland 
gfs2_metatype_check_i(struct gfs2_sbd * sdp,struct buffer_head * bh,u16 type,const char * function,char * file,unsigned int line)116b3b94faaSDavid Teigland static inline int gfs2_metatype_check_i(struct gfs2_sbd *sdp,
117b3b94faaSDavid Teigland 					struct buffer_head *bh,
118cd915493SSteven Whitehouse 					u16 type,
119b3b94faaSDavid Teigland 					const char *function,
120b3b94faaSDavid Teigland 					char *file, unsigned int line)
121b3b94faaSDavid Teigland {
122b3b94faaSDavid Teigland 	struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
123b44b84d7SAl Viro 	u32 magic = be32_to_cpu(mh->mh_magic);
124cd915493SSteven Whitehouse 	u16 t = be32_to_cpu(mh->mh_type);
125b3b94faaSDavid Teigland 	if (unlikely(magic != GFS2_MAGIC))
126b3b94faaSDavid Teigland 		return gfs2_meta_check_ii(sdp, bh, "magic number", function,
127b3b94faaSDavid Teigland 					  file, line);
128b3b94faaSDavid Teigland         if (unlikely(t != type))
129b3b94faaSDavid Teigland 		return gfs2_metatype_check_ii(sdp, bh, type, t, function,
130b3b94faaSDavid Teigland 					      file, line);
131b3b94faaSDavid Teigland 	return 0;
132b3b94faaSDavid Teigland }
133b3b94faaSDavid Teigland 
134b3b94faaSDavid Teigland #define gfs2_metatype_check(sdp, bh, type) \
1358e24eea7SHarvey Harrison gfs2_metatype_check_i((sdp), (bh), (type), __func__, __FILE__, __LINE__)
136b3b94faaSDavid Teigland 
gfs2_metatype_set(struct buffer_head * bh,u16 type,u16 format)137cd915493SSteven Whitehouse static inline void gfs2_metatype_set(struct buffer_head *bh, u16 type,
138cd915493SSteven Whitehouse 				     u16 format)
139b3b94faaSDavid Teigland {
140b3b94faaSDavid Teigland 	struct gfs2_meta_header *mh;
141b3b94faaSDavid Teigland 	mh = (struct gfs2_meta_header *)bh->b_data;
142e3167dedSSteven Whitehouse 	mh->mh_type = cpu_to_be32(type);
143e3167dedSSteven Whitehouse 	mh->mh_format = cpu_to_be32(format);
144b3b94faaSDavid Teigland }
145b3b94faaSDavid Teigland 
146b3b94faaSDavid Teigland 
147b3b94faaSDavid Teigland int gfs2_io_error_i(struct gfs2_sbd *sdp, const char *function,
148b3b94faaSDavid Teigland 		    char *file, unsigned int line);
1497d9f9249SBob Peterson 
150d312fbf6SAndreas Gruenbacher int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
1517d9f9249SBob Peterson 		        bool verbose);
152d312fbf6SAndreas Gruenbacher int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp);
153d312fbf6SAndreas Gruenbacher void gfs2_freeze_unlock(struct gfs2_holder *freeze_gh);
154b3b94faaSDavid Teigland 
155b3b94faaSDavid Teigland #define gfs2_io_error(sdp) \
15628c332b9STom Rix gfs2_io_error_i((sdp), __func__, __FILE__, __LINE__)
157b3b94faaSDavid Teigland 
158b3b94faaSDavid Teigland 
1599e1a9ecdSAndreas Gruenbacher void gfs2_io_error_bh_i(struct gfs2_sbd *sdp, struct buffer_head *bh,
1609e1a9ecdSAndreas Gruenbacher 			const char *function, char *file, unsigned int line,
1619e1a9ecdSAndreas Gruenbacher 			bool withdraw);
1629e1a9ecdSAndreas Gruenbacher 
1639e1a9ecdSAndreas Gruenbacher #define gfs2_io_error_bh_wd(sdp, bh) \
16428c332b9STom Rix gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, true)
165b3b94faaSDavid Teigland 
166b3b94faaSDavid Teigland #define gfs2_io_error_bh(sdp, bh) \
16728c332b9STom Rix gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, false)
168b3b94faaSDavid Teigland 
169b3b94faaSDavid Teigland 
170e18b890bSChristoph Lameter extern struct kmem_cache *gfs2_glock_cachep;
171009d8518SSteven Whitehouse extern struct kmem_cache *gfs2_glock_aspace_cachep;
172e18b890bSChristoph Lameter extern struct kmem_cache *gfs2_inode_cachep;
173e18b890bSChristoph Lameter extern struct kmem_cache *gfs2_bufdata_cachep;
1746bdd9be6SBob Peterson extern struct kmem_cache *gfs2_rgrpd_cachep;
17537b2c837SSteven Whitehouse extern struct kmem_cache *gfs2_quotad_cachep;
176b54e9a0bSBob Peterson extern struct kmem_cache *gfs2_qadata_cachep;
177b839dadaSBob Peterson extern struct kmem_cache *gfs2_trans_cachep;
178e8c92ed7SSteven Whitehouse extern mempool_t *gfs2_page_pool;
17927c3b415SBob Peterson extern struct workqueue_struct *gfs2_control_wq;
180b3b94faaSDavid Teigland 
gfs2_tune_get_i(struct gfs2_tune * gt,unsigned int * p)181b3b94faaSDavid Teigland static inline unsigned int gfs2_tune_get_i(struct gfs2_tune *gt,
182b3b94faaSDavid Teigland 					   unsigned int *p)
183b3b94faaSDavid Teigland {
184b3b94faaSDavid Teigland 	unsigned int x;
185b3b94faaSDavid Teigland 	spin_lock(&gt->gt_spin);
186b3b94faaSDavid Teigland 	x = *p;
187b3b94faaSDavid Teigland 	spin_unlock(&gt->gt_spin);
188b3b94faaSDavid Teigland 	return x;
189b3b94faaSDavid Teigland }
190b3b94faaSDavid Teigland 
191eb43e660SBob Peterson /**
19269511080SBob Peterson  * gfs2_withdraw_delayed - withdraw as soon as possible without deadlocks
19369511080SBob Peterson  * @sdp: the superblock
19469511080SBob Peterson  */
gfs2_withdraw_delayed(struct gfs2_sbd * sdp)19569511080SBob Peterson static inline void gfs2_withdraw_delayed(struct gfs2_sbd *sdp)
19669511080SBob Peterson {
19769511080SBob Peterson 	set_bit(SDF_WITHDRAWING, &sdp->sd_flags);
19869511080SBob Peterson }
19969511080SBob Peterson 
20069511080SBob Peterson /**
201*d6b412c5SAndreas Gruenbacher  * gfs2_withdrawing_or_withdrawn - test whether the file system is withdrawing
202*d6b412c5SAndreas Gruenbacher  *                                 or withdrawn
203eb43e660SBob Peterson  * @sdp: the superblock
204eb43e660SBob Peterson  */
gfs2_withdrawing_or_withdrawn(struct gfs2_sbd * sdp)205*d6b412c5SAndreas Gruenbacher static inline bool gfs2_withdrawing_or_withdrawn(struct gfs2_sbd *sdp)
206eb43e660SBob Peterson {
2077c2bc932SAndreas Gruenbacher 	return unlikely(test_bit(SDF_WITHDRAWN, &sdp->sd_flags) ||
2087c2bc932SAndreas Gruenbacher 			test_bit(SDF_WITHDRAWING, &sdp->sd_flags));
209eb43e660SBob Peterson }
210eb43e660SBob Peterson 
2115a61ae14SAndreas Gruenbacher /**
2125a61ae14SAndreas Gruenbacher  * gfs2_withdrawing - check if a withdraw is pending
2135a61ae14SAndreas Gruenbacher  * @sdp: the superblock
2145a61ae14SAndreas Gruenbacher  */
gfs2_withdrawing(struct gfs2_sbd * sdp)2155a61ae14SAndreas Gruenbacher static inline bool gfs2_withdrawing(struct gfs2_sbd *sdp)
2165a61ae14SAndreas Gruenbacher {
2177c2bc932SAndreas Gruenbacher 	return unlikely(test_bit(SDF_WITHDRAWING, &sdp->sd_flags) &&
2187c2bc932SAndreas Gruenbacher 			!test_bit(SDF_WITHDRAWN, &sdp->sd_flags));
2195a61ae14SAndreas Gruenbacher }
2205a61ae14SAndreas Gruenbacher 
gfs2_withdraw_in_prog(struct gfs2_sbd * sdp)2218cc67f70SBob Peterson static inline bool gfs2_withdraw_in_prog(struct gfs2_sbd *sdp)
2228cc67f70SBob Peterson {
2237c2bc932SAndreas Gruenbacher 	return unlikely(test_bit(SDF_WITHDRAW_IN_PROG, &sdp->sd_flags));
2248cc67f70SBob Peterson }
2258cc67f70SBob Peterson 
226b3b94faaSDavid Teigland #define gfs2_tune_get(sdp, field) \
227b3b94faaSDavid Teigland gfs2_tune_get_i(&(sdp)->sd_tune, &(sdp)->sd_tune.field)
228b3b94faaSDavid Teigland 
229cb94eb06SJoe Perches __printf(2, 3)
230badb55ecSAndreas Gruenbacher void gfs2_lm(struct gfs2_sbd *sdp, const char *fmt, ...);
231badb55ecSAndreas Gruenbacher int gfs2_withdraw(struct gfs2_sbd *sdp);
232b3b94faaSDavid Teigland 
233b3b94faaSDavid Teigland #endif /* __UTIL_DOT_H__ */
234