cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

refcounttree.h (4405B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * refcounttree.h
      4 *
      5 * Copyright (C) 2009 Oracle.  All rights reserved.
      6 */
      7#ifndef OCFS2_REFCOUNTTREE_H
      8#define OCFS2_REFCOUNTTREE_H
      9
     10struct ocfs2_refcount_tree {
     11	struct rb_node rf_node;
     12	u64 rf_blkno;
     13	u32 rf_generation;
     14	struct kref rf_getcnt;
     15	struct rw_semaphore rf_sem;
     16	struct ocfs2_lock_res rf_lockres;
     17	int rf_removed;
     18
     19	/* the following 4 fields are used by caching_info. */
     20	spinlock_t rf_lock;
     21	struct ocfs2_caching_info rf_ci;
     22	struct mutex rf_io_mutex;
     23	struct super_block *rf_sb;
     24};
     25
     26void ocfs2_purge_refcount_trees(struct ocfs2_super *osb);
     27int ocfs2_lock_refcount_tree(struct ocfs2_super *osb, u64 ref_blkno, int rw,
     28			     struct ocfs2_refcount_tree **tree,
     29			     struct buffer_head **ref_bh);
     30void ocfs2_unlock_refcount_tree(struct ocfs2_super *osb,
     31				struct ocfs2_refcount_tree *tree,
     32				int rw);
     33
     34int ocfs2_decrease_refcount(struct inode *inode,
     35			    handle_t *handle, u32 cpos, u32 len,
     36			    struct ocfs2_alloc_context *meta_ac,
     37			    struct ocfs2_cached_dealloc_ctxt *dealloc,
     38			    int delete);
     39int ocfs2_prepare_refcount_change_for_del(struct inode *inode,
     40					  u64 refcount_loc,
     41					  u64 phys_blkno,
     42					  u32 clusters,
     43					  int *credits,
     44					  int *ref_blocks);
     45int ocfs2_refcount_cow(struct inode *inode,
     46		       struct buffer_head *di_bh,
     47		       u32 cpos, u32 write_len, u32 max_cpos);
     48
     49typedef int (ocfs2_post_refcount_func)(struct inode *inode,
     50				       handle_t *handle,
     51				       void *para);
     52/*
     53 * Some refcount caller need to do more work after we modify the data b-tree
     54 * during refcount operation(including CoW and add refcount flag), and make the
     55 * transaction complete. So it must give us this structure so that we can do it
     56 * within our transaction.
     57 *
     58 */
     59struct ocfs2_post_refcount {
     60	int credits;			/* credits it need for journal. */
     61	ocfs2_post_refcount_func *func;	/* real function. */
     62	void *para;
     63};
     64
     65int ocfs2_refcounted_xattr_delete_need(struct inode *inode,
     66				       struct ocfs2_caching_info *ref_ci,
     67				       struct buffer_head *ref_root_bh,
     68				       struct ocfs2_xattr_value_root *xv,
     69				       int *meta_add, int *credits);
     70int ocfs2_refcount_cow_xattr(struct inode *inode,
     71			     struct ocfs2_dinode *di,
     72			     struct ocfs2_xattr_value_buf *vb,
     73			     struct ocfs2_refcount_tree *ref_tree,
     74			     struct buffer_head *ref_root_bh,
     75			     u32 cpos, u32 write_len,
     76			     struct ocfs2_post_refcount *post);
     77int ocfs2_duplicate_clusters_by_page(handle_t *handle,
     78				     struct inode *inode,
     79				     u32 cpos, u32 old_cluster,
     80				     u32 new_cluster, u32 new_len);
     81int ocfs2_duplicate_clusters_by_jbd(handle_t *handle,
     82				    struct inode *inode,
     83				    u32 cpos, u32 old_cluster,
     84				    u32 new_cluster, u32 new_len);
     85int ocfs2_cow_sync_writeback(struct super_block *sb,
     86			     struct inode *inode,
     87			     u32 cpos, u32 num_clusters);
     88int ocfs2_add_refcount_flag(struct inode *inode,
     89			    struct ocfs2_extent_tree *data_et,
     90			    struct ocfs2_caching_info *ref_ci,
     91			    struct buffer_head *ref_root_bh,
     92			    u32 cpos, u32 p_cluster, u32 num_clusters,
     93			    struct ocfs2_cached_dealloc_ctxt *dealloc,
     94			    struct ocfs2_post_refcount *post);
     95int ocfs2_remove_refcount_tree(struct inode *inode, struct buffer_head *di_bh);
     96int ocfs2_try_remove_refcount_tree(struct inode *inode,
     97				   struct buffer_head *di_bh);
     98int ocfs2_increase_refcount(handle_t *handle,
     99			    struct ocfs2_caching_info *ci,
    100			    struct buffer_head *ref_root_bh,
    101			    u64 cpos, u32 len,
    102			    struct ocfs2_alloc_context *meta_ac,
    103			    struct ocfs2_cached_dealloc_ctxt *dealloc);
    104int ocfs2_reflink_ioctl(struct inode *inode,
    105			const char __user *oldname,
    106			const char __user *newname,
    107			bool preserve);
    108loff_t ocfs2_reflink_remap_blocks(struct inode *s_inode,
    109				  struct buffer_head *s_bh,
    110				  loff_t pos_in,
    111				  struct inode *t_inode,
    112				  struct buffer_head *t_bh,
    113				  loff_t pos_out,
    114				  loff_t len);
    115int ocfs2_reflink_inodes_lock(struct inode *s_inode,
    116			      struct buffer_head **bh1,
    117			      struct inode *t_inode,
    118			      struct buffer_head **bh2);
    119void ocfs2_reflink_inodes_unlock(struct inode *s_inode,
    120				 struct buffer_head *s_bh,
    121				 struct inode *t_inode,
    122				 struct buffer_head *t_bh);
    123int ocfs2_reflink_update_dest(struct inode *dest,
    124			      struct buffer_head *d_bh,
    125			      loff_t newlen);
    126
    127#endif /* OCFS2_REFCOUNTTREE_H */