2009-08-18 07:19:58 +04:00
/* -*- 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 ;
struct rw_semaphore rf_sem ;
struct ocfs2_lock_res rf_lockres ;
struct kref rf_getcnt ;
int rf_removed ;
/* the following 4 fields are used by caching_info. */
struct ocfs2_caching_info rf_ci ;
spinlock_t rf_lock ;
struct mutex rf_io_mutex ;
struct super_block * rf_sb ;
} ;
2009-08-24 07:13:37 +04:00
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 ) ;
2009-08-18 07:24:49 +04:00
int ocfs2_decrease_refcount ( struct inode * inode ,
handle_t * handle , u32 cpos , u32 len ,
struct ocfs2_alloc_context * meta_ac ,
2009-08-18 07:30:55 +04:00
struct ocfs2_cached_dealloc_ctxt * dealloc ,
int delete ) ;
2009-08-18 07:29:12 +04:00
int ocfs2_prepare_refcount_change_for_del ( struct inode * inode ,
struct buffer_head * di_bh ,
u64 phys_blkno ,
u32 clusters ,
int * credits ,
struct ocfs2_alloc_context * * meta_ac ) ;
2009-08-25 04:05:12 +04:00
int ocfs2_refcount_cow ( struct inode * inode , struct buffer_head * di_bh ,
2009-08-26 05:47:28 +04:00
u32 cpos , u32 write_len , u32 max_cpos ) ;
2009-08-18 07:43:17 +04:00
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 ) ;
2009-09-21 09:04:19 +04:00
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 ) ;
2009-08-18 07:43:49 +04:00
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 ) ;
2009-08-18 07:43:55 +04:00
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 ) ;
2009-09-21 07:25:14 +04:00
int ocfs2_reflink_ioctl ( struct inode * inode ,
const char __user * oldname ,
const char __user * newname ,
bool preserve ) ;
2009-08-18 07:19:58 +04:00
# endif /* OCFS2_REFCOUNTTREE_H */