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