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 rw_semaphore rf_sem; 25 struct ocfs2_lock_res rf_lockres; 26 struct kref rf_getcnt; 27 int rf_removed; 28 29 /* the following 4 fields are used by caching_info. */ 30 struct ocfs2_caching_info rf_ci; 31 spinlock_t rf_lock; 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 struct buffer_head *di_bh, 51 u64 phys_blkno, 52 u32 clusters, 53 int *credits, 54 struct ocfs2_alloc_context **meta_ac); 55 int ocfs2_refcount_cow(struct inode *inode, struct buffer_head *di_bh, 56 u32 cpos, u32 write_len, u32 max_cpos); 57 58 typedef int (ocfs2_post_refcount_func)(struct inode *inode, 59 handle_t *handle, 60 void *para); 61 /* 62 * Some refcount caller need to do more work after we modify the data b-tree 63 * during refcount operation(including CoW and add refcount flag), and make the 64 * transaction complete. So it must give us this structure so that we can do it 65 * within our transaction. 66 * 67 */ 68 struct ocfs2_post_refcount { 69 int credits; /* credits it need for journal. */ 70 ocfs2_post_refcount_func *func; /* real function. */ 71 void *para; 72 }; 73 74 int ocfs2_refcounted_xattr_delete_need(struct inode *inode, 75 struct ocfs2_caching_info *ref_ci, 76 struct buffer_head *ref_root_bh, 77 struct ocfs2_xattr_value_root *xv, 78 int *meta_add, int *credits); 79 int ocfs2_refcount_cow_xattr(struct inode *inode, 80 struct ocfs2_dinode *di, 81 struct ocfs2_xattr_value_buf *vb, 82 struct ocfs2_refcount_tree *ref_tree, 83 struct buffer_head *ref_root_bh, 84 u32 cpos, u32 write_len, 85 struct ocfs2_post_refcount *post); 86 int ocfs2_add_refcount_flag(struct inode *inode, 87 struct ocfs2_extent_tree *data_et, 88 struct ocfs2_caching_info *ref_ci, 89 struct buffer_head *ref_root_bh, 90 u32 cpos, u32 p_cluster, u32 num_clusters, 91 struct ocfs2_cached_dealloc_ctxt *dealloc, 92 struct ocfs2_post_refcount *post); 93 int ocfs2_remove_refcount_tree(struct inode *inode, struct buffer_head *di_bh); 94 int ocfs2_try_remove_refcount_tree(struct inode *inode, 95 struct buffer_head *di_bh); 96 int ocfs2_increase_refcount(handle_t *handle, 97 struct ocfs2_caching_info *ci, 98 struct buffer_head *ref_root_bh, 99 u64 cpos, u32 len, 100 struct ocfs2_alloc_context *meta_ac, 101 struct ocfs2_cached_dealloc_ctxt *dealloc); 102 int ocfs2_reflink_ioctl(struct inode *inode, 103 const char __user *oldname, 104 const char __user *newname, 105 bool preserve); 106 #endif /* OCFS2_REFCOUNTTREE_H */ 107