1 /* -*- mode: c; c-basic-offset: 8; -*- 2 * vim: noexpandtab sw=8 ts=8 sts=0: 3 * 4 * refcounttree.h 5 * 6 * Copyright (C) 2009 Oracle. All rights reserved. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public 10 * License version 2 as published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 */ 17 #ifndef OCFS2_REFCOUNTTREE_H 18 #define OCFS2_REFCOUNTTREE_H 19 20 struct ocfs2_refcount_tree { 21 struct rb_node rf_node; 22 u64 rf_blkno; 23 u32 rf_generation; 24 struct kref rf_getcnt; 25 struct rw_semaphore rf_sem; 26 struct ocfs2_lock_res rf_lockres; 27 int rf_removed; 28 29 /* the following 4 fields are used by caching_info. */ 30 spinlock_t rf_lock; 31 struct ocfs2_caching_info rf_ci; 32 struct mutex rf_io_mutex; 33 struct super_block *rf_sb; 34 }; 35 36 void ocfs2_purge_refcount_trees(struct ocfs2_super *osb); 37 int ocfs2_lock_refcount_tree(struct ocfs2_super *osb, u64 ref_blkno, int rw, 38 struct ocfs2_refcount_tree **tree, 39 struct buffer_head **ref_bh); 40 void ocfs2_unlock_refcount_tree(struct ocfs2_super *osb, 41 struct ocfs2_refcount_tree *tree, 42 int rw); 43 44 int ocfs2_decrease_refcount(struct inode *inode, 45 handle_t *handle, u32 cpos, u32 len, 46 struct ocfs2_alloc_context *meta_ac, 47 struct ocfs2_cached_dealloc_ctxt *dealloc, 48 int delete); 49 int ocfs2_prepare_refcount_change_for_del(struct inode *inode, 50 u64 refcount_loc, 51 u64 phys_blkno, 52 u32 clusters, 53 int *credits, 54 int *ref_blocks); 55 int ocfs2_refcount_cow(struct inode *inode, 56 struct file *filep, struct buffer_head *di_bh, 57 u32 cpos, u32 write_len, u32 max_cpos); 58 59 typedef int (ocfs2_post_refcount_func)(struct inode *inode, 60 handle_t *handle, 61 void *para); 62 /* 63 * Some refcount caller need to do more work after we modify the data b-tree 64 * during refcount operation(including CoW and add refcount flag), and make the 65 * transaction complete. So it must give us this structure so that we can do it 66 * within our transaction. 67 * 68 */ 69 struct ocfs2_post_refcount { 70 int credits; /* credits it need for journal. */ 71 ocfs2_post_refcount_func *func; /* real function. */ 72 void *para; 73 }; 74 75 int ocfs2_refcounted_xattr_delete_need(struct inode *inode, 76 struct ocfs2_caching_info *ref_ci, 77 struct buffer_head *ref_root_bh, 78 struct ocfs2_xattr_value_root *xv, 79 int *meta_add, int *credits); 80 int ocfs2_refcount_cow_xattr(struct inode *inode, 81 struct ocfs2_dinode *di, 82 struct ocfs2_xattr_value_buf *vb, 83 struct ocfs2_refcount_tree *ref_tree, 84 struct buffer_head *ref_root_bh, 85 u32 cpos, u32 write_len, 86 struct ocfs2_post_refcount *post); 87 int ocfs2_add_refcount_flag(struct inode *inode, 88 struct ocfs2_extent_tree *data_et, 89 struct ocfs2_caching_info *ref_ci, 90 struct buffer_head *ref_root_bh, 91 u32 cpos, u32 p_cluster, u32 num_clusters, 92 struct ocfs2_cached_dealloc_ctxt *dealloc, 93 struct ocfs2_post_refcount *post); 94 int ocfs2_remove_refcount_tree(struct inode *inode, struct buffer_head *di_bh); 95 int ocfs2_try_remove_refcount_tree(struct inode *inode, 96 struct buffer_head *di_bh); 97 int ocfs2_increase_refcount(handle_t *handle, 98 struct ocfs2_caching_info *ci, 99 struct buffer_head *ref_root_bh, 100 u64 cpos, u32 len, 101 struct ocfs2_alloc_context *meta_ac, 102 struct ocfs2_cached_dealloc_ctxt *dealloc); 103 int ocfs2_reflink_ioctl(struct inode *inode, 104 const char __user *oldname, 105 const char __user *newname, 106 bool preserve); 107 #endif /* OCFS2_REFCOUNTTREE_H */ 108