1/* -*- mode: c; c-basic-offset: 8; -*- 2 * vim: noexpandtab sw=8 ts=8 sts=0: 3 * 4 * uptodate.h 5 * 6 * Cluster uptodate tracking 7 * 8 * Copyright (C) 2002, 2004, 2005 Oracle. All rights reserved. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public 12 * License as published by the Free Software Foundation; either 13 * version 2 of the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public 21 * License along with this program; if not, write to the 22 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 23 * Boston, MA 021110-1307, USA. 24 */ 25 26#ifndef OCFS2_UPTODATE_H 27#define OCFS2_UPTODATE_H 28 29/* 30 * The caching code relies on locking provided by the user of 31 * struct ocfs2_caching_info. These operations connect that up. 32 */ 33struct ocfs2_caching_operations { 34 /* 35 * A u64 representing the owning structure. Usually this 36 * is the block number (i_blkno or whatnot). This is used so 37 * that caching log messages can identify the owning structure. 38 */ 39 u64 (*co_owner)(struct ocfs2_caching_info *ci); 40 41 /* The superblock is needed during I/O. */ 42 struct super_block *(*co_get_super)(struct ocfs2_caching_info *ci); 43 /* 44 * Lock and unlock the caching data. These will not sleep, and 45 * should probably be spinlocks. 46 */ 47 void (*co_cache_lock)(struct ocfs2_caching_info *ci); 48 void (*co_cache_unlock)(struct ocfs2_caching_info *ci); 49 50 /* 51 * Lock and unlock for disk I/O. These will sleep, and should 52 * be mutexes. 53 */ 54 void (*co_io_lock)(struct ocfs2_caching_info *ci); 55 void (*co_io_unlock)(struct ocfs2_caching_info *ci); 56}; 57 58int __init init_ocfs2_uptodate_cache(void); 59void exit_ocfs2_uptodate_cache(void); 60 61void ocfs2_metadata_cache_init(struct ocfs2_caching_info *ci, 62 const struct ocfs2_caching_operations *ops); 63void ocfs2_metadata_cache_purge(struct ocfs2_caching_info *ci); 64void ocfs2_metadata_cache_exit(struct ocfs2_caching_info *ci); 65 66u64 ocfs2_metadata_cache_owner(struct ocfs2_caching_info *ci); 67void ocfs2_metadata_cache_io_lock(struct ocfs2_caching_info *ci); 68void ocfs2_metadata_cache_io_unlock(struct ocfs2_caching_info *ci); 69 70int ocfs2_buffer_uptodate(struct ocfs2_caching_info *ci, 71 struct buffer_head *bh); 72void ocfs2_set_buffer_uptodate(struct ocfs2_caching_info *ci, 73 struct buffer_head *bh); 74void ocfs2_set_new_buffer_uptodate(struct ocfs2_caching_info *ci, 75 struct buffer_head *bh); 76void ocfs2_remove_from_cache(struct ocfs2_caching_info *ci, 77 struct buffer_head *bh); 78void ocfs2_remove_xattr_clusters_from_cache(struct ocfs2_caching_info *ci, 79 sector_t block, 80 u32 c_len); 81int ocfs2_buffer_read_ahead(struct ocfs2_caching_info *ci, 82 struct buffer_head *bh); 83 84#endif /* OCFS2_UPTODATE_H */ 85