Blame view

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