xref: /openbmc/linux/fs/gfs2/lops.h (revision d07479b2)
1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
4   * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
5   */
6  
7  #ifndef __LOPS_DOT_H__
8  #define __LOPS_DOT_H__
9  
10  #include <linux/list.h>
11  #include "incore.h"
12  
13  extern const struct gfs2_log_operations *gfs2_log_ops[];
14  extern void gfs2_log_incr_head(struct gfs2_sbd *sdp);
15  extern u64 gfs2_log_bmap(struct gfs2_jdesc *jd, unsigned int lbn);
16  extern void gfs2_log_write(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
17  			   struct page *page, unsigned size, unsigned offset,
18  			   u64 blkno);
19  extern void gfs2_log_submit_bio(struct bio **biop, blk_opf_t opf);
20  extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh);
21  extern int gfs2_find_jhead(struct gfs2_jdesc *jd,
22  			   struct gfs2_log_header_host *head, bool keep_cache);
23  extern void gfs2_drain_revokes(struct gfs2_sbd *sdp);
24  static inline unsigned int buf_limit(struct gfs2_sbd *sdp)
25  {
26  	return sdp->sd_ldptrs;
27  }
28  
29  static inline unsigned int databuf_limit(struct gfs2_sbd *sdp)
30  {
31  	return sdp->sd_ldptrs / 2;
32  }
33  
34  static inline void lops_before_commit(struct gfs2_sbd *sdp,
35  				      struct gfs2_trans *tr)
36  {
37  	int x;
38  	for (x = 0; gfs2_log_ops[x]; x++)
39  		if (gfs2_log_ops[x]->lo_before_commit)
40  			gfs2_log_ops[x]->lo_before_commit(sdp, tr);
41  }
42  
43  static inline void lops_after_commit(struct gfs2_sbd *sdp,
44  				     struct gfs2_trans *tr)
45  {
46  	int x;
47  	for (x = 0; gfs2_log_ops[x]; x++)
48  		if (gfs2_log_ops[x]->lo_after_commit)
49  			gfs2_log_ops[x]->lo_after_commit(sdp, tr);
50  }
51  
52  static inline void lops_before_scan(struct gfs2_jdesc *jd,
53  				    struct gfs2_log_header_host *head,
54  				    unsigned int pass)
55  {
56  	int x;
57  	for (x = 0; gfs2_log_ops[x]; x++)
58  		if (gfs2_log_ops[x]->lo_before_scan)
59  			gfs2_log_ops[x]->lo_before_scan(jd, head, pass);
60  }
61  
62  static inline int lops_scan_elements(struct gfs2_jdesc *jd, u32 start,
63  				     struct gfs2_log_descriptor *ld,
64  				     __be64 *ptr,
65  				     unsigned int pass)
66  {
67  	int x, error;
68  	for (x = 0; gfs2_log_ops[x]; x++)
69  		if (gfs2_log_ops[x]->lo_scan_elements) {
70  			error = gfs2_log_ops[x]->lo_scan_elements(jd, start,
71  								  ld, ptr, pass);
72  			if (error)
73  				return error;
74  		}
75  
76  	return 0;
77  }
78  
79  static inline void lops_after_scan(struct gfs2_jdesc *jd, int error,
80  				   unsigned int pass)
81  {
82  	int x;
83  	for (x = 0; gfs2_log_ops[x]; x++)
84  		if (gfs2_log_ops[x]->lo_before_scan)
85  			gfs2_log_ops[x]->lo_after_scan(jd, error, pass);
86  }
87  
88  #endif /* __LOPS_DOT_H__ */
89  
90