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_spin); 170b3b94faaSDavid Teigland x = *p; 171b3b94faaSDavid Teigland spin_unlock(>->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