Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * alloc.h
0004  *
0005  * Function prototypes
0006  *
0007  * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
0008  */
0009 
0010 #ifndef OCFS2_ALLOC_H
0011 #define OCFS2_ALLOC_H
0012 
0013 
0014 /*
0015  * For xattr tree leaf, we limit the leaf byte size to be 64K.
0016  */
0017 #define OCFS2_MAX_XATTR_TREE_LEAF_SIZE 65536
0018 
0019 /*
0020  * ocfs2_extent_tree and ocfs2_extent_tree_operations are used to abstract
0021  * the b-tree operations in ocfs2. Now all the b-tree operations are not
0022  * limited to ocfs2_dinode only. Any data which need to allocate clusters
0023  * to store can use b-tree. And it only needs to implement its ocfs2_extent_tree
0024  * and operation.
0025  *
0026  * ocfs2_extent_tree becomes the first-class object for extent tree
0027  * manipulation.  Callers of the alloc.c code need to fill it via one of
0028  * the ocfs2_init_*_extent_tree() operations below.
0029  *
0030  * ocfs2_extent_tree contains info for the root of the b-tree, it must have a
0031  * root ocfs2_extent_list and a root_bh so that they can be used in the b-tree
0032  * functions.  It needs the ocfs2_caching_info structure associated with
0033  * I/O on the tree.  With metadata ecc, we now call different journal_access
0034  * functions for each type of metadata, so it must have the
0035  * root_journal_access function.
0036  * ocfs2_extent_tree_operations abstract the normal operations we do for
0037  * the root of extent b-tree.
0038  */
0039 struct ocfs2_extent_tree_operations;
0040 struct ocfs2_extent_tree {
0041     const struct ocfs2_extent_tree_operations *et_ops;
0042     struct buffer_head          *et_root_bh;
0043     struct ocfs2_extent_list        *et_root_el;
0044     struct ocfs2_caching_info       *et_ci;
0045     ocfs2_journal_access_func       et_root_journal_access;
0046     void                    *et_object;
0047     unsigned int                et_max_leaf_clusters;
0048     struct ocfs2_cached_dealloc_ctxt    *et_dealloc;
0049 };
0050 
0051 /*
0052  * ocfs2_init_*_extent_tree() will fill an ocfs2_extent_tree from the
0053  * specified object buffer.
0054  */
0055 void ocfs2_init_dinode_extent_tree(struct ocfs2_extent_tree *et,
0056                    struct ocfs2_caching_info *ci,
0057                    struct buffer_head *bh);
0058 void ocfs2_init_xattr_tree_extent_tree(struct ocfs2_extent_tree *et,
0059                        struct ocfs2_caching_info *ci,
0060                        struct buffer_head *bh);
0061 struct ocfs2_xattr_value_buf;
0062 void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et,
0063                     struct ocfs2_caching_info *ci,
0064                     struct ocfs2_xattr_value_buf *vb);
0065 void ocfs2_init_dx_root_extent_tree(struct ocfs2_extent_tree *et,
0066                     struct ocfs2_caching_info *ci,
0067                     struct buffer_head *bh);
0068 void ocfs2_init_refcount_extent_tree(struct ocfs2_extent_tree *et,
0069                      struct ocfs2_caching_info *ci,
0070                      struct buffer_head *bh);
0071 
0072 /*
0073  * Read an extent block into *bh.  If *bh is NULL, a bh will be
0074  * allocated.  This is a cached read.  The extent block will be validated
0075  * with ocfs2_validate_extent_block().
0076  */
0077 int ocfs2_read_extent_block(struct ocfs2_caching_info *ci, u64 eb_blkno,
0078                 struct buffer_head **bh);
0079 
0080 struct ocfs2_alloc_context;
0081 int ocfs2_insert_extent(handle_t *handle,
0082             struct ocfs2_extent_tree *et,
0083             u32 cpos,
0084             u64 start_blk,
0085             u32 new_clusters,
0086             u8 flags,
0087             struct ocfs2_alloc_context *meta_ac);
0088 
0089 enum ocfs2_alloc_restarted {
0090     RESTART_NONE = 0,
0091     RESTART_TRANS,
0092     RESTART_META
0093 };
0094 int ocfs2_add_clusters_in_btree(handle_t *handle,
0095                 struct ocfs2_extent_tree *et,
0096                 u32 *logical_offset,
0097                 u32 clusters_to_add,
0098                 int mark_unwritten,
0099                 struct ocfs2_alloc_context *data_ac,
0100                 struct ocfs2_alloc_context *meta_ac,
0101                 enum ocfs2_alloc_restarted *reason_ret);
0102 struct ocfs2_cached_dealloc_ctxt;
0103 struct ocfs2_path;
0104 int ocfs2_split_extent(handle_t *handle,
0105                struct ocfs2_extent_tree *et,
0106                struct ocfs2_path *path,
0107                int split_index,
0108                struct ocfs2_extent_rec *split_rec,
0109                struct ocfs2_alloc_context *meta_ac,
0110                struct ocfs2_cached_dealloc_ctxt *dealloc);
0111 int ocfs2_mark_extent_written(struct inode *inode,
0112                   struct ocfs2_extent_tree *et,
0113                   handle_t *handle, u32 cpos, u32 len, u32 phys,
0114                   struct ocfs2_alloc_context *meta_ac,
0115                   struct ocfs2_cached_dealloc_ctxt *dealloc);
0116 int ocfs2_change_extent_flag(handle_t *handle,
0117                  struct ocfs2_extent_tree *et,
0118                  u32 cpos, u32 len, u32 phys,
0119                  struct ocfs2_alloc_context *meta_ac,
0120                  struct ocfs2_cached_dealloc_ctxt *dealloc,
0121                  int new_flags, int clear_flags);
0122 int ocfs2_remove_extent(handle_t *handle, struct ocfs2_extent_tree *et,
0123             u32 cpos, u32 len,
0124             struct ocfs2_alloc_context *meta_ac,
0125             struct ocfs2_cached_dealloc_ctxt *dealloc);
0126 int ocfs2_remove_btree_range(struct inode *inode,
0127                  struct ocfs2_extent_tree *et,
0128                  u32 cpos, u32 phys_cpos, u32 len, int flags,
0129                  struct ocfs2_cached_dealloc_ctxt *dealloc,
0130                  u64 refcount_loc, bool refcount_tree_locked);
0131 
0132 int ocfs2_num_free_extents(struct ocfs2_extent_tree *et);
0133 
0134 /*
0135  * how many new metadata chunks would an allocation need at maximum?
0136  *
0137  * Please note that the caller must make sure that root_el is the root
0138  * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
0139  * the result may be wrong.
0140  */
0141 static inline int ocfs2_extend_meta_needed(struct ocfs2_extent_list *root_el)
0142 {
0143     /*
0144      * Rather than do all the work of determining how much we need
0145      * (involves a ton of reads and locks), just ask for the
0146      * maximal limit.  That's a tree depth shift.  So, one block for
0147      * level of the tree (current l_tree_depth), one block for the
0148      * new tree_depth==0 extent_block, and one block at the new
0149      * top-of-the tree.
0150      */
0151     return le16_to_cpu(root_el->l_tree_depth) + 2;
0152 }
0153 
0154 void ocfs2_dinode_new_extent_list(struct inode *inode, struct ocfs2_dinode *di);
0155 void ocfs2_set_inode_data_inline(struct inode *inode, struct ocfs2_dinode *di);
0156 int ocfs2_convert_inline_data_to_extents(struct inode *inode,
0157                      struct buffer_head *di_bh);
0158 
0159 int ocfs2_truncate_log_init(struct ocfs2_super *osb);
0160 void ocfs2_truncate_log_shutdown(struct ocfs2_super *osb);
0161 void ocfs2_schedule_truncate_log_flush(struct ocfs2_super *osb,
0162                        int cancel);
0163 int ocfs2_flush_truncate_log(struct ocfs2_super *osb);
0164 int ocfs2_begin_truncate_log_recovery(struct ocfs2_super *osb,
0165                       int slot_num,
0166                       struct ocfs2_dinode **tl_copy);
0167 int ocfs2_complete_truncate_log_recovery(struct ocfs2_super *osb,
0168                      struct ocfs2_dinode *tl_copy);
0169 int ocfs2_truncate_log_needs_flush(struct ocfs2_super *osb);
0170 int ocfs2_truncate_log_append(struct ocfs2_super *osb,
0171                   handle_t *handle,
0172                   u64 start_blk,
0173                   unsigned int num_clusters);
0174 int __ocfs2_flush_truncate_log(struct ocfs2_super *osb);
0175 int ocfs2_try_to_free_truncate_log(struct ocfs2_super *osb,
0176                    unsigned int needed);
0177 
0178 /*
0179  * Process local structure which describes the block unlinks done
0180  * during an operation. This is populated via
0181  * ocfs2_cache_block_dealloc().
0182  *
0183  * ocfs2_run_deallocs() should be called after the potentially
0184  * de-allocating routines. No journal handles should be open, and most
0185  * locks should have been dropped.
0186  */
0187 struct ocfs2_cached_dealloc_ctxt {
0188     struct ocfs2_per_slot_free_list     *c_first_suballocator;
0189     struct ocfs2_cached_block_free      *c_global_allocator;
0190 };
0191 static inline void ocfs2_init_dealloc_ctxt(struct ocfs2_cached_dealloc_ctxt *c)
0192 {
0193     c->c_first_suballocator = NULL;
0194     c->c_global_allocator = NULL;
0195 }
0196 int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
0197                 u64 blkno, unsigned int bit);
0198 int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
0199                   int type, int slot, u64 suballoc, u64 blkno,
0200                   unsigned int bit);
0201 static inline int ocfs2_dealloc_has_cluster(struct ocfs2_cached_dealloc_ctxt *c)
0202 {
0203     return c->c_global_allocator != NULL;
0204 }
0205 int ocfs2_run_deallocs(struct ocfs2_super *osb,
0206                struct ocfs2_cached_dealloc_ctxt *ctxt);
0207 
0208 struct ocfs2_truncate_context {
0209     struct ocfs2_cached_dealloc_ctxt tc_dealloc;
0210     int tc_ext_alloc_locked; /* is it cluster locked? */
0211     /* these get destroyed once it's passed to ocfs2_commit_truncate. */
0212     struct buffer_head *tc_last_eb_bh;
0213 };
0214 
0215 int ocfs2_zero_range_for_truncate(struct inode *inode, handle_t *handle,
0216                   u64 range_start, u64 range_end);
0217 int ocfs2_commit_truncate(struct ocfs2_super *osb,
0218               struct inode *inode,
0219               struct buffer_head *di_bh);
0220 int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,
0221               unsigned int start, unsigned int end, int trunc);
0222 
0223 int ocfs2_find_leaf(struct ocfs2_caching_info *ci,
0224             struct ocfs2_extent_list *root_el, u32 cpos,
0225             struct buffer_head **leaf_bh);
0226 int ocfs2_search_extent_list(struct ocfs2_extent_list *el, u32 v_cluster);
0227 
0228 int ocfs2_trim_fs(struct super_block *sb, struct fstrim_range *range);
0229 /*
0230  * Helper function to look at the # of clusters in an extent record.
0231  */
0232 static inline unsigned int ocfs2_rec_clusters(struct ocfs2_extent_list *el,
0233                           struct ocfs2_extent_rec *rec)
0234 {
0235     /*
0236      * Cluster count in extent records is slightly different
0237      * between interior nodes and leaf nodes. This is to support
0238      * unwritten extents which need a flags field in leaf node
0239      * records, thus shrinking the available space for a clusters
0240      * field.
0241      */
0242     if (el->l_tree_depth)
0243         return le32_to_cpu(rec->e_int_clusters);
0244     else
0245         return le16_to_cpu(rec->e_leaf_clusters);
0246 }
0247 
0248 /*
0249  * This is only valid for leaf nodes, which are the only ones that can
0250  * have empty extents anyway.
0251  */
0252 static inline int ocfs2_is_empty_extent(struct ocfs2_extent_rec *rec)
0253 {
0254     return !rec->e_leaf_clusters;
0255 }
0256 
0257 int ocfs2_grab_pages(struct inode *inode, loff_t start, loff_t end,
0258              struct page **pages, int *num);
0259 void ocfs2_map_and_dirty_page(struct inode *inode, handle_t *handle,
0260                   unsigned int from, unsigned int to,
0261                   struct page *page, int zero, u64 *phys);
0262 /*
0263  * Structures which describe a path through a btree, and functions to
0264  * manipulate them.
0265  *
0266  * The idea here is to be as generic as possible with the tree
0267  * manipulation code.
0268  */
0269 struct ocfs2_path_item {
0270     struct buffer_head      *bh;
0271     struct ocfs2_extent_list    *el;
0272 };
0273 
0274 #define OCFS2_MAX_PATH_DEPTH    5
0275 
0276 struct ocfs2_path {
0277     int             p_tree_depth;
0278     ocfs2_journal_access_func   p_root_access;
0279     struct ocfs2_path_item      p_node[OCFS2_MAX_PATH_DEPTH];
0280 };
0281 
0282 #define path_root_bh(_path) ((_path)->p_node[0].bh)
0283 #define path_root_el(_path) ((_path)->p_node[0].el)
0284 #define path_root_access(_path)((_path)->p_root_access)
0285 #define path_leaf_bh(_path) ((_path)->p_node[(_path)->p_tree_depth].bh)
0286 #define path_leaf_el(_path) ((_path)->p_node[(_path)->p_tree_depth].el)
0287 #define path_num_items(_path) ((_path)->p_tree_depth + 1)
0288 
0289 void ocfs2_reinit_path(struct ocfs2_path *path, int keep_root);
0290 void ocfs2_free_path(struct ocfs2_path *path);
0291 int ocfs2_find_path(struct ocfs2_caching_info *ci,
0292             struct ocfs2_path *path,
0293             u32 cpos);
0294 struct ocfs2_path *ocfs2_new_path_from_path(struct ocfs2_path *path);
0295 struct ocfs2_path *ocfs2_new_path_from_et(struct ocfs2_extent_tree *et);
0296 int ocfs2_path_bh_journal_access(handle_t *handle,
0297                  struct ocfs2_caching_info *ci,
0298                  struct ocfs2_path *path,
0299                  int idx);
0300 int ocfs2_journal_access_path(struct ocfs2_caching_info *ci,
0301                   handle_t *handle,
0302                   struct ocfs2_path *path);
0303 int ocfs2_find_cpos_for_right_leaf(struct super_block *sb,
0304                    struct ocfs2_path *path, u32 *cpos);
0305 int ocfs2_find_cpos_for_left_leaf(struct super_block *sb,
0306                   struct ocfs2_path *path, u32 *cpos);
0307 int ocfs2_find_subtree_root(struct ocfs2_extent_tree *et,
0308                 struct ocfs2_path *left,
0309                 struct ocfs2_path *right);
0310 #endif /* OCFS2_ALLOC_H */