xref: /openbmc/linux/fs/gfs2/util.h (revision 69511080bd6efd34f4e020fcde6cf73bb4a61af6)
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,
40b3b94faaSDavid Teigland 			    const char *function, char *file, unsigned int line);
41b3b94faaSDavid Teigland 
42b3b94faaSDavid Teigland #define gfs2_assert_withdraw(sdp, assertion) \
438e28ef1fSAndreas Gruenbacher 	({ \
448e28ef1fSAndreas Gruenbacher 		bool _bool = (assertion); \
458e28ef1fSAndreas Gruenbacher 		if (unlikely(!_bool)) \
468e28ef1fSAndreas Gruenbacher 			gfs2_assert_withdraw_i((sdp), #assertion, \
478e28ef1fSAndreas Gruenbacher 					__func__, __FILE__, __LINE__); \
488e28ef1fSAndreas Gruenbacher 		!_bool; \
498e28ef1fSAndreas Gruenbacher 	})
50b3b94faaSDavid Teigland 
518e28ef1fSAndreas Gruenbacher void gfs2_assert_warn_i(struct gfs2_sbd *sdp, char *assertion,
52b3b94faaSDavid Teigland 			const char *function, char *file, unsigned int line);
53b3b94faaSDavid Teigland 
54b3b94faaSDavid Teigland #define gfs2_assert_warn(sdp, assertion) \
558e28ef1fSAndreas Gruenbacher 	({ \
568e28ef1fSAndreas Gruenbacher 		bool _bool = (assertion); \
578e28ef1fSAndreas Gruenbacher 		if (unlikely(!_bool)) \
588e28ef1fSAndreas Gruenbacher 			gfs2_assert_warn_i((sdp), #assertion, \
598e28ef1fSAndreas Gruenbacher 					__func__, __FILE__, __LINE__); \
608e28ef1fSAndreas Gruenbacher 		!_bool; \
618e28ef1fSAndreas Gruenbacher 	})
62b3b94faaSDavid Teigland 
63a5ca2f1cSAndreas Gruenbacher void gfs2_consist_i(struct gfs2_sbd *sdp,
64b3b94faaSDavid Teigland 		    const char *function, char *file, unsigned int line);
65b3b94faaSDavid Teigland 
66b3b94faaSDavid Teigland #define gfs2_consist(sdp) \
67d7e7ab3fSAndreas Gruenbacher gfs2_consist_i((sdp), __func__, __FILE__, __LINE__)
68b3b94faaSDavid Teigland 
69b3b94faaSDavid Teigland 
70a5ca2f1cSAndreas Gruenbacher void gfs2_consist_inode_i(struct gfs2_inode *ip,
71b3b94faaSDavid Teigland 			  const char *function, char *file, unsigned int line);
72b3b94faaSDavid Teigland 
73b3b94faaSDavid Teigland #define gfs2_consist_inode(ip) \
74d7e7ab3fSAndreas Gruenbacher gfs2_consist_inode_i((ip), __func__, __FILE__, __LINE__)
75b3b94faaSDavid Teigland 
76b3b94faaSDavid Teigland 
77a5ca2f1cSAndreas Gruenbacher void gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd,
78b3b94faaSDavid Teigland 			  const char *function, char *file, unsigned int line);
79b3b94faaSDavid Teigland 
80b3b94faaSDavid Teigland #define gfs2_consist_rgrpd(rgd) \
81d7e7ab3fSAndreas Gruenbacher gfs2_consist_rgrpd_i((rgd), __func__, __FILE__, __LINE__)
82b3b94faaSDavid Teigland 
83b3b94faaSDavid Teigland 
84b3b94faaSDavid Teigland int gfs2_meta_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
85b3b94faaSDavid Teigland 		       const char *type, const char *function,
86b3b94faaSDavid Teigland 		       char *file, unsigned int line);
87b3b94faaSDavid Teigland 
881b8ba31aSSteven Whitehouse static inline int gfs2_meta_check(struct gfs2_sbd *sdp,
891b8ba31aSSteven Whitehouse 				    struct buffer_head *bh)
90b3b94faaSDavid Teigland {
91b3b94faaSDavid Teigland 	struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
92b44b84d7SAl Viro 	u32 magic = be32_to_cpu(mh->mh_magic);
931b8ba31aSSteven Whitehouse 	if (unlikely(magic != GFS2_MAGIC)) {
94e54c78a2SBob Peterson 		fs_err(sdp, "Magic number missing at %llu\n",
951b8ba31aSSteven Whitehouse 		       (unsigned long long)bh->b_blocknr);
961b8ba31aSSteven Whitehouse 		return -EIO;
971b8ba31aSSteven Whitehouse 	}
98b3b94faaSDavid Teigland 	return 0;
99b3b94faaSDavid Teigland }
100b3b94faaSDavid Teigland 
101b3b94faaSDavid Teigland int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
102cd915493SSteven Whitehouse 			   u16 type, u16 t,
103b3b94faaSDavid Teigland 			   const char *function,
104b3b94faaSDavid Teigland 			   char *file, unsigned int line);
105b3b94faaSDavid Teigland 
106b3b94faaSDavid Teigland static inline int gfs2_metatype_check_i(struct gfs2_sbd *sdp,
107b3b94faaSDavid Teigland 					struct buffer_head *bh,
108cd915493SSteven Whitehouse 					u16 type,
109b3b94faaSDavid Teigland 					const char *function,
110b3b94faaSDavid Teigland 					char *file, unsigned int line)
111b3b94faaSDavid Teigland {
112b3b94faaSDavid Teigland 	struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
113b44b84d7SAl Viro 	u32 magic = be32_to_cpu(mh->mh_magic);
114cd915493SSteven Whitehouse 	u16 t = be32_to_cpu(mh->mh_type);
115b3b94faaSDavid Teigland 	if (unlikely(magic != GFS2_MAGIC))
116b3b94faaSDavid Teigland 		return gfs2_meta_check_ii(sdp, bh, "magic number", function,
117b3b94faaSDavid Teigland 					  file, line);
118b3b94faaSDavid Teigland         if (unlikely(t != type))
119b3b94faaSDavid Teigland 		return gfs2_metatype_check_ii(sdp, bh, type, t, function,
120b3b94faaSDavid Teigland 					      file, line);
121b3b94faaSDavid Teigland 	return 0;
122b3b94faaSDavid Teigland }
123b3b94faaSDavid Teigland 
124b3b94faaSDavid Teigland #define gfs2_metatype_check(sdp, bh, type) \
1258e24eea7SHarvey Harrison gfs2_metatype_check_i((sdp), (bh), (type), __func__, __FILE__, __LINE__)
126b3b94faaSDavid Teigland 
127cd915493SSteven Whitehouse static inline void gfs2_metatype_set(struct buffer_head *bh, u16 type,
128cd915493SSteven Whitehouse 				     u16 format)
129b3b94faaSDavid Teigland {
130b3b94faaSDavid Teigland 	struct gfs2_meta_header *mh;
131b3b94faaSDavid Teigland 	mh = (struct gfs2_meta_header *)bh->b_data;
132e3167dedSSteven Whitehouse 	mh->mh_type = cpu_to_be32(type);
133e3167dedSSteven Whitehouse 	mh->mh_format = cpu_to_be32(format);
134b3b94faaSDavid Teigland }
135b3b94faaSDavid Teigland 
136b3b94faaSDavid Teigland 
137b3b94faaSDavid Teigland int gfs2_io_error_i(struct gfs2_sbd *sdp, const char *function,
138b3b94faaSDavid Teigland 		    char *file, unsigned int line);
139b3b94faaSDavid Teigland 
140b3b94faaSDavid Teigland #define gfs2_io_error(sdp) \
1418e24eea7SHarvey Harrison gfs2_io_error_i((sdp), __func__, __FILE__, __LINE__);
142b3b94faaSDavid Teigland 
143b3b94faaSDavid Teigland 
1449e1a9ecdSAndreas Gruenbacher void gfs2_io_error_bh_i(struct gfs2_sbd *sdp, struct buffer_head *bh,
1459e1a9ecdSAndreas Gruenbacher 			const char *function, char *file, unsigned int line,
1469e1a9ecdSAndreas Gruenbacher 			bool withdraw);
1479e1a9ecdSAndreas Gruenbacher 
1489e1a9ecdSAndreas Gruenbacher #define gfs2_io_error_bh_wd(sdp, bh) \
1499e1a9ecdSAndreas Gruenbacher gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, true);
150b3b94faaSDavid Teigland 
151b3b94faaSDavid Teigland #define gfs2_io_error_bh(sdp, bh) \
1529e1a9ecdSAndreas Gruenbacher gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, false);
153b3b94faaSDavid Teigland 
154b3b94faaSDavid Teigland 
155e18b890bSChristoph Lameter extern struct kmem_cache *gfs2_glock_cachep;
156009d8518SSteven Whitehouse extern struct kmem_cache *gfs2_glock_aspace_cachep;
157e18b890bSChristoph Lameter extern struct kmem_cache *gfs2_inode_cachep;
158e18b890bSChristoph Lameter extern struct kmem_cache *gfs2_bufdata_cachep;
1596bdd9be6SBob Peterson extern struct kmem_cache *gfs2_rgrpd_cachep;
16037b2c837SSteven Whitehouse extern struct kmem_cache *gfs2_quotad_cachep;
161b54e9a0bSBob Peterson extern struct kmem_cache *gfs2_qadata_cachep;
162e8c92ed7SSteven Whitehouse extern mempool_t *gfs2_page_pool;
16327c3b415SBob Peterson extern struct workqueue_struct *gfs2_control_wq;
164b3b94faaSDavid Teigland 
165b3b94faaSDavid Teigland static inline unsigned int gfs2_tune_get_i(struct gfs2_tune *gt,
166b3b94faaSDavid Teigland 					   unsigned int *p)
167b3b94faaSDavid Teigland {
168b3b94faaSDavid Teigland 	unsigned int x;
169b3b94faaSDavid Teigland 	spin_lock(&gt->gt_spin);
170b3b94faaSDavid Teigland 	x = *p;
171b3b94faaSDavid Teigland 	spin_unlock(&gt->gt_spin);
172b3b94faaSDavid Teigland 	return x;
173b3b94faaSDavid Teigland }
174b3b94faaSDavid Teigland 
175eb43e660SBob Peterson /**
176*69511080SBob Peterson  * gfs2_withdraw_delayed - withdraw as soon as possible without deadlocks
177*69511080SBob Peterson  * @sdp: the superblock
178*69511080SBob Peterson  */
179*69511080SBob Peterson static inline void gfs2_withdraw_delayed(struct gfs2_sbd *sdp)
180*69511080SBob Peterson {
181*69511080SBob Peterson 	set_bit(SDF_WITHDRAWING, &sdp->sd_flags);
182*69511080SBob Peterson }
183*69511080SBob Peterson 
184*69511080SBob Peterson /**
185eb43e660SBob Peterson  * gfs2_withdrawn - test whether the file system is withdrawing or withdrawn
186eb43e660SBob Peterson  * @sdp: the superblock
187eb43e660SBob Peterson  */
188eb43e660SBob Peterson static inline bool gfs2_withdrawn(struct gfs2_sbd *sdp)
189eb43e660SBob Peterson {
190*69511080SBob Peterson 	return test_bit(SDF_WITHDRAWN, &sdp->sd_flags) ||
191*69511080SBob Peterson 		test_bit(SDF_WITHDRAWING, &sdp->sd_flags);
192eb43e660SBob Peterson }
193eb43e660SBob Peterson 
194b3b94faaSDavid Teigland #define gfs2_tune_get(sdp, field) \
195b3b94faaSDavid Teigland gfs2_tune_get_i(&(sdp)->sd_tune, &(sdp)->sd_tune.field)
196b3b94faaSDavid Teigland 
197cb94eb06SJoe Perches __printf(2, 3)
198badb55ecSAndreas Gruenbacher void gfs2_lm(struct gfs2_sbd *sdp, const char *fmt, ...);
199badb55ecSAndreas Gruenbacher int gfs2_withdraw(struct gfs2_sbd *sdp);
200b3b94faaSDavid Teigland 
201b3b94faaSDavid Teigland #endif /* __UTIL_DOT_H__ */
202