2019-05-31 11:09:56 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2006-01-16 19:50:04 +03:00
/*
* Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2006-05-18 23:09:15 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2006-01-16 19:50:04 +03:00
*/
# ifndef __UTIL_DOT_H__
# define __UTIL_DOT_H__
2014-03-07 00:10:45 +04:00
# ifdef pr_fmt
# undef pr_fmt
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
# endif
2012-03-08 16:10:23 +04:00
# include <linux/mempool.h>
2006-09-05 18:39:21 +04:00
# include "incore.h"
2006-01-16 19:50:04 +03:00
2014-03-07 00:10:46 +04:00
# define fs_emerg(fs, fmt, ...) \
pr_emerg ( " fsid=%s: " fmt , ( fs ) - > sd_fsname , # # __VA_ARGS__ )
2014-03-07 00:10:45 +04:00
# define fs_warn(fs, fmt, ...) \
pr_warn ( " fsid=%s: " fmt , ( fs ) - > sd_fsname , # # __VA_ARGS__ )
# define fs_err(fs, fmt, ...) \
pr_err ( " fsid=%s: " fmt , ( fs ) - > sd_fsname , # # __VA_ARGS__ )
# define fs_info(fs, fmt, ...) \
pr_info ( " fsid=%s: " fmt , ( fs ) - > sd_fsname , # # __VA_ARGS__ )
2006-01-16 19:50:04 +03:00
void gfs2_assert_i ( struct gfs2_sbd * sdp ) ;
# define gfs2_assert(sdp, assertion) \
do { \
if ( unlikely ( ! ( assertion ) ) ) { \
gfs2_assert_i ( sdp ) ; \
2006-04-21 23:52:46 +04:00
BUG ( ) ; \
2006-01-16 19:50:04 +03:00
} \
} while ( 0 )
2020-01-23 21:36:21 +03:00
void gfs2_assert_withdraw_i ( struct gfs2_sbd * sdp , char * assertion ,
2020-01-08 20:37:30 +03:00
const char * function , char * file , unsigned int line ,
bool delayed ) ;
2006-01-16 19:50:04 +03:00
# define gfs2_assert_withdraw(sdp, assertion) \
2020-01-23 21:36:21 +03:00
( { \
bool _bool = ( assertion ) ; \
if ( unlikely ( ! _bool ) ) \
gfs2_assert_withdraw_i ( ( sdp ) , # assertion , \
2020-01-08 20:37:30 +03:00
__func__ , __FILE__ , __LINE__ , false ) ; \
! _bool ; \
} )
# define gfs2_assert_withdraw_delayed(sdp, assertion) \
( { \
bool _bool = ( assertion ) ; \
if ( unlikely ( ! _bool ) ) \
gfs2_assert_withdraw_i ( ( sdp ) , # assertion , \
__func__ , __FILE__ , __LINE__ , true ) ; \
2020-01-23 21:36:21 +03:00
! _bool ; \
} )
2006-01-16 19:50:04 +03:00
2020-01-23 21:36:21 +03:00
void gfs2_assert_warn_i ( struct gfs2_sbd * sdp , char * assertion ,
const char * function , char * file , unsigned int line ) ;
2006-01-16 19:50:04 +03:00
# define gfs2_assert_warn(sdp, assertion) \
2020-01-23 21:36:21 +03:00
( { \
bool _bool = ( assertion ) ; \
if ( unlikely ( ! _bool ) ) \
gfs2_assert_warn_i ( ( sdp ) , # assertion , \
__func__ , __FILE__ , __LINE__ ) ; \
! _bool ; \
} )
2006-01-16 19:50:04 +03:00
2020-01-23 21:31:06 +03:00
void gfs2_consist_i ( struct gfs2_sbd * sdp ,
const char * function , char * file , unsigned int line ) ;
2006-01-16 19:50:04 +03:00
# define gfs2_consist(sdp) \
2020-01-23 21:25:05 +03:00
gfs2_consist_i ( ( sdp ) , __func__ , __FILE__ , __LINE__ )
2006-01-16 19:50:04 +03:00
2020-01-23 21:31:06 +03:00
void gfs2_consist_inode_i ( struct gfs2_inode * ip ,
const char * function , char * file , unsigned int line ) ;
2006-01-16 19:50:04 +03:00
# define gfs2_consist_inode(ip) \
2020-01-23 21:25:05 +03:00
gfs2_consist_inode_i ( ( ip ) , __func__ , __FILE__ , __LINE__ )
2006-01-16 19:50:04 +03:00
2020-01-23 21:31:06 +03:00
void gfs2_consist_rgrpd_i ( struct gfs2_rgrpd * rgd ,
const char * function , char * file , unsigned int line ) ;
2006-01-16 19:50:04 +03:00
# define gfs2_consist_rgrpd(rgd) \
2020-01-23 21:25:05 +03:00
gfs2_consist_rgrpd_i ( ( rgd ) , __func__ , __FILE__ , __LINE__ )
2006-01-16 19:50:04 +03:00
int gfs2_meta_check_ii ( struct gfs2_sbd * sdp , struct buffer_head * bh ,
const char * type , const char * function ,
char * file , unsigned int line ) ;
2012-05-29 13:47:51 +04:00
static inline int gfs2_meta_check ( struct gfs2_sbd * sdp ,
struct buffer_head * bh )
2006-01-16 19:50:04 +03:00
{
struct gfs2_meta_header * mh = ( struct gfs2_meta_header * ) bh - > b_data ;
2006-10-14 18:46:30 +04:00
u32 magic = be32_to_cpu ( mh - > mh_magic ) ;
2012-05-29 13:47:51 +04:00
if ( unlikely ( magic ! = GFS2_MAGIC ) ) {
2018-10-03 16:47:36 +03:00
fs_err ( sdp , " Magic number missing at %llu \n " ,
2012-05-29 13:47:51 +04:00
( unsigned long long ) bh - > b_blocknr ) ;
return - EIO ;
}
2006-01-16 19:50:04 +03:00
return 0 ;
}
int gfs2_metatype_check_ii ( struct gfs2_sbd * sdp , struct buffer_head * bh ,
2006-09-04 20:49:07 +04:00
u16 type , u16 t ,
2006-01-16 19:50:04 +03:00
const char * function ,
char * file , unsigned int line ) ;
static inline int gfs2_metatype_check_i ( struct gfs2_sbd * sdp ,
struct buffer_head * bh ,
2006-09-04 20:49:07 +04:00
u16 type ,
2006-01-16 19:50:04 +03:00
const char * function ,
char * file , unsigned int line )
{
struct gfs2_meta_header * mh = ( struct gfs2_meta_header * ) bh - > b_data ;
2006-10-14 18:46:30 +04:00
u32 magic = be32_to_cpu ( mh - > mh_magic ) ;
2006-09-04 20:49:07 +04:00
u16 t = be32_to_cpu ( mh - > mh_type ) ;
2006-01-16 19:50:04 +03:00
if ( unlikely ( magic ! = GFS2_MAGIC ) )
return gfs2_meta_check_ii ( sdp , bh , " magic number " , function ,
file , line ) ;
if ( unlikely ( t ! = type ) )
return gfs2_metatype_check_ii ( sdp , bh , type , t , function ,
file , line ) ;
return 0 ;
}
# define gfs2_metatype_check(sdp, bh, type) \
2008-04-30 11:55:09 +04:00
gfs2_metatype_check_i ( ( sdp ) , ( bh ) , ( type ) , __func__ , __FILE__ , __LINE__ )
2006-01-16 19:50:04 +03:00
2006-09-04 20:49:07 +04:00
static inline void gfs2_metatype_set ( struct buffer_head * bh , u16 type ,
u16 format )
2006-01-16 19:50:04 +03:00
{
struct gfs2_meta_header * mh ;
mh = ( struct gfs2_meta_header * ) bh - > b_data ;
2006-03-31 00:46:23 +04:00
mh - > mh_type = cpu_to_be32 ( type ) ;
mh - > mh_format = cpu_to_be32 ( format ) ;
2006-01-16 19:50:04 +03:00
}
int gfs2_io_error_i ( struct gfs2_sbd * sdp , const char * function ,
char * file , unsigned int line ) ;
2019-02-18 23:04:13 +03:00
2023-10-09 19:49:31 +03:00
int check_journal_clean ( struct gfs2_sbd * sdp , struct gfs2_jdesc * jd ,
bool verbose ) ;
int gfs2_freeze_lock_shared ( struct gfs2_sbd * sdp ) ;
void gfs2_freeze_unlock ( struct gfs2_holder * freeze_gh ) ;
2006-01-16 19:50:04 +03:00
# define gfs2_io_error(sdp) \
2020-11-27 22:12:09 +03:00
gfs2_io_error_i ( ( sdp ) , __func__ , __FILE__ , __LINE__ )
2006-01-16 19:50:04 +03:00
2018-06-07 13:56:46 +03:00
void gfs2_io_error_bh_i ( struct gfs2_sbd * sdp , struct buffer_head * bh ,
const char * function , char * file , unsigned int line ,
bool withdraw ) ;
# define gfs2_io_error_bh_wd(sdp, bh) \
2020-11-27 22:12:09 +03:00
gfs2_io_error_bh_i ( ( sdp ) , ( bh ) , __func__ , __FILE__ , __LINE__ , true )
2006-01-16 19:50:04 +03:00
# define gfs2_io_error_bh(sdp, bh) \
2020-11-27 22:12:09 +03:00
gfs2_io_error_bh_i ( ( sdp ) , ( bh ) , __func__ , __FILE__ , __LINE__ , false )
2006-01-16 19:50:04 +03:00
2006-12-07 07:33:20 +03:00
extern struct kmem_cache * gfs2_glock_cachep ;
2009-12-08 15:12:13 +03:00
extern struct kmem_cache * gfs2_glock_aspace_cachep ;
2006-12-07 07:33:20 +03:00
extern struct kmem_cache * gfs2_inode_cachep ;
extern struct kmem_cache * gfs2_bufdata_cachep ;
2008-01-29 02:20:26 +03:00
extern struct kmem_cache * gfs2_rgrpd_cachep ;
2008-11-17 17:25:37 +03:00
extern struct kmem_cache * gfs2_quotad_cachep ;
2015-10-26 18:40:28 +03:00
extern struct kmem_cache * gfs2_qadata_cachep ;
2019-04-17 21:04:27 +03:00
extern struct kmem_cache * gfs2_trans_cachep ;
2012-04-16 12:28:31 +04:00
extern mempool_t * gfs2_page_pool ;
2017-08-18 17:15:13 +03:00
extern struct workqueue_struct * gfs2_control_wq ;
2006-01-16 19:50:04 +03:00
static inline unsigned int gfs2_tune_get_i ( struct gfs2_tune * gt ,
unsigned int * p )
{
unsigned int x ;
spin_lock ( & gt - > gt_spin ) ;
x = * p ;
spin_unlock ( & gt - > gt_spin ) ;
return x ;
}
2019-02-12 23:43:55 +03:00
/**
* gfs2_withdraw_delayed - withdraw as soon as possible without deadlocks
* @ sdp : the superblock
*/
static inline void gfs2_withdraw_delayed ( struct gfs2_sbd * sdp )
{
set_bit ( SDF_WITHDRAWING , & sdp - > sd_flags ) ;
}
2019-11-14 17:52:15 +03:00
/**
2023-12-20 19:16:29 +03:00
* gfs2_withdrawing_or_withdrawn - test whether the file system is withdrawing
* or withdrawn
2019-11-14 17:52:15 +03:00
* @ sdp : the superblock
*/
2023-12-20 19:16:29 +03:00
static inline bool gfs2_withdrawing_or_withdrawn ( struct gfs2_sbd * sdp )
2019-11-14 17:52:15 +03:00
{
2023-12-20 19:05:26 +03:00
return unlikely ( test_bit ( SDF_WITHDRAWN , & sdp - > sd_flags ) | |
test_bit ( SDF_WITHDRAWING , & sdp - > sd_flags ) ) ;
2019-11-14 17:52:15 +03:00
}
2020-08-29 00:44:36 +03:00
/**
* gfs2_withdrawing - check if a withdraw is pending
* @ sdp : the superblock
*/
static inline bool gfs2_withdrawing ( struct gfs2_sbd * sdp )
{
2023-12-20 19:05:26 +03:00
return unlikely ( test_bit ( SDF_WITHDRAWING , & sdp - > sd_flags ) & &
! test_bit ( SDF_WITHDRAWN , & sdp - > sd_flags ) ) ;
2020-08-29 00:44:36 +03:00
}
2021-07-30 20:41:16 +03:00
static inline bool gfs2_withdraw_in_prog ( struct gfs2_sbd * sdp )
{
2023-12-20 19:05:26 +03:00
return unlikely ( test_bit ( SDF_WITHDRAW_IN_PROG , & sdp - > sd_flags ) ) ;
2021-07-30 20:41:16 +03:00
}
2006-01-16 19:50:04 +03:00
# define gfs2_tune_get(sdp, field) \
gfs2_tune_get_i ( & ( sdp ) - > sd_tune , & ( sdp ) - > sd_tune . field )
2014-03-07 00:17:21 +04:00
__printf ( 2 , 3 )
2020-01-23 20:41:00 +03:00
void gfs2_lm ( struct gfs2_sbd * sdp , const char * fmt , . . . ) ;
int gfs2_withdraw ( struct gfs2_sbd * sdp ) ;
2006-01-16 19:50:04 +03:00
# endif /* __UTIL_DOT_H__ */