xref: /OK3568_Linux_fs/kernel/fs/ocfs2/uptodate.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /* -*- mode: c; c-basic-offset: 8; -*-
3*4882a593Smuzhiyun  * vim: noexpandtab sw=8 ts=8 sts=0:
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * uptodate.h
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Cluster uptodate tracking
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Copyright (C) 2002, 2004, 2005 Oracle.  All rights reserved.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef OCFS2_UPTODATE_H
13*4882a593Smuzhiyun #define OCFS2_UPTODATE_H
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /*
16*4882a593Smuzhiyun  * The caching code relies on locking provided by the user of
17*4882a593Smuzhiyun  * struct ocfs2_caching_info.  These operations connect that up.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun struct ocfs2_caching_operations {
20*4882a593Smuzhiyun 	/*
21*4882a593Smuzhiyun 	 * A u64 representing the owning structure.  Usually this
22*4882a593Smuzhiyun 	 * is the block number (i_blkno or whatnot).  This is used so
23*4882a593Smuzhiyun 	 * that caching log messages can identify the owning structure.
24*4882a593Smuzhiyun 	 */
25*4882a593Smuzhiyun 	u64	(*co_owner)(struct ocfs2_caching_info *ci);
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	/* The superblock is needed during I/O. */
28*4882a593Smuzhiyun 	struct super_block *(*co_get_super)(struct ocfs2_caching_info *ci);
29*4882a593Smuzhiyun 	/*
30*4882a593Smuzhiyun 	 * Lock and unlock the caching data.  These will not sleep, and
31*4882a593Smuzhiyun 	 * should probably be spinlocks.
32*4882a593Smuzhiyun 	 */
33*4882a593Smuzhiyun 	void	(*co_cache_lock)(struct ocfs2_caching_info *ci);
34*4882a593Smuzhiyun 	void	(*co_cache_unlock)(struct ocfs2_caching_info *ci);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/*
37*4882a593Smuzhiyun 	 * Lock and unlock for disk I/O.  These will sleep, and should
38*4882a593Smuzhiyun 	 * be mutexes.
39*4882a593Smuzhiyun 	 */
40*4882a593Smuzhiyun 	void	(*co_io_lock)(struct ocfs2_caching_info *ci);
41*4882a593Smuzhiyun 	void	(*co_io_unlock)(struct ocfs2_caching_info *ci);
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun int __init init_ocfs2_uptodate_cache(void);
45*4882a593Smuzhiyun void exit_ocfs2_uptodate_cache(void);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun void ocfs2_metadata_cache_init(struct ocfs2_caching_info *ci,
48*4882a593Smuzhiyun 			       const struct ocfs2_caching_operations *ops);
49*4882a593Smuzhiyun void ocfs2_metadata_cache_purge(struct ocfs2_caching_info *ci);
50*4882a593Smuzhiyun void ocfs2_metadata_cache_exit(struct ocfs2_caching_info *ci);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun u64 ocfs2_metadata_cache_owner(struct ocfs2_caching_info *ci);
53*4882a593Smuzhiyun void ocfs2_metadata_cache_io_lock(struct ocfs2_caching_info *ci);
54*4882a593Smuzhiyun void ocfs2_metadata_cache_io_unlock(struct ocfs2_caching_info *ci);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun int ocfs2_buffer_uptodate(struct ocfs2_caching_info *ci,
57*4882a593Smuzhiyun 			  struct buffer_head *bh);
58*4882a593Smuzhiyun void ocfs2_set_buffer_uptodate(struct ocfs2_caching_info *ci,
59*4882a593Smuzhiyun 			       struct buffer_head *bh);
60*4882a593Smuzhiyun void ocfs2_set_new_buffer_uptodate(struct ocfs2_caching_info *ci,
61*4882a593Smuzhiyun 				   struct buffer_head *bh);
62*4882a593Smuzhiyun void ocfs2_remove_from_cache(struct ocfs2_caching_info *ci,
63*4882a593Smuzhiyun 			     struct buffer_head *bh);
64*4882a593Smuzhiyun void ocfs2_remove_xattr_clusters_from_cache(struct ocfs2_caching_info *ci,
65*4882a593Smuzhiyun 					    sector_t block,
66*4882a593Smuzhiyun 					    u32 c_len);
67*4882a593Smuzhiyun int ocfs2_buffer_read_ahead(struct ocfs2_caching_info *ci,
68*4882a593Smuzhiyun 			    struct buffer_head *bh);
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #endif /* OCFS2_UPTODATE_H */
71