linux/fs/gfs2/util.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
   4 * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
   5 */
   6
   7#ifndef __UTIL_DOT_H__
   8#define __UTIL_DOT_H__
   9
  10#ifdef pr_fmt
  11#undef pr_fmt
  12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  13#endif
  14
  15#include <linux/mempool.h>
  16
  17#include "incore.h"
  18
  19#define fs_emerg(fs, fmt, ...)                                          \
  20        pr_emerg("fsid=%s: " fmt, (fs)->sd_fsname, ##__VA_ARGS__)
  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__)
  27
  28void gfs2_assert_i(struct gfs2_sbd *sdp);
  29
  30#define gfs2_assert(sdp, assertion) \
  31do { \
  32        if (unlikely(!(assertion))) { \
  33                gfs2_assert_i(sdp); \
  34                BUG(); \
  35        } \
  36} while (0)
  37
  38
  39void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
  40                            const char *function, char *file, unsigned int line,
  41                            bool delayed);
  42
  43#define gfs2_assert_withdraw(sdp, assertion) \
  44        ({ \
  45                bool _bool = (assertion); \
  46                if (unlikely(!_bool)) \
  47                        gfs2_assert_withdraw_i((sdp), #assertion, \
  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); \
  58                !_bool; \
  59        })
  60
  61void gfs2_assert_warn_i(struct gfs2_sbd *sdp, char *assertion,
  62                        const char *function, char *file, unsigned int line);
  63
  64#define gfs2_assert_warn(sdp, assertion) \
  65        ({ \
  66                bool _bool = (assertion); \
  67                if (unlikely(!_bool)) \
  68                        gfs2_assert_warn_i((sdp), #assertion, \
  69                                        __func__, __FILE__, __LINE__); \
  70                !_bool; \
  71        })
  72
  73void gfs2_consist_i(struct gfs2_sbd *sdp,
  74                    const char *function, char *file, unsigned int line);
  75
  76#define gfs2_consist(sdp) \
  77gfs2_consist_i((sdp), __func__, __FILE__, __LINE__)
  78
  79
  80void gfs2_consist_inode_i(struct gfs2_inode *ip,
  81                          const char *function, char *file, unsigned int line);
  82
  83#define gfs2_consist_inode(ip) \
  84gfs2_consist_inode_i((ip), __func__, __FILE__, __LINE__)
  85
  86
  87void gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd,
  88                          const char *function, char *file, unsigned int line);
  89
  90#define gfs2_consist_rgrpd(rgd) \
  91gfs2_consist_rgrpd_i((rgd), __func__, __FILE__, __LINE__)
  92
  93
  94int 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
  98static inline int gfs2_meta_check(struct gfs2_sbd *sdp,
  99                                    struct buffer_head *bh)
 100{
 101        struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
 102        u32 magic = be32_to_cpu(mh->mh_magic);
 103        if (unlikely(magic != GFS2_MAGIC)) {
 104                fs_err(sdp, "Magic number missing at %llu\n",
 105                       (unsigned long long)bh->b_blocknr);
 106                return -EIO;
 107        }
 108        return 0;
 109}
 110
 111int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
 112                           u16 type, u16 t,
 113                           const char *function,
 114                           char *file, unsigned int line);
 115
 116static inline int gfs2_metatype_check_i(struct gfs2_sbd *sdp,
 117                                        struct buffer_head *bh,
 118                                        u16 type,
 119                                        const char *function,
 120                                        char *file, unsigned int line)
 121{
 122        struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
 123        u32 magic = be32_to_cpu(mh->mh_magic);
 124        u16 t = be32_to_cpu(mh->mh_type);
 125        if (unlikely(magic != GFS2_MAGIC))
 126                return gfs2_meta_check_ii(sdp, bh, "magic number", function,
 127                                          file, line);
 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) \
 135gfs2_metatype_check_i((sdp), (bh), (type), __func__, __FILE__, __LINE__)
 136
 137static inline void gfs2_metatype_set(struct buffer_head *bh, u16 type,
 138                                     u16 format)
 139{
 140        struct gfs2_meta_header *mh;
 141        mh = (struct gfs2_meta_header *)bh->b_data;
 142        mh->mh_type = cpu_to_be32(type);
 143        mh->mh_format = cpu_to_be32(format);
 144}
 145
 146
 147int gfs2_io_error_i(struct gfs2_sbd *sdp, const char *function,
 148                    char *file, unsigned int line);
 149
 150extern int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
 151                               bool verbose);
 152
 153#define gfs2_io_error(sdp) \
 154gfs2_io_error_i((sdp), __func__, __FILE__, __LINE__);
 155
 156
 157void 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) \
 162gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, true);
 163
 164#define gfs2_io_error_bh(sdp, bh) \
 165gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__, false);
 166
 167
 168extern struct kmem_cache *gfs2_glock_cachep;
 169extern struct kmem_cache *gfs2_glock_aspace_cachep;
 170extern struct kmem_cache *gfs2_inode_cachep;
 171extern struct kmem_cache *gfs2_bufdata_cachep;
 172extern struct kmem_cache *gfs2_rgrpd_cachep;
 173extern struct kmem_cache *gfs2_quotad_cachep;
 174extern struct kmem_cache *gfs2_qadata_cachep;
 175extern struct kmem_cache *gfs2_trans_cachep;
 176extern mempool_t *gfs2_page_pool;
 177extern struct workqueue_struct *gfs2_control_wq;
 178
 179static inline unsigned int gfs2_tune_get_i(struct gfs2_tune *gt,
 180                                           unsigned int *p)
 181{
 182        unsigned int x;
 183        spin_lock(&gt->gt_spin);
 184        x = *p;
 185        spin_unlock(&gt->gt_spin);
 186        return x;
 187}
 188
 189/**
 190 * gfs2_withdraw_delayed - withdraw as soon as possible without deadlocks
 191 * @sdp: the superblock
 192 */
 193static inline void gfs2_withdraw_delayed(struct gfs2_sbd *sdp)
 194{
 195        set_bit(SDF_WITHDRAWING, &sdp->sd_flags);
 196}
 197
 198/**
 199 * gfs2_withdrawn - test whether the file system is withdrawing or withdrawn
 200 * @sdp: the superblock
 201 */
 202static inline bool gfs2_withdrawn(struct gfs2_sbd *sdp)
 203{
 204        return test_bit(SDF_WITHDRAWN, &sdp->sd_flags) ||
 205                test_bit(SDF_WITHDRAWING, &sdp->sd_flags);
 206}
 207
 208#define gfs2_tune_get(sdp, field) \
 209gfs2_tune_get_i(&(sdp)->sd_tune, &(sdp)->sd_tune.field)
 210
 211__printf(2, 3)
 212void gfs2_lm(struct gfs2_sbd *sdp, const char *fmt, ...);
 213int gfs2_withdraw(struct gfs2_sbd *sdp);
 214
 215#endif /* __UTIL_DOT_H__ */
 216