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