Blame view
fs/ocfs2/suballoc.h
7.08 KB
ccd979bdb [PATCH] OCFS2: Th... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/* -*- mode: c; c-basic-offset: 8; -*- * vim: noexpandtab sw=8 ts=8 sts=0: * * suballoc.h * * Defines sub allocator api * * Copyright (C) 2003, 2004 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 as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * 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. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. */ #ifndef _CHAINALLOC_H_ #define _CHAINALLOC_H_ |
7d1fe093b ocfs2: Pass subal... |
28 |
struct ocfs2_suballoc_result; |
ccd979bdb [PATCH] OCFS2: Th... |
29 30 |
typedef int (group_search_t)(struct inode *, struct buffer_head *, |
1187c9688 ocfs2: Limit inod... |
31 32 33 |
u32, /* bits_wanted */ u32, /* min_bits */ u64, /* max_block */ |
7d1fe093b ocfs2: Pass subal... |
34 35 |
struct ocfs2_suballoc_result *); /* found bits */ |
ccd979bdb [PATCH] OCFS2: Th... |
36 37 38 39 |
struct ocfs2_alloc_context { struct inode *ac_inode; /* which bitmap are we allocating from? */ struct buffer_head *ac_bh; /* file entry bh */ |
a4a489116 ocfs2: Add ac_all... |
40 |
u32 ac_alloc_slot; /* which slot are we allocating from? */ |
ccd979bdb [PATCH] OCFS2: Th... |
41 42 43 44 45 46 47 |
u32 ac_bits_wanted; u32 ac_bits_given; #define OCFS2_AC_USE_LOCAL 1 #define OCFS2_AC_USE_MAIN 2 #define OCFS2_AC_USE_INODE 3 #define OCFS2_AC_USE_META 4 u32 ac_which; |
ccd979bdb [PATCH] OCFS2: Th... |
48 49 50 51 52 |
/* these are used by the chain search */ u16 ac_chain; int ac_allow_chain_relink; group_search_t *ac_group_search; |
883d4cae4 ocfs2: allocation... |
53 54 |
u64 ac_last_group; |
1187c9688 ocfs2: Limit inod... |
55 56 |
u64 ac_max_block; /* Highest block number to allocate. 0 is is the same as ~0 - unlimited */ |
d02f00cc0 ocfs2: allocation... |
57 |
|
e49e27674 ocfs2: allow retu... |
58 59 |
int ac_find_loc_only; /* hack for reflink operation ordering */ struct ocfs2_suballoc_result *ac_find_loc_priv; /* */ |
d02f00cc0 ocfs2: allocation... |
60 |
struct ocfs2_alloc_reservation *ac_resv; |
ccd979bdb [PATCH] OCFS2: Th... |
61 |
}; |
b89c54282 ocfs2: add extent... |
62 |
void ocfs2_init_steal_slots(struct ocfs2_super *osb); |
ccd979bdb [PATCH] OCFS2: Th... |
63 64 65 66 67 |
void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac); static inline int ocfs2_alloc_context_bits_left(struct ocfs2_alloc_context *ac) { return ac->ac_bits_wanted - ac->ac_bits_given; } |
811f933df ocfs2: Use ocfs2_... |
68 69 70 71 72 |
/* * Please note that the caller must make sure that root_el is the root * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise * the result may be wrong. */ |
ccd979bdb [PATCH] OCFS2: Th... |
73 |
int ocfs2_reserve_new_metadata(struct ocfs2_super *osb, |
811f933df ocfs2: Use ocfs2_... |
74 |
struct ocfs2_extent_list *root_el, |
ccd979bdb [PATCH] OCFS2: Th... |
75 |
struct ocfs2_alloc_context **ac); |
cf1d6c763 ocfs2: Add extend... |
76 77 78 |
int ocfs2_reserve_new_metadata_blocks(struct ocfs2_super *osb, int blocks, struct ocfs2_alloc_context **ac); |
ccd979bdb [PATCH] OCFS2: Th... |
79 |
int ocfs2_reserve_new_inode(struct ocfs2_super *osb, |
ccd979bdb [PATCH] OCFS2: Th... |
80 81 |
struct ocfs2_alloc_context **ac); int ocfs2_reserve_clusters(struct ocfs2_super *osb, |
ccd979bdb [PATCH] OCFS2: Th... |
82 83 |
u32 bits_wanted, struct ocfs2_alloc_context **ac); |
1ed9b777f ocfs2: ocfs2_clai... |
84 |
int ocfs2_claim_metadata(handle_t *handle, |
ccd979bdb [PATCH] OCFS2: Th... |
85 86 |
struct ocfs2_alloc_context *ac, u32 bits_wanted, |
2b6cb576a ocfs2: Set suball... |
87 |
u64 *suballoc_loc, |
ccd979bdb [PATCH] OCFS2: Th... |
88 89 90 |
u16 *suballoc_bit_start, u32 *num_bits, u64 *blkno_start); |
1ed9b777f ocfs2: ocfs2_clai... |
91 |
int ocfs2_claim_new_inode(handle_t *handle, |
138211515 ocfs2: Optimize i... |
92 93 |
struct inode *dir, struct buffer_head *parent_fe_bh, |
ccd979bdb [PATCH] OCFS2: Th... |
94 |
struct ocfs2_alloc_context *ac, |
2b6cb576a ocfs2: Set suball... |
95 |
u64 *suballoc_loc, |
ccd979bdb [PATCH] OCFS2: Th... |
96 97 |
u16 *suballoc_bit, u64 *fe_blkno); |
1ed9b777f ocfs2: ocfs2_clai... |
98 |
int ocfs2_claim_clusters(handle_t *handle, |
ccd979bdb [PATCH] OCFS2: Th... |
99 100 101 102 |
struct ocfs2_alloc_context *ac, u32 min_clusters, u32 *cluster_start, u32 *num_clusters); |
415cb8003 ocfs2: Allow smal... |
103 104 105 106 |
/* * Use this variant of ocfs2_claim_clusters to specify a maxiumum * number of clusters smaller than the allocation reserved. */ |
1ed9b777f ocfs2: ocfs2_clai... |
107 |
int __ocfs2_claim_clusters(handle_t *handle, |
415cb8003 ocfs2: Allow smal... |
108 109 110 111 112 |
struct ocfs2_alloc_context *ac, u32 min_clusters, u32 max_clusters, u32 *cluster_start, u32 *num_clusters); |
ccd979bdb [PATCH] OCFS2: Th... |
113 |
|
2b604351b ocfs2: simplify d... |
114 115 116 117 118 119 |
int ocfs2_free_suballoc_bits(handle_t *handle, struct inode *alloc_inode, struct buffer_head *alloc_bh, unsigned int start_bit, u64 bg_blkno, unsigned int count); |
1fabe1481 ocfs2: Remove str... |
120 |
int ocfs2_free_dinode(handle_t *handle, |
ccd979bdb [PATCH] OCFS2: Th... |
121 122 123 |
struct inode *inode_alloc_inode, struct buffer_head *inode_alloc_bh, struct ocfs2_dinode *di); |
1fabe1481 ocfs2: Remove str... |
124 |
int ocfs2_free_clusters(handle_t *handle, |
ccd979bdb [PATCH] OCFS2: Th... |
125 126 127 128 |
struct inode *bitmap_inode, struct buffer_head *bitmap_bh, u64 start_blk, unsigned int num_clusters); |
b4414eea0 ocfs2: Clear undo... |
129 130 131 132 133 |
int ocfs2_release_clusters(handle_t *handle, struct inode *bitmap_inode, struct buffer_head *bitmap_bh, u64 start_blk, unsigned int num_clusters); |
ccd979bdb [PATCH] OCFS2: Th... |
134 |
|
2b604351b ocfs2: simplify d... |
135 136 137 138 139 140 |
static inline u64 ocfs2_which_suballoc_group(u64 block, unsigned int bit) { u64 group = block - (u64) bit; return group; } |
ccd979bdb [PATCH] OCFS2: Th... |
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
static inline u32 ocfs2_cluster_from_desc(struct ocfs2_super *osb, u64 bg_blkno) { /* This should work for all block group descriptors as only * the 1st group descriptor of the cluster bitmap is * different. */ if (bg_blkno == osb->first_cluster_group_blkno) return 0; /* the rest of the block groups are located at the beginning * of their 1st cluster, so a direct translation just * works. */ return ocfs2_blocks_to_clusters(osb->sb, bg_blkno); } static inline int ocfs2_is_cluster_bitmap(struct inode *inode) { struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); return osb->bitmap_blkno == OCFS2_I(inode)->ip_blkno; } /* This is for local alloc ONLY. Others should use the task-specific * apis above. */ int ocfs2_reserve_cluster_bitmap_bits(struct ocfs2_super *osb, struct ocfs2_alloc_context *ac); |
9c7af40b2 ocfs2: throttle b... |
167 |
void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac); |
ccd979bdb [PATCH] OCFS2: Th... |
168 |
|
d659072f7 [PATCH 1/2] ocfs2... |
169 170 171 |
/* given a cluster offset, calculate which block group it belongs to * and return that block offset. */ u64 ocfs2_which_cluster_group(struct inode *inode, u32 cluster); |
57e3e7971 ocfs2: Consolidat... |
172 |
/* |
970e4936d ocfs2: Validate m... |
173 |
* By default, ocfs2_read_group_descriptor() calls ocfs2_error() when it |
57e3e7971 ocfs2: Consolidat... |
174 |
* finds a problem. A caller that wants to check a group descriptor |
970e4936d ocfs2: Validate m... |
175 176 177 |
* without going readonly should read the block with ocfs2_read_block[s]() * and then checking it with this function. This is only resize, really. * Everyone else should be using ocfs2_read_group_descriptor(). |
57e3e7971 ocfs2: Consolidat... |
178 |
*/ |
970e4936d ocfs2: Validate m... |
179 180 181 |
int ocfs2_check_group_descriptor(struct super_block *sb, struct ocfs2_dinode *di, struct buffer_head *bh); |
68f64d471 ocfs2: Wrap group... |
182 183 184 185 186 187 188 |
/* * Read a group descriptor block into *bh. If *bh is NULL, a bh will be * allocated. This is a cached read. The descriptor will be validated with * ocfs2_validate_group_descriptor(). */ int ocfs2_read_group_descriptor(struct inode *inode, struct ocfs2_dinode *di, u64 gd_blkno, struct buffer_head **bh); |
57e3e7971 ocfs2: Consolidat... |
189 |
|
f99b9b7cc ocfs2: Make ocfs2... |
190 |
int ocfs2_lock_allocators(struct inode *inode, struct ocfs2_extent_tree *et, |
e7d4cb6bc ocfs2: Abstract o... |
191 192 |
u32 clusters_to_add, u32 extents_to_split, struct ocfs2_alloc_context **data_ac, |
f99b9b7cc ocfs2: Make ocfs2... |
193 |
struct ocfs2_alloc_context **meta_ac); |
6ca497a83 ocfs2: fix rare s... |
194 195 |
int ocfs2_test_inode_bit(struct ocfs2_super *osb, u64 blkno, int *res); |
e49e27674 ocfs2: allow retu... |
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
/* * The following two interfaces are for ocfs2_create_inode_in_orphan(). */ int ocfs2_find_new_inode_loc(struct inode *dir, struct buffer_head *parent_fe_bh, struct ocfs2_alloc_context *ac, u64 *fe_blkno); int ocfs2_claim_new_inode_at_loc(handle_t *handle, struct inode *dir, struct ocfs2_alloc_context *ac, u64 *suballoc_loc, u16 *suballoc_bit, u64 di_blkno); |
ccd979bdb [PATCH] OCFS2: Th... |
213 |
#endif /* _CHAINALLOC_H_ */ |