18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/* -*- mode: c; c-basic-offset: 8; -*-
38c2ecf20Sopenharmony_ci * vim: noexpandtab sw=8 ts=8 sts=0:
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * refcounttree.h
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (C) 2009 Oracle.  All rights reserved.
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#ifndef OCFS2_REFCOUNTTREE_H
108c2ecf20Sopenharmony_ci#define OCFS2_REFCOUNTTREE_H
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistruct ocfs2_refcount_tree {
138c2ecf20Sopenharmony_ci	struct rb_node rf_node;
148c2ecf20Sopenharmony_ci	u64 rf_blkno;
158c2ecf20Sopenharmony_ci	u32 rf_generation;
168c2ecf20Sopenharmony_ci	struct kref rf_getcnt;
178c2ecf20Sopenharmony_ci	struct rw_semaphore rf_sem;
188c2ecf20Sopenharmony_ci	struct ocfs2_lock_res rf_lockres;
198c2ecf20Sopenharmony_ci	int rf_removed;
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	/* the following 4 fields are used by caching_info. */
228c2ecf20Sopenharmony_ci	spinlock_t rf_lock;
238c2ecf20Sopenharmony_ci	struct ocfs2_caching_info rf_ci;
248c2ecf20Sopenharmony_ci	struct mutex rf_io_mutex;
258c2ecf20Sopenharmony_ci	struct super_block *rf_sb;
268c2ecf20Sopenharmony_ci};
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_civoid ocfs2_purge_refcount_trees(struct ocfs2_super *osb);
298c2ecf20Sopenharmony_ciint ocfs2_lock_refcount_tree(struct ocfs2_super *osb, u64 ref_blkno, int rw,
308c2ecf20Sopenharmony_ci			     struct ocfs2_refcount_tree **tree,
318c2ecf20Sopenharmony_ci			     struct buffer_head **ref_bh);
328c2ecf20Sopenharmony_civoid ocfs2_unlock_refcount_tree(struct ocfs2_super *osb,
338c2ecf20Sopenharmony_ci				struct ocfs2_refcount_tree *tree,
348c2ecf20Sopenharmony_ci				int rw);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ciint ocfs2_decrease_refcount(struct inode *inode,
378c2ecf20Sopenharmony_ci			    handle_t *handle, u32 cpos, u32 len,
388c2ecf20Sopenharmony_ci			    struct ocfs2_alloc_context *meta_ac,
398c2ecf20Sopenharmony_ci			    struct ocfs2_cached_dealloc_ctxt *dealloc,
408c2ecf20Sopenharmony_ci			    int delete);
418c2ecf20Sopenharmony_ciint ocfs2_prepare_refcount_change_for_del(struct inode *inode,
428c2ecf20Sopenharmony_ci					  u64 refcount_loc,
438c2ecf20Sopenharmony_ci					  u64 phys_blkno,
448c2ecf20Sopenharmony_ci					  u32 clusters,
458c2ecf20Sopenharmony_ci					  int *credits,
468c2ecf20Sopenharmony_ci					  int *ref_blocks);
478c2ecf20Sopenharmony_ciint ocfs2_refcount_cow(struct inode *inode,
488c2ecf20Sopenharmony_ci		       struct buffer_head *di_bh,
498c2ecf20Sopenharmony_ci		       u32 cpos, u32 write_len, u32 max_cpos);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_citypedef int (ocfs2_post_refcount_func)(struct inode *inode,
528c2ecf20Sopenharmony_ci				       handle_t *handle,
538c2ecf20Sopenharmony_ci				       void *para);
548c2ecf20Sopenharmony_ci/*
558c2ecf20Sopenharmony_ci * Some refcount caller need to do more work after we modify the data b-tree
568c2ecf20Sopenharmony_ci * during refcount operation(including CoW and add refcount flag), and make the
578c2ecf20Sopenharmony_ci * transaction complete. So it must give us this structure so that we can do it
588c2ecf20Sopenharmony_ci * within our transaction.
598c2ecf20Sopenharmony_ci *
608c2ecf20Sopenharmony_ci */
618c2ecf20Sopenharmony_cistruct ocfs2_post_refcount {
628c2ecf20Sopenharmony_ci	int credits;			/* credits it need for journal. */
638c2ecf20Sopenharmony_ci	ocfs2_post_refcount_func *func;	/* real function. */
648c2ecf20Sopenharmony_ci	void *para;
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ciint ocfs2_refcounted_xattr_delete_need(struct inode *inode,
688c2ecf20Sopenharmony_ci				       struct ocfs2_caching_info *ref_ci,
698c2ecf20Sopenharmony_ci				       struct buffer_head *ref_root_bh,
708c2ecf20Sopenharmony_ci				       struct ocfs2_xattr_value_root *xv,
718c2ecf20Sopenharmony_ci				       int *meta_add, int *credits);
728c2ecf20Sopenharmony_ciint ocfs2_refcount_cow_xattr(struct inode *inode,
738c2ecf20Sopenharmony_ci			     struct ocfs2_dinode *di,
748c2ecf20Sopenharmony_ci			     struct ocfs2_xattr_value_buf *vb,
758c2ecf20Sopenharmony_ci			     struct ocfs2_refcount_tree *ref_tree,
768c2ecf20Sopenharmony_ci			     struct buffer_head *ref_root_bh,
778c2ecf20Sopenharmony_ci			     u32 cpos, u32 write_len,
788c2ecf20Sopenharmony_ci			     struct ocfs2_post_refcount *post);
798c2ecf20Sopenharmony_ciint ocfs2_duplicate_clusters_by_page(handle_t *handle,
808c2ecf20Sopenharmony_ci				     struct inode *inode,
818c2ecf20Sopenharmony_ci				     u32 cpos, u32 old_cluster,
828c2ecf20Sopenharmony_ci				     u32 new_cluster, u32 new_len);
838c2ecf20Sopenharmony_ciint ocfs2_duplicate_clusters_by_jbd(handle_t *handle,
848c2ecf20Sopenharmony_ci				    struct inode *inode,
858c2ecf20Sopenharmony_ci				    u32 cpos, u32 old_cluster,
868c2ecf20Sopenharmony_ci				    u32 new_cluster, u32 new_len);
878c2ecf20Sopenharmony_ciint ocfs2_cow_sync_writeback(struct super_block *sb,
888c2ecf20Sopenharmony_ci			     struct inode *inode,
898c2ecf20Sopenharmony_ci			     u32 cpos, u32 num_clusters);
908c2ecf20Sopenharmony_ciint ocfs2_add_refcount_flag(struct inode *inode,
918c2ecf20Sopenharmony_ci			    struct ocfs2_extent_tree *data_et,
928c2ecf20Sopenharmony_ci			    struct ocfs2_caching_info *ref_ci,
938c2ecf20Sopenharmony_ci			    struct buffer_head *ref_root_bh,
948c2ecf20Sopenharmony_ci			    u32 cpos, u32 p_cluster, u32 num_clusters,
958c2ecf20Sopenharmony_ci			    struct ocfs2_cached_dealloc_ctxt *dealloc,
968c2ecf20Sopenharmony_ci			    struct ocfs2_post_refcount *post);
978c2ecf20Sopenharmony_ciint ocfs2_remove_refcount_tree(struct inode *inode, struct buffer_head *di_bh);
988c2ecf20Sopenharmony_ciint ocfs2_try_remove_refcount_tree(struct inode *inode,
998c2ecf20Sopenharmony_ci				   struct buffer_head *di_bh);
1008c2ecf20Sopenharmony_ciint ocfs2_increase_refcount(handle_t *handle,
1018c2ecf20Sopenharmony_ci			    struct ocfs2_caching_info *ci,
1028c2ecf20Sopenharmony_ci			    struct buffer_head *ref_root_bh,
1038c2ecf20Sopenharmony_ci			    u64 cpos, u32 len,
1048c2ecf20Sopenharmony_ci			    struct ocfs2_alloc_context *meta_ac,
1058c2ecf20Sopenharmony_ci			    struct ocfs2_cached_dealloc_ctxt *dealloc);
1068c2ecf20Sopenharmony_ciint ocfs2_reflink_ioctl(struct inode *inode,
1078c2ecf20Sopenharmony_ci			const char __user *oldname,
1088c2ecf20Sopenharmony_ci			const char __user *newname,
1098c2ecf20Sopenharmony_ci			bool preserve);
1108c2ecf20Sopenharmony_ciloff_t ocfs2_reflink_remap_blocks(struct inode *s_inode,
1118c2ecf20Sopenharmony_ci				  struct buffer_head *s_bh,
1128c2ecf20Sopenharmony_ci				  loff_t pos_in,
1138c2ecf20Sopenharmony_ci				  struct inode *t_inode,
1148c2ecf20Sopenharmony_ci				  struct buffer_head *t_bh,
1158c2ecf20Sopenharmony_ci				  loff_t pos_out,
1168c2ecf20Sopenharmony_ci				  loff_t len);
1178c2ecf20Sopenharmony_ciint ocfs2_reflink_inodes_lock(struct inode *s_inode,
1188c2ecf20Sopenharmony_ci			      struct buffer_head **bh1,
1198c2ecf20Sopenharmony_ci			      struct inode *t_inode,
1208c2ecf20Sopenharmony_ci			      struct buffer_head **bh2);
1218c2ecf20Sopenharmony_civoid ocfs2_reflink_inodes_unlock(struct inode *s_inode,
1228c2ecf20Sopenharmony_ci				 struct buffer_head *s_bh,
1238c2ecf20Sopenharmony_ci				 struct inode *t_inode,
1248c2ecf20Sopenharmony_ci				 struct buffer_head *t_bh);
1258c2ecf20Sopenharmony_ciint ocfs2_reflink_update_dest(struct inode *dest,
1268c2ecf20Sopenharmony_ci			      struct buffer_head *d_bh,
1278c2ecf20Sopenharmony_ci			      loff_t newlen);
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci#endif /* OCFS2_REFCOUNTTREE_H */
130