Branch data Line data Source code
1 : : /*
2 : : * linux/fs/ext2/balloc.c
3 : : *
4 : : * Copyright (C) 1992, 1993, 1994, 1995
5 : : * Remy Card (card@masi.ibp.fr)
6 : : * Laboratoire MASI - Institut Blaise Pascal
7 : : * Universite Pierre et Marie Curie (Paris VI)
8 : : *
9 : : * Enhanced block allocation by Stephen Tweedie (sct@redhat.com), 1993
10 : : * Big-endian to little-endian byte-swapping/bitmaps by
11 : : * David S. Miller (davem@caip.rutgers.edu), 1995
12 : : */
13 : :
14 : : #include "ext2.h"
15 : : #include <linux/quotaops.h>
16 : : #include <linux/slab.h>
17 : : #include <linux/sched.h>
18 : : #include <linux/buffer_head.h>
19 : : #include <linux/capability.h>
20 : :
21 : : /*
22 : : * balloc.c contains the blocks allocation and deallocation routines
23 : : */
24 : :
25 : : /*
26 : : * The free blocks are managed by bitmaps. A file system contains several
27 : : * blocks groups. Each group contains 1 bitmap block for blocks, 1 bitmap
28 : : * block for inodes, N blocks for the inode table and data blocks.
29 : : *
30 : : * The file system contains group descriptors which are located after the
31 : : * super block. Each descriptor contains the number of the bitmap block and
32 : : * the free blocks count in the block. The descriptors are loaded in memory
33 : : * when a file system is mounted (see ext2_fill_super).
34 : : */
35 : :
36 : :
37 : : #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
38 : :
39 : 0 : struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
40 : : unsigned int block_group,
41 : : struct buffer_head ** bh)
42 : : {
43 : : unsigned long group_desc;
44 : : unsigned long offset;
45 : : struct ext2_group_desc * desc;
46 : : struct ext2_sb_info *sbi = EXT2_SB(sb);
47 : :
48 [ # # ]: 0 : if (block_group >= sbi->s_groups_count) {
49 : 0 : ext2_error (sb, "ext2_get_group_desc",
50 : : "block_group >= groups_count - "
51 : : "block_group = %d, groups_count = %lu",
52 : : block_group, sbi->s_groups_count);
53 : :
54 : 0 : return NULL;
55 : : }
56 : :
57 : 0 : group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
58 : 0 : offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
59 [ # # ]: 0 : if (!sbi->s_group_desc[group_desc]) {
60 : 0 : ext2_error (sb, "ext2_get_group_desc",
61 : : "Group descriptor not loaded - "
62 : : "block_group = %d, group_desc = %lu, desc = %lu",
63 : : block_group, group_desc, offset);
64 : 0 : return NULL;
65 : : }
66 : :
67 : 0 : desc = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data;
68 [ # # ]: 0 : if (bh)
69 : 0 : *bh = sbi->s_group_desc[group_desc];
70 : 0 : return desc + offset;
71 : : }
72 : :
73 : 0 : static int ext2_valid_block_bitmap(struct super_block *sb,
74 : : struct ext2_group_desc *desc,
75 : : unsigned int block_group,
76 : : struct buffer_head *bh)
77 : : {
78 : : ext2_grpblk_t offset;
79 : : ext2_grpblk_t next_zero_bit;
80 : : ext2_fsblk_t bitmap_blk;
81 : : ext2_fsblk_t group_first_block;
82 : :
83 : : group_first_block = ext2_group_first_block_no(sb, block_group);
84 : :
85 : : /* check whether block bitmap block number is set */
86 : 0 : bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
87 : 0 : offset = bitmap_blk - group_first_block;
88 [ # # ]: 0 : if (!ext2_test_bit(offset, bh->b_data))
89 : : /* bad block bitmap */
90 : : goto err_out;
91 : :
92 : : /* check whether the inode bitmap block number is set */
93 : 0 : bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
94 : 0 : offset = bitmap_blk - group_first_block;
95 [ # # ]: 0 : if (!ext2_test_bit(offset, bh->b_data))
96 : : /* bad block bitmap */
97 : : goto err_out;
98 : :
99 : : /* check whether the inode table block number is set */
100 : 0 : bitmap_blk = le32_to_cpu(desc->bg_inode_table);
101 : 0 : offset = bitmap_blk - group_first_block;
102 : 0 : next_zero_bit = ext2_find_next_zero_bit(bh->b_data,
103 : 0 : offset + EXT2_SB(sb)->s_itb_per_group,
104 : : offset);
105 [ # # ]: 0 : if (next_zero_bit >= offset + EXT2_SB(sb)->s_itb_per_group)
106 : : /* good bitmap for inode tables */
107 : : return 1;
108 : :
109 : : err_out:
110 : 0 : ext2_error(sb, __func__,
111 : : "Invalid block bitmap - "
112 : : "block_group = %d, block = %lu",
113 : : block_group, bitmap_blk);
114 : : return 0;
115 : : }
116 : :
117 : : /*
118 : : * Read the bitmap for a given block_group,and validate the
119 : : * bits for block/inode/inode tables are set in the bitmaps
120 : : *
121 : : * Return buffer_head on success or NULL in case of failure.
122 : : */
123 : : static struct buffer_head *
124 : 0 : read_block_bitmap(struct super_block *sb, unsigned int block_group)
125 : : {
126 : : struct ext2_group_desc * desc;
127 : 0 : struct buffer_head * bh = NULL;
128 : : ext2_fsblk_t bitmap_blk;
129 : :
130 : 0 : desc = ext2_get_group_desc(sb, block_group, NULL);
131 [ # # ]: 0 : if (!desc)
132 : : return NULL;
133 : 0 : bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
134 : 0 : bh = sb_getblk(sb, bitmap_blk);
135 [ # # ]: 0 : if (unlikely(!bh)) {
136 : 0 : ext2_error(sb, __func__,
137 : : "Cannot read block bitmap - "
138 : : "block_group = %d, block_bitmap = %u",
139 : : block_group, le32_to_cpu(desc->bg_block_bitmap));
140 : 0 : return NULL;
141 : : }
142 [ # # ]: 0 : if (likely(bh_uptodate_or_lock(bh)))
143 : : return bh;
144 : :
145 [ # # ]: 0 : if (bh_submit_read(bh) < 0) {
146 : : brelse(bh);
147 : 0 : ext2_error(sb, __func__,
148 : : "Cannot read block bitmap - "
149 : : "block_group = %d, block_bitmap = %u",
150 : : block_group, le32_to_cpu(desc->bg_block_bitmap));
151 : 0 : return NULL;
152 : : }
153 : :
154 : 0 : ext2_valid_block_bitmap(sb, desc, block_group, bh);
155 : : /*
156 : : * file system mounted not to panic on error, continue with corrupt
157 : : * bitmap
158 : : */
159 : 0 : return bh;
160 : : }
161 : :
162 : 0 : static void group_adjust_blocks(struct super_block *sb, int group_no,
163 : : struct ext2_group_desc *desc, struct buffer_head *bh, int count)
164 : : {
165 [ # # ]: 0 : if (count) {
166 : 0 : struct ext2_sb_info *sbi = EXT2_SB(sb);
167 : : unsigned free_blocks;
168 : :
169 : 0 : spin_lock(sb_bgl_lock(sbi, group_no));
170 : 0 : free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
171 : 0 : desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count);
172 : 0 : spin_unlock(sb_bgl_lock(sbi, group_no));
173 : 0 : mark_buffer_dirty(bh);
174 : : }
175 : 0 : }
176 : :
177 : : /*
178 : : * The reservation window structure operations
179 : : * --------------------------------------------
180 : : * Operations include:
181 : : * dump, find, add, remove, is_empty, find_next_reservable_window, etc.
182 : : *
183 : : * We use a red-black tree to represent per-filesystem reservation
184 : : * windows.
185 : : *
186 : : */
187 : :
188 : : /**
189 : : * __rsv_window_dump() -- Dump the filesystem block allocation reservation map
190 : : * @rb_root: root of per-filesystem reservation rb tree
191 : : * @verbose: verbose mode
192 : : * @fn: function which wishes to dump the reservation map
193 : : *
194 : : * If verbose is turned on, it will print the whole block reservation
195 : : * windows(start, end). Otherwise, it will only print out the "bad" windows,
196 : : * those windows that overlap with their immediate neighbors.
197 : : */
198 : : #if 1
199 : 0 : static void __rsv_window_dump(struct rb_root *root, int verbose,
200 : : const char *fn)
201 : : {
202 : : struct rb_node *n;
203 : : struct ext2_reserve_window_node *rsv, *prev;
204 : : int bad;
205 : :
206 : : restart:
207 : 0 : n = rb_first(root);
208 : : bad = 0;
209 : : prev = NULL;
210 : :
211 : 0 : printk("Block Allocation Reservation Windows Map (%s):\n", fn);
212 [ # # ]: 0 : while (n) {
213 : : rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
214 [ # # ]: 0 : if (verbose)
215 : 0 : printk("reservation window 0x%p "
216 : : "start: %lu, end: %lu\n",
217 : : rsv, rsv->rsv_start, rsv->rsv_end);
218 [ # # ][ # # ]: 0 : if (rsv->rsv_start && rsv->rsv_start >= rsv->rsv_end) {
219 : 0 : printk("Bad reservation %p (start >= end)\n",
220 : : rsv);
221 : : bad = 1;
222 : : }
223 [ # # ][ # # ]: 0 : if (prev && prev->rsv_end >= rsv->rsv_start) {
224 : 0 : printk("Bad reservation %p (prev->end >= start)\n",
225 : : rsv);
226 : : bad = 1;
227 : : }
228 [ # # ]: 0 : if (bad) {
229 [ # # ]: 0 : if (!verbose) {
230 : 0 : printk("Restarting reservation walk in verbose mode\n");
231 : : verbose = 1;
232 : 0 : goto restart;
233 : : }
234 : : }
235 : 0 : n = rb_next(n);
236 : : prev = rsv;
237 : : }
238 : 0 : printk("Window map complete.\n");
239 [ # # ]: 0 : BUG_ON(bad);
240 : 0 : }
241 : : #define rsv_window_dump(root, verbose) \
242 : : __rsv_window_dump((root), (verbose), __func__)
243 : : #else
244 : : #define rsv_window_dump(root, verbose) do {} while (0)
245 : : #endif
246 : :
247 : : /**
248 : : * goal_in_my_reservation()
249 : : * @rsv: inode's reservation window
250 : : * @grp_goal: given goal block relative to the allocation block group
251 : : * @group: the current allocation block group
252 : : * @sb: filesystem super block
253 : : *
254 : : * Test if the given goal block (group relative) is within the file's
255 : : * own block reservation window range.
256 : : *
257 : : * If the reservation window is outside the goal allocation group, return 0;
258 : : * grp_goal (given goal block) could be -1, which means no specific
259 : : * goal block. In this case, always return 1.
260 : : * If the goal block is within the reservation window, return 1;
261 : : * otherwise, return 0;
262 : : */
263 : : static int
264 : 0 : goal_in_my_reservation(struct ext2_reserve_window *rsv, ext2_grpblk_t grp_goal,
265 : : unsigned int group, struct super_block * sb)
266 : : {
267 : : ext2_fsblk_t group_first_block, group_last_block;
268 : :
269 : : group_first_block = ext2_group_first_block_no(sb, group);
270 : 0 : group_last_block = group_first_block + EXT2_BLOCKS_PER_GROUP(sb) - 1;
271 : :
272 [ # # ][ # # ]: 0 : if ((rsv->_rsv_start > group_last_block) ||
273 : 0 : (rsv->_rsv_end < group_first_block))
274 : : return 0;
275 [ # # ][ # # ]: 0 : if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start)
276 [ # # ]: 0 : || (grp_goal + group_first_block > rsv->_rsv_end)))
277 : : return 0;
278 : 0 : return 1;
279 : : }
280 : :
281 : : /**
282 : : * search_reserve_window()
283 : : * @rb_root: root of reservation tree
284 : : * @goal: target allocation block
285 : : *
286 : : * Find the reserved window which includes the goal, or the previous one
287 : : * if the goal is not in any window.
288 : : * Returns NULL if there are no windows or if all windows start after the goal.
289 : : */
290 : : static struct ext2_reserve_window_node *
291 : 0 : search_reserve_window(struct rb_root *root, ext2_fsblk_t goal)
292 : : {
293 : 0 : struct rb_node *n = root->rb_node;
294 : : struct ext2_reserve_window_node *rsv;
295 : :
296 [ # # ]: 0 : if (!n)
297 : : return NULL;
298 : :
299 : : do {
300 : : rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
301 : :
302 [ # # ]: 0 : if (goal < rsv->rsv_start)
303 : 0 : n = n->rb_left;
304 [ # # ]: 0 : else if (goal > rsv->rsv_end)
305 : 0 : n = n->rb_right;
306 : : else
307 : : return rsv;
308 [ # # ]: 0 : } while (n);
309 : : /*
310 : : * We've fallen off the end of the tree: the goal wasn't inside
311 : : * any particular node. OK, the previous node must be to one
312 : : * side of the interval containing the goal. If it's the RHS,
313 : : * we need to back up one.
314 : : */
315 [ # # ]: 0 : if (rsv->rsv_start > goal) {
316 : 0 : n = rb_prev(&rsv->rsv_node);
317 : : rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
318 : : }
319 : 0 : return rsv;
320 : : }
321 : :
322 : : /*
323 : : * ext2_rsv_window_add() -- Insert a window to the block reservation rb tree.
324 : : * @sb: super block
325 : : * @rsv: reservation window to add
326 : : *
327 : : * Must be called with rsv_lock held.
328 : : */
329 : 0 : void ext2_rsv_window_add(struct super_block *sb,
330 : : struct ext2_reserve_window_node *rsv)
331 : : {
332 : 0 : struct rb_root *root = &EXT2_SB(sb)->s_rsv_window_root;
333 : 0 : struct rb_node *node = &rsv->rsv_node;
334 : 0 : ext2_fsblk_t start = rsv->rsv_start;
335 : :
336 : : struct rb_node ** p = &root->rb_node;
337 : : struct rb_node * parent = NULL;
338 : : struct ext2_reserve_window_node *this;
339 : :
340 [ # # ]: 0 : while (*p)
341 : : {
342 : : parent = *p;
343 : : this = rb_entry(parent, struct ext2_reserve_window_node, rsv_node);
344 : :
345 [ # # ]: 0 : if (start < this->rsv_start)
346 : 0 : p = &(*p)->rb_left;
347 [ # # ]: 0 : else if (start > this->rsv_end)
348 : 0 : p = &(*p)->rb_right;
349 : : else {
350 : 0 : rsv_window_dump(root, 1);
351 : 0 : BUG();
352 : : }
353 : : }
354 : :
355 : : rb_link_node(node, parent, p);
356 : 0 : rb_insert_color(node, root);
357 : 0 : }
358 : :
359 : : /**
360 : : * rsv_window_remove() -- unlink a window from the reservation rb tree
361 : : * @sb: super block
362 : : * @rsv: reservation window to remove
363 : : *
364 : : * Mark the block reservation window as not allocated, and unlink it
365 : : * from the filesystem reservation window rb tree. Must be called with
366 : : * rsv_lock held.
367 : : */
368 : 0 : static void rsv_window_remove(struct super_block *sb,
369 : : struct ext2_reserve_window_node *rsv)
370 : : {
371 : 0 : rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
372 : 0 : rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
373 : 0 : rsv->rsv_alloc_hit = 0;
374 : 0 : rb_erase(&rsv->rsv_node, &EXT2_SB(sb)->s_rsv_window_root);
375 : : }
376 : :
377 : : /*
378 : : * rsv_is_empty() -- Check if the reservation window is allocated.
379 : : * @rsv: given reservation window to check
380 : : *
381 : : * returns 1 if the end block is EXT2_RESERVE_WINDOW_NOT_ALLOCATED.
382 : : */
383 : : static inline int rsv_is_empty(struct ext2_reserve_window *rsv)
384 : : {
385 : : /* a valid reservation end block could not be 0 */
386 : : return (rsv->_rsv_end == EXT2_RESERVE_WINDOW_NOT_ALLOCATED);
387 : : }
388 : :
389 : : /**
390 : : * ext2_init_block_alloc_info()
391 : : * @inode: file inode structure
392 : : *
393 : : * Allocate and initialize the reservation window structure, and
394 : : * link the window to the ext2 inode structure at last
395 : : *
396 : : * The reservation window structure is only dynamically allocated
397 : : * and linked to ext2 inode the first time the open file
398 : : * needs a new block. So, before every ext2_new_block(s) call, for
399 : : * regular files, we should check whether the reservation window
400 : : * structure exists or not. In the latter case, this function is called.
401 : : * Fail to do so will result in block reservation being turned off for that
402 : : * open file.
403 : : *
404 : : * This function is called from ext2_get_blocks_handle(), also called
405 : : * when setting the reservation window size through ioctl before the file
406 : : * is open for write (needs block allocation).
407 : : *
408 : : * Needs truncate_mutex protection prior to calling this function.
409 : : */
410 : 0 : void ext2_init_block_alloc_info(struct inode *inode)
411 : : {
412 : : struct ext2_inode_info *ei = EXT2_I(inode);
413 : : struct ext2_block_alloc_info *block_i;
414 : 0 : struct super_block *sb = inode->i_sb;
415 : :
416 : : block_i = kmalloc(sizeof(*block_i), GFP_NOFS);
417 [ # # ]: 0 : if (block_i) {
418 : : struct ext2_reserve_window_node *rsv = &block_i->rsv_window_node;
419 : :
420 : 0 : rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
421 : 0 : rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
422 : :
423 : : /*
424 : : * if filesystem is mounted with NORESERVATION, the goal
425 : : * reservation window size is set to zero to indicate
426 : : * block reservation is off
427 : : */
428 [ # # ]: 0 : if (!test_opt(sb, RESERVATION))
429 : 0 : rsv->rsv_goal_size = 0;
430 : : else
431 : 0 : rsv->rsv_goal_size = EXT2_DEFAULT_RESERVE_BLOCKS;
432 : 0 : rsv->rsv_alloc_hit = 0;
433 : 0 : block_i->last_alloc_logical_block = 0;
434 : 0 : block_i->last_alloc_physical_block = 0;
435 : : }
436 : 0 : ei->i_block_alloc_info = block_i;
437 : 0 : }
438 : :
439 : : /**
440 : : * ext2_discard_reservation()
441 : : * @inode: inode
442 : : *
443 : : * Discard(free) block reservation window on last file close, or truncate
444 : : * or at last iput().
445 : : *
446 : : * It is being called in three cases:
447 : : * ext2_release_file(): last writer closes the file
448 : : * ext2_clear_inode(): last iput(), when nobody links to this file.
449 : : * ext2_truncate(): when the block indirect map is about to change.
450 : : */
451 : 0 : void ext2_discard_reservation(struct inode *inode)
452 : : {
453 : : struct ext2_inode_info *ei = EXT2_I(inode);
454 : 0 : struct ext2_block_alloc_info *block_i = ei->i_block_alloc_info;
455 : : struct ext2_reserve_window_node *rsv;
456 : 0 : spinlock_t *rsv_lock = &EXT2_SB(inode->i_sb)->s_rsv_window_lock;
457 : :
458 [ # # ]: 0 : if (!block_i)
459 : 0 : return;
460 : :
461 : : rsv = &block_i->rsv_window_node;
462 [ # # ]: 0 : if (!rsv_is_empty(&rsv->rsv_window)) {
463 : : spin_lock(rsv_lock);
464 [ # # ]: 0 : if (!rsv_is_empty(&rsv->rsv_window))
465 : 0 : rsv_window_remove(inode->i_sb, rsv);
466 : : spin_unlock(rsv_lock);
467 : : }
468 : : }
469 : :
470 : : /**
471 : : * ext2_free_blocks() -- Free given blocks and update quota and i_blocks
472 : : * @inode: inode
473 : : * @block: start physical block to free
474 : : * @count: number of blocks to free
475 : : */
476 : 0 : void ext2_free_blocks (struct inode * inode, unsigned long block,
477 : : unsigned long count)
478 : : {
479 : : struct buffer_head *bitmap_bh = NULL;
480 : : struct buffer_head * bh2;
481 : : unsigned long block_group;
482 : : unsigned long bit;
483 : : unsigned long i;
484 : : unsigned long overflow;
485 : 0 : struct super_block * sb = inode->i_sb;
486 : : struct ext2_sb_info * sbi = EXT2_SB(sb);
487 : : struct ext2_group_desc * desc;
488 : 0 : struct ext2_super_block * es = sbi->s_es;
489 : : unsigned freed = 0, group_freed;
490 : :
491 [ # # ][ # # ]: 0 : if (block < le32_to_cpu(es->s_first_data_block) ||
492 [ # # ]: 0 : block + count < block ||
493 : 0 : block + count > le32_to_cpu(es->s_blocks_count)) {
494 : 0 : ext2_error (sb, "ext2_free_blocks",
495 : : "Freeing blocks not in datazone - "
496 : : "block = %lu, count = %lu", block, count);
497 : 0 : goto error_return;
498 : : }
499 : :
500 : : ext2_debug ("freeing block(s) %lu-%lu\n", block, block + count - 1);
501 : :
502 : : do_more:
503 : : overflow = 0;
504 : 0 : block_group = (block - le32_to_cpu(es->s_first_data_block)) /
505 : 0 : EXT2_BLOCKS_PER_GROUP(sb);
506 : 0 : bit = (block - le32_to_cpu(es->s_first_data_block)) %
507 : : EXT2_BLOCKS_PER_GROUP(sb);
508 : : /*
509 : : * Check to see if we are freeing blocks across a group
510 : : * boundary.
511 : : */
512 [ # # ]: 0 : if (bit + count > EXT2_BLOCKS_PER_GROUP(sb)) {
513 : 0 : overflow = bit + count - EXT2_BLOCKS_PER_GROUP(sb);
514 : 0 : count -= overflow;
515 : : }
516 : : brelse(bitmap_bh);
517 : 0 : bitmap_bh = read_block_bitmap(sb, block_group);
518 [ # # ]: 0 : if (!bitmap_bh)
519 : : goto error_return;
520 : :
521 : 0 : desc = ext2_get_group_desc (sb, block_group, &bh2);
522 [ # # ]: 0 : if (!desc)
523 : : goto error_return;
524 : :
525 [ # # ][ # # ]: 0 : if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) ||
[ # # ]
526 [ # # ][ # # ]: 0 : in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) ||
527 [ # # ]: 0 : in_range (block, le32_to_cpu(desc->bg_inode_table),
528 [ # # ]: 0 : sbi->s_itb_per_group) ||
529 [ # # ]: 0 : in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table),
530 : : sbi->s_itb_per_group)) {
531 : 0 : ext2_error (sb, "ext2_free_blocks",
532 : : "Freeing blocks in system zones - "
533 : : "Block = %lu, count = %lu",
534 : : block, count);
535 : 0 : goto error_return;
536 : : }
537 : :
538 [ # # ]: 0 : for (i = 0, group_freed = 0; i < count; i++) {
539 [ # # ]: 0 : if (!ext2_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
540 : : bit + i, bitmap_bh->b_data)) {
541 : 0 : ext2_error(sb, __func__,
542 : : "bit already cleared for block %lu", block + i);
543 : : } else {
544 : 0 : group_freed++;
545 : : }
546 : : }
547 : :
548 : 0 : mark_buffer_dirty(bitmap_bh);
549 [ # # ]: 0 : if (sb->s_flags & MS_SYNCHRONOUS)
550 : 0 : sync_dirty_buffer(bitmap_bh);
551 : :
552 : 0 : group_adjust_blocks(sb, block_group, desc, bh2, group_freed);
553 : 0 : freed += group_freed;
554 : :
555 [ # # ]: 0 : if (overflow) {
556 : : block += count;
557 : : count = overflow;
558 : : goto do_more;
559 : : }
560 : : error_return:
561 : : brelse(bitmap_bh);
562 [ # # ]: 0 : if (freed) {
563 : 0 : percpu_counter_add(&sbi->s_freeblocks_counter, freed);
564 : : dquot_free_block_nodirty(inode, freed);
565 : : mark_inode_dirty(inode);
566 : : }
567 : 0 : }
568 : :
569 : : /**
570 : : * bitmap_search_next_usable_block()
571 : : * @start: the starting block (group relative) of the search
572 : : * @bh: bufferhead contains the block group bitmap
573 : : * @maxblocks: the ending block (group relative) of the reservation
574 : : *
575 : : * The bitmap search --- search forward through the actual bitmap on disk until
576 : : * we find a bit free.
577 : : */
578 : : static ext2_grpblk_t
579 : : bitmap_search_next_usable_block(ext2_grpblk_t start, struct buffer_head *bh,
580 : : ext2_grpblk_t maxblocks)
581 : : {
582 : : ext2_grpblk_t next;
583 : :
584 : : next = ext2_find_next_zero_bit(bh->b_data, maxblocks, start);
585 [ # # ][ # # ]: 0 : if (next >= maxblocks)
586 : : return -1;
587 : : return next;
588 : : }
589 : :
590 : : /**
591 : : * find_next_usable_block()
592 : : * @start: the starting block (group relative) to find next
593 : : * allocatable block in bitmap.
594 : : * @bh: bufferhead contains the block group bitmap
595 : : * @maxblocks: the ending block (group relative) for the search
596 : : *
597 : : * Find an allocatable block in a bitmap. We perform the "most
598 : : * appropriate allocation" algorithm of looking for a free block near
599 : : * the initial goal; then for a free byte somewhere in the bitmap;
600 : : * then for any free bit in the bitmap.
601 : : */
602 : : static ext2_grpblk_t
603 : 0 : find_next_usable_block(int start, struct buffer_head *bh, int maxblocks)
604 : : {
605 : : ext2_grpblk_t here, next;
606 : : char *p, *r;
607 : :
608 [ # # ]: 0 : if (start > 0) {
609 : : /*
610 : : * The goal was occupied; search forward for a free
611 : : * block within the next XX blocks.
612 : : *
613 : : * end_goal is more or less random, but it has to be
614 : : * less than EXT2_BLOCKS_PER_GROUP. Aligning up to the
615 : : * next 64-bit boundary is simple..
616 : : */
617 : 0 : ext2_grpblk_t end_goal = (start + 63) & ~63;
618 [ # # ]: 0 : if (end_goal > maxblocks)
619 : : end_goal = maxblocks;
620 : 0 : here = ext2_find_next_zero_bit(bh->b_data, end_goal, start);
621 [ # # ]: 0 : if (here < end_goal)
622 : : return here;
623 : : ext2_debug("Bit not found near goal\n");
624 : : }
625 : :
626 : : here = start;
627 [ # # ]: 0 : if (here < 0)
628 : : here = 0;
629 : :
630 : 0 : p = ((char *)bh->b_data) + (here >> 3);
631 : 0 : r = memscan(p, 0, ((maxblocks + 7) >> 3) - (here >> 3));
632 : 0 : next = (r - ((char *)bh->b_data)) << 3;
633 : :
634 [ # # ]: 0 : if (next < maxblocks && next >= here)
635 : : return next;
636 : :
637 : : here = bitmap_search_next_usable_block(here, bh, maxblocks);
638 : : return here;
639 : : }
640 : :
641 : : /**
642 : : * ext2_try_to_allocate()
643 : : * @sb: superblock
644 : : * @group: given allocation block group
645 : : * @bitmap_bh: bufferhead holds the block bitmap
646 : : * @grp_goal: given target block within the group
647 : : * @count: target number of blocks to allocate
648 : : * @my_rsv: reservation window
649 : : *
650 : : * Attempt to allocate blocks within a give range. Set the range of allocation
651 : : * first, then find the first free bit(s) from the bitmap (within the range),
652 : : * and at last, allocate the blocks by claiming the found free bit as allocated.
653 : : *
654 : : * To set the range of this allocation:
655 : : * if there is a reservation window, only try to allocate block(s)
656 : : * from the file's own reservation window;
657 : : * Otherwise, the allocation range starts from the give goal block,
658 : : * ends at the block group's last block.
659 : : *
660 : : * If we failed to allocate the desired block then we may end up crossing to a
661 : : * new bitmap.
662 : : */
663 : : static int
664 : 0 : ext2_try_to_allocate(struct super_block *sb, int group,
665 : : struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
666 : : unsigned long *count,
667 : : struct ext2_reserve_window *my_rsv)
668 : : {
669 : : ext2_fsblk_t group_first_block;
670 : : ext2_grpblk_t start, end;
671 : : unsigned long num = 0;
672 : :
673 : : /* we do allocation within the reservation window if we have a window */
674 [ # # ]: 0 : if (my_rsv) {
675 : 0 : group_first_block = ext2_group_first_block_no(sb, group);
676 [ # # ]: 0 : if (my_rsv->_rsv_start >= group_first_block)
677 : 0 : start = my_rsv->_rsv_start - group_first_block;
678 : : else
679 : : /* reservation window cross group boundary */
680 : : start = 0;
681 : 0 : end = my_rsv->_rsv_end - group_first_block + 1;
682 [ # # ]: 0 : if (end > EXT2_BLOCKS_PER_GROUP(sb))
683 : : /* reservation window crosses group boundary */
684 : 0 : end = EXT2_BLOCKS_PER_GROUP(sb);
685 [ # # ]: 0 : if ((start <= grp_goal) && (grp_goal < end))
686 : : start = grp_goal;
687 : : else
688 : : grp_goal = -1;
689 : : } else {
690 [ # # ]: 0 : if (grp_goal > 0)
691 : : start = grp_goal;
692 : : else
693 : : start = 0;
694 : 0 : end = EXT2_BLOCKS_PER_GROUP(sb);
695 : : }
696 : :
697 [ # # ]: 0 : BUG_ON(start > EXT2_BLOCKS_PER_GROUP(sb));
698 : :
699 : : repeat:
700 [ # # ]: 0 : if (grp_goal < 0) {
701 : 0 : grp_goal = find_next_usable_block(start, bitmap_bh, end);
702 [ # # ]: 0 : if (grp_goal < 0)
703 : : goto fail_access;
704 [ # # ]: 0 : if (!my_rsv) {
705 : : int i;
706 : :
707 [ # # ][ # # ]: 0 : for (i = 0; i < 7 && grp_goal > start &&
708 : 0 : !ext2_test_bit(grp_goal - 1,
709 : 0 : bitmap_bh->b_data);
710 : 0 : i++, grp_goal--)
711 : : ;
712 : : }
713 : : }
714 : : start = grp_goal;
715 : :
716 [ # # ]: 0 : if (ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group), grp_goal,
717 : : bitmap_bh->b_data)) {
718 : : /*
719 : : * The block was allocated by another thread, or it was
720 : : * allocated and then freed by another thread
721 : : */
722 : 0 : start++;
723 : : grp_goal++;
724 [ # # ]: 0 : if (start >= end)
725 : : goto fail_access;
726 : : goto repeat;
727 : : }
728 : : num++;
729 : 0 : grp_goal++;
730 [ # # ][ # # ]: 0 : while (num < *count && grp_goal < end
731 [ # # ]: 0 : && !ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group),
732 : : grp_goal, bitmap_bh->b_data)) {
733 : 0 : num++;
734 : 0 : grp_goal++;
735 : : }
736 : 0 : *count = num;
737 : 0 : return grp_goal - num;
738 : : fail_access:
739 : 0 : *count = num;
740 : 0 : return -1;
741 : : }
742 : :
743 : : /**
744 : : * find_next_reservable_window():
745 : : * find a reservable space within the given range.
746 : : * It does not allocate the reservation window for now:
747 : : * alloc_new_reservation() will do the work later.
748 : : *
749 : : * @search_head: the head of the searching list;
750 : : * This is not necessarily the list head of the whole filesystem
751 : : *
752 : : * We have both head and start_block to assist the search
753 : : * for the reservable space. The list starts from head,
754 : : * but we will shift to the place where start_block is,
755 : : * then start from there, when looking for a reservable space.
756 : : *
757 : : * @size: the target new reservation window size
758 : : *
759 : : * @group_first_block: the first block we consider to start
760 : : * the real search from
761 : : *
762 : : * @last_block:
763 : : * the maximum block number that our goal reservable space
764 : : * could start from. This is normally the last block in this
765 : : * group. The search will end when we found the start of next
766 : : * possible reservable space is out of this boundary.
767 : : * This could handle the cross boundary reservation window
768 : : * request.
769 : : *
770 : : * basically we search from the given range, rather than the whole
771 : : * reservation double linked list, (start_block, last_block)
772 : : * to find a free region that is of my size and has not
773 : : * been reserved.
774 : : *
775 : : */
776 : 0 : static int find_next_reservable_window(
777 : : struct ext2_reserve_window_node *search_head,
778 : : struct ext2_reserve_window_node *my_rsv,
779 : : struct super_block * sb,
780 : : ext2_fsblk_t start_block,
781 : : ext2_fsblk_t last_block)
782 : : {
783 : : struct rb_node *next;
784 : : struct ext2_reserve_window_node *rsv, *prev;
785 : : ext2_fsblk_t cur;
786 : 0 : int size = my_rsv->rsv_goal_size;
787 : :
788 : : /* TODO: make the start of the reservation window byte-aligned */
789 : : /* cur = *start_block & ~7;*/
790 : : cur = start_block;
791 : : rsv = search_head;
792 [ # # ]: 0 : if (!rsv)
793 : : return -1;
794 : :
795 : : while (1) {
796 [ # # ]: 0 : if (cur <= rsv->rsv_end)
797 : 0 : cur = rsv->rsv_end + 1;
798 : :
799 : : /* TODO?
800 : : * in the case we could not find a reservable space
801 : : * that is what is expected, during the re-search, we could
802 : : * remember what's the largest reservable space we could have
803 : : * and return that one.
804 : : *
805 : : * For now it will fail if we could not find the reservable
806 : : * space with expected-size (or more)...
807 : : */
808 [ # # ]: 0 : if (cur > last_block)
809 : : return -1; /* fail */
810 : :
811 : : prev = rsv;
812 : 0 : next = rb_next(&rsv->rsv_node);
813 : : rsv = rb_entry(next,struct ext2_reserve_window_node,rsv_node);
814 : :
815 : : /*
816 : : * Reached the last reservation, we can just append to the
817 : : * previous one.
818 : : */
819 [ # # ]: 0 : if (!next)
820 : : break;
821 : :
822 [ # # ]: 0 : if (cur + size <= rsv->rsv_start) {
823 : : /*
824 : : * Found a reserveable space big enough. We could
825 : : * have a reservation across the group boundary here
826 : : */
827 : : break;
828 : : }
829 : : }
830 : : /*
831 : : * we come here either :
832 : : * when we reach the end of the whole list,
833 : : * and there is empty reservable space after last entry in the list.
834 : : * append it to the end of the list.
835 : : *
836 : : * or we found one reservable space in the middle of the list,
837 : : * return the reservation window that we could append to.
838 : : * succeed.
839 : : */
840 : :
841 [ # # ][ # # ]: 0 : if ((prev != my_rsv) && (!rsv_is_empty(&my_rsv->rsv_window)))
842 : : rsv_window_remove(sb, my_rsv);
843 : :
844 : : /*
845 : : * Let's book the whole available window for now. We will check the
846 : : * disk bitmap later and then, if there are free blocks then we adjust
847 : : * the window size if it's larger than requested.
848 : : * Otherwise, we will remove this node from the tree next time
849 : : * call find_next_reservable_window.
850 : : */
851 : 0 : my_rsv->rsv_start = cur;
852 : 0 : my_rsv->rsv_end = cur + size - 1;
853 : 0 : my_rsv->rsv_alloc_hit = 0;
854 : :
855 [ # # ]: 0 : if (prev != my_rsv)
856 : 0 : ext2_rsv_window_add(sb, my_rsv);
857 : :
858 : : return 0;
859 : : }
860 : :
861 : : /**
862 : : * alloc_new_reservation()--allocate a new reservation window
863 : : *
864 : : * To make a new reservation, we search part of the filesystem
865 : : * reservation list (the list that inside the group). We try to
866 : : * allocate a new reservation window near the allocation goal,
867 : : * or the beginning of the group, if there is no goal.
868 : : *
869 : : * We first find a reservable space after the goal, then from
870 : : * there, we check the bitmap for the first free block after
871 : : * it. If there is no free block until the end of group, then the
872 : : * whole group is full, we failed. Otherwise, check if the free
873 : : * block is inside the expected reservable space, if so, we
874 : : * succeed.
875 : : * If the first free block is outside the reservable space, then
876 : : * start from the first free block, we search for next available
877 : : * space, and go on.
878 : : *
879 : : * on succeed, a new reservation will be found and inserted into the list
880 : : * It contains at least one free block, and it does not overlap with other
881 : : * reservation windows.
882 : : *
883 : : * failed: we failed to find a reservation window in this group
884 : : *
885 : : * @rsv: the reservation
886 : : *
887 : : * @grp_goal: The goal (group-relative). It is where the search for a
888 : : * free reservable space should start from.
889 : : * if we have a goal(goal >0 ), then start from there,
890 : : * no goal(goal = -1), we start from the first block
891 : : * of the group.
892 : : *
893 : : * @sb: the super block
894 : : * @group: the group we are trying to allocate in
895 : : * @bitmap_bh: the block group block bitmap
896 : : *
897 : : */
898 : 0 : static int alloc_new_reservation(struct ext2_reserve_window_node *my_rsv,
899 : 0 : ext2_grpblk_t grp_goal, struct super_block *sb,
900 : 0 : unsigned int group, struct buffer_head *bitmap_bh)
901 : : {
902 : : struct ext2_reserve_window_node *search_head;
903 : : ext2_fsblk_t group_first_block, group_end_block, start_block;
904 : : ext2_grpblk_t first_free_block;
905 : 0 : struct rb_root *fs_rsv_root = &EXT2_SB(sb)->s_rsv_window_root;
906 : : unsigned long size;
907 : : int ret;
908 : : spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
909 : :
910 : : group_first_block = ext2_group_first_block_no(sb, group);
911 : 0 : group_end_block = group_first_block + (EXT2_BLOCKS_PER_GROUP(sb) - 1);
912 : :
913 [ # # ]: 0 : if (grp_goal < 0)
914 : : start_block = group_first_block;
915 : : else
916 : 0 : start_block = grp_goal + group_first_block;
917 : :
918 : 0 : size = my_rsv->rsv_goal_size;
919 : :
920 [ # # ]: 0 : if (!rsv_is_empty(&my_rsv->rsv_window)) {
921 : : /*
922 : : * if the old reservation is cross group boundary
923 : : * and if the goal is inside the old reservation window,
924 : : * we will come here when we just failed to allocate from
925 : : * the first part of the window. We still have another part
926 : : * that belongs to the next group. In this case, there is no
927 : : * point to discard our window and try to allocate a new one
928 : : * in this group(which will fail). we should
929 : : * keep the reservation window, just simply move on.
930 : : *
931 : : * Maybe we could shift the start block of the reservation
932 : : * window to the first block of next group.
933 : : */
934 : :
935 [ # # ][ # # ]: 0 : if ((my_rsv->rsv_start <= group_end_block) &&
936 [ # # ]: 0 : (my_rsv->rsv_end > group_end_block) &&
937 : : (start_block >= my_rsv->rsv_start))
938 : : return -1;
939 : :
940 [ # # ]: 0 : if ((my_rsv->rsv_alloc_hit >
941 : 0 : (my_rsv->rsv_end - my_rsv->rsv_start + 1) / 2)) {
942 : : /*
943 : : * if the previously allocation hit ratio is
944 : : * greater than 1/2, then we double the size of
945 : : * the reservation window the next time,
946 : : * otherwise we keep the same size window
947 : : */
948 : 0 : size = size * 2;
949 [ # # ]: 0 : if (size > EXT2_MAX_RESERVE_BLOCKS)
950 : : size = EXT2_MAX_RESERVE_BLOCKS;
951 : 0 : my_rsv->rsv_goal_size= size;
952 : : }
953 : : }
954 : :
955 : : spin_lock(rsv_lock);
956 : : /*
957 : : * shift the search start to the window near the goal block
958 : : */
959 : 0 : search_head = search_reserve_window(fs_rsv_root, start_block);
960 : :
961 : : /*
962 : : * find_next_reservable_window() simply finds a reservable window
963 : : * inside the given range(start_block, group_end_block).
964 : : *
965 : : * To make sure the reservation window has a free bit inside it, we
966 : : * need to check the bitmap after we found a reservable window.
967 : : */
968 : : retry:
969 : 0 : ret = find_next_reservable_window(search_head, my_rsv, sb,
970 : : start_block, group_end_block);
971 : :
972 [ # # ]: 0 : if (ret == -1) {
973 [ # # ]: 0 : if (!rsv_is_empty(&my_rsv->rsv_window))
974 : : rsv_window_remove(sb, my_rsv);
975 : : spin_unlock(rsv_lock);
976 : 0 : return -1;
977 : : }
978 : :
979 : : /*
980 : : * On success, find_next_reservable_window() returns the
981 : : * reservation window where there is a reservable space after it.
982 : : * Before we reserve this reservable space, we need
983 : : * to make sure there is at least a free block inside this region.
984 : : *
985 : : * Search the first free bit on the block bitmap. Search starts from
986 : : * the start block of the reservable space we just found.
987 : : */
988 : : spin_unlock(rsv_lock);
989 : 0 : first_free_block = bitmap_search_next_usable_block(
990 : 0 : my_rsv->rsv_start - group_first_block,
991 : 0 : bitmap_bh, group_end_block - group_first_block + 1);
992 : :
993 [ # # ]: 0 : if (first_free_block < 0) {
994 : : /*
995 : : * no free block left on the bitmap, no point
996 : : * to reserve the space. return failed.
997 : : */
998 : : spin_lock(rsv_lock);
999 [ # # ]: 0 : if (!rsv_is_empty(&my_rsv->rsv_window))
1000 : : rsv_window_remove(sb, my_rsv);
1001 : : spin_unlock(rsv_lock);
1002 : 0 : return -1; /* failed */
1003 : : }
1004 : :
1005 : 0 : start_block = first_free_block + group_first_block;
1006 : : /*
1007 : : * check if the first free block is within the
1008 : : * free space we just reserved
1009 : : */
1010 [ # # ][ # # ]: 0 : if (start_block >= my_rsv->rsv_start && start_block <= my_rsv->rsv_end)
1011 : : return 0; /* success */
1012 : : /*
1013 : : * if the first free bit we found is out of the reservable space
1014 : : * continue search for next reservable space,
1015 : : * start from where the free block is,
1016 : : * we also shift the list head to where we stopped last time
1017 : : */
1018 : : search_head = my_rsv;
1019 : : spin_lock(rsv_lock);
1020 : : goto retry;
1021 : : }
1022 : :
1023 : : /**
1024 : : * try_to_extend_reservation()
1025 : : * @my_rsv: given reservation window
1026 : : * @sb: super block
1027 : : * @size: the delta to extend
1028 : : *
1029 : : * Attempt to expand the reservation window large enough to have
1030 : : * required number of free blocks
1031 : : *
1032 : : * Since ext2_try_to_allocate() will always allocate blocks within
1033 : : * the reservation window range, if the window size is too small,
1034 : : * multiple blocks allocation has to stop at the end of the reservation
1035 : : * window. To make this more efficient, given the total number of
1036 : : * blocks needed and the current size of the window, we try to
1037 : : * expand the reservation window size if necessary on a best-effort
1038 : : * basis before ext2_new_blocks() tries to allocate blocks.
1039 : : */
1040 : 0 : static void try_to_extend_reservation(struct ext2_reserve_window_node *my_rsv,
1041 : 0 : struct super_block *sb, int size)
1042 : : {
1043 : : struct ext2_reserve_window_node *next_rsv;
1044 : : struct rb_node *next;
1045 : : spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
1046 : :
1047 [ # # ]: 0 : if (!spin_trylock(rsv_lock))
1048 : 0 : return;
1049 : :
1050 : 0 : next = rb_next(&my_rsv->rsv_node);
1051 : :
1052 [ # # ]: 0 : if (!next)
1053 : 0 : my_rsv->rsv_end += size;
1054 : : else {
1055 : : next_rsv = rb_entry(next, struct ext2_reserve_window_node, rsv_node);
1056 : :
1057 [ # # ]: 0 : if ((next_rsv->rsv_start - my_rsv->rsv_end - 1) >= size)
1058 : 0 : my_rsv->rsv_end += size;
1059 : : else
1060 : 0 : my_rsv->rsv_end = next_rsv->rsv_start - 1;
1061 : : }
1062 : : spin_unlock(rsv_lock);
1063 : : }
1064 : :
1065 : : /**
1066 : : * ext2_try_to_allocate_with_rsv()
1067 : : * @sb: superblock
1068 : : * @group: given allocation block group
1069 : : * @bitmap_bh: bufferhead holds the block bitmap
1070 : : * @grp_goal: given target block within the group
1071 : : * @count: target number of blocks to allocate
1072 : : * @my_rsv: reservation window
1073 : : *
1074 : : * This is the main function used to allocate a new block and its reservation
1075 : : * window.
1076 : : *
1077 : : * Each time when a new block allocation is need, first try to allocate from
1078 : : * its own reservation. If it does not have a reservation window, instead of
1079 : : * looking for a free bit on bitmap first, then look up the reservation list to
1080 : : * see if it is inside somebody else's reservation window, we try to allocate a
1081 : : * reservation window for it starting from the goal first. Then do the block
1082 : : * allocation within the reservation window.
1083 : : *
1084 : : * This will avoid keeping on searching the reservation list again and
1085 : : * again when somebody is looking for a free block (without
1086 : : * reservation), and there are lots of free blocks, but they are all
1087 : : * being reserved.
1088 : : *
1089 : : * We use a red-black tree for the per-filesystem reservation list.
1090 : : */
1091 : : static ext2_grpblk_t
1092 : 0 : ext2_try_to_allocate_with_rsv(struct super_block *sb, unsigned int group,
1093 : : struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
1094 : : struct ext2_reserve_window_node * my_rsv,
1095 : : unsigned long *count)
1096 : : {
1097 : : ext2_fsblk_t group_first_block, group_last_block;
1098 : : ext2_grpblk_t ret = 0;
1099 : 0 : unsigned long num = *count;
1100 : :
1101 : : /*
1102 : : * we don't deal with reservation when
1103 : : * filesystem is mounted without reservation
1104 : : * or the file is not a regular file
1105 : : * or last attempt to allocate a block with reservation turned on failed
1106 : : */
1107 [ # # ]: 0 : if (my_rsv == NULL) {
1108 : 0 : return ext2_try_to_allocate(sb, group, bitmap_bh,
1109 : : grp_goal, count, NULL);
1110 : : }
1111 : : /*
1112 : : * grp_goal is a group relative block number (if there is a goal)
1113 : : * 0 <= grp_goal < EXT2_BLOCKS_PER_GROUP(sb)
1114 : : * first block is a filesystem wide block number
1115 : : * first block is the block number of the first block in this group
1116 : : */
1117 : : group_first_block = ext2_group_first_block_no(sb, group);
1118 : 0 : group_last_block = group_first_block + (EXT2_BLOCKS_PER_GROUP(sb) - 1);
1119 : :
1120 : : /*
1121 : : * Basically we will allocate a new block from inode's reservation
1122 : : * window.
1123 : : *
1124 : : * We need to allocate a new reservation window, if:
1125 : : * a) inode does not have a reservation window; or
1126 : : * b) last attempt to allocate a block from existing reservation
1127 : : * failed; or
1128 : : * c) we come here with a goal and with a reservation window
1129 : : *
1130 : : * We do not need to allocate a new reservation window if we come here
1131 : : * at the beginning with a goal and the goal is inside the window, or
1132 : : * we don't have a goal but already have a reservation window.
1133 : : * then we could go to allocate from the reservation window directly.
1134 : : */
1135 : : while (1) {
1136 [ # # ]: 0 : if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) ||
[ # # # # ]
1137 : 0 : !goal_in_my_reservation(&my_rsv->rsv_window,
1138 : : grp_goal, group, sb)) {
1139 [ # # ]: 0 : if (my_rsv->rsv_goal_size < *count)
1140 : 0 : my_rsv->rsv_goal_size = *count;
1141 : 0 : ret = alloc_new_reservation(my_rsv, grp_goal, sb,
1142 : : group, bitmap_bh);
1143 [ # # ]: 0 : if (ret < 0)
1144 : : break; /* failed */
1145 : :
1146 [ # # ]: 0 : if (!goal_in_my_reservation(&my_rsv->rsv_window,
1147 : : grp_goal, group, sb))
1148 : : grp_goal = -1;
1149 [ # # ]: 0 : } else if (grp_goal >= 0) {
1150 : 0 : int curr = my_rsv->rsv_end -
1151 : 0 : (grp_goal + group_first_block) + 1;
1152 : :
1153 [ # # ]: 0 : if (curr < *count)
1154 : 0 : try_to_extend_reservation(my_rsv, sb,
1155 : 0 : *count - curr);
1156 : : }
1157 : :
1158 [ # # ][ # # ]: 0 : if ((my_rsv->rsv_start > group_last_block) ||
1159 : 0 : (my_rsv->rsv_end < group_first_block)) {
1160 : 0 : rsv_window_dump(&EXT2_SB(sb)->s_rsv_window_root, 1);
1161 : 0 : BUG();
1162 : : }
1163 : 0 : ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal,
1164 : : &num, &my_rsv->rsv_window);
1165 [ # # ]: 0 : if (ret >= 0) {
1166 : 0 : my_rsv->rsv_alloc_hit += num;
1167 : 0 : *count = num;
1168 : 0 : break; /* succeed */
1169 : : }
1170 : 0 : num = *count;
1171 : 0 : }
1172 : 0 : return ret;
1173 : : }
1174 : :
1175 : : /**
1176 : : * ext2_has_free_blocks()
1177 : : * @sbi: in-core super block structure.
1178 : : *
1179 : : * Check if filesystem has at least 1 free block available for allocation.
1180 : : */
1181 : 0 : static int ext2_has_free_blocks(struct ext2_sb_info *sbi)
1182 : : {
1183 : : ext2_fsblk_t free_blocks, root_blocks;
1184 : :
1185 : 0 : free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
1186 : 0 : root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count);
1187 [ # # ][ # # ]: 0 : if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) &&
[ # # ]
1188 [ # # ]: 0 : !uid_eq(sbi->s_resuid, current_fsuid()) &&
1189 [ # # ]: 0 : (gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) ||
1190 : 0 : !in_group_p (sbi->s_resgid))) {
1191 : : return 0;
1192 : : }
1193 : : return 1;
1194 : : }
1195 : :
1196 : : /*
1197 : : * ext2_new_blocks() -- core block(s) allocation function
1198 : : * @inode: file inode
1199 : : * @goal: given target block(filesystem wide)
1200 : : * @count: target number of blocks to allocate
1201 : : * @errp: error code
1202 : : *
1203 : : * ext2_new_blocks uses a goal block to assist allocation. If the goal is
1204 : : * free, or there is a free block within 32 blocks of the goal, that block
1205 : : * is allocated. Otherwise a forward search is made for a free block; within
1206 : : * each block group the search first looks for an entire free byte in the block
1207 : : * bitmap, and then for any free bit if that fails.
1208 : : * This function also updates quota and i_blocks field.
1209 : : */
1210 : 0 : ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal,
1211 : : unsigned long *count, int *errp)
1212 : : {
1213 : : struct buffer_head *bitmap_bh = NULL;
1214 : : struct buffer_head *gdp_bh;
1215 : : int group_no;
1216 : : int goal_group;
1217 : : ext2_grpblk_t grp_target_blk; /* blockgroup relative goal block */
1218 : : ext2_grpblk_t grp_alloc_blk; /* blockgroup-relative allocated block*/
1219 : : ext2_fsblk_t ret_block; /* filesyetem-wide allocated block */
1220 : : int bgi; /* blockgroup iteration index */
1221 : : int performed_allocation = 0;
1222 : : ext2_grpblk_t free_blocks; /* number of free blocks in a group */
1223 : 0 : struct super_block *sb;
1224 : : struct ext2_group_desc *gdp;
1225 : : struct ext2_super_block *es;
1226 : : struct ext2_sb_info *sbi;
1227 : : struct ext2_reserve_window_node *my_rsv = NULL;
1228 : : struct ext2_block_alloc_info *block_i;
1229 : : unsigned short windowsz = 0;
1230 : : unsigned long ngroups;
1231 : 0 : unsigned long num = *count;
1232 : : int ret;
1233 : :
1234 : 0 : *errp = -ENOSPC;
1235 : 0 : sb = inode->i_sb;
1236 : :
1237 : : /*
1238 : : * Check quota for allocation of this block.
1239 : : */
1240 : 0 : ret = dquot_alloc_block(inode, num);
1241 [ # # ]: 0 : if (ret) {
1242 : 0 : *errp = ret;
1243 : 0 : return 0;
1244 : : }
1245 : :
1246 : : sbi = EXT2_SB(sb);
1247 : 0 : es = EXT2_SB(sb)->s_es;
1248 : : ext2_debug("goal=%lu.\n", goal);
1249 : : /*
1250 : : * Allocate a block from reservation only when
1251 : : * filesystem is mounted with reservation(default,-o reservation), and
1252 : : * it's a regular file, and
1253 : : * the desired window size is greater than 0 (One could use ioctl
1254 : : * command EXT2_IOC_SETRSVSZ to set the window size to 0 to turn off
1255 : : * reservation on that particular file)
1256 : : */
1257 : 0 : block_i = EXT2_I(inode)->i_block_alloc_info;
1258 [ # # ]: 0 : if (block_i) {
1259 : 0 : windowsz = block_i->rsv_window_node.rsv_goal_size;
1260 [ # # ]: 0 : if (windowsz > 0)
1261 : 0 : my_rsv = &block_i->rsv_window_node;
1262 : : }
1263 : :
1264 [ # # ]: 0 : if (!ext2_has_free_blocks(sbi)) {
1265 : 0 : *errp = -ENOSPC;
1266 : 0 : goto out;
1267 : : }
1268 : :
1269 : : /*
1270 : : * First, test whether the goal block is free.
1271 : : */
1272 [ # # ][ # # ]: 0 : if (goal < le32_to_cpu(es->s_first_data_block) ||
1273 : 0 : goal >= le32_to_cpu(es->s_blocks_count))
1274 : : goal = le32_to_cpu(es->s_first_data_block);
1275 : 0 : group_no = (goal - le32_to_cpu(es->s_first_data_block)) /
1276 : 0 : EXT2_BLOCKS_PER_GROUP(sb);
1277 : : goal_group = group_no;
1278 : : retry_alloc:
1279 : 0 : gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1280 [ # # ]: 0 : if (!gdp)
1281 : : goto io_error;
1282 : :
1283 : 0 : free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1284 : : /*
1285 : : * if there is not enough free blocks to make a new resevation
1286 : : * turn off reservation for this allocation
1287 : : */
1288 [ # # ][ # # ]: 0 : if (my_rsv && (free_blocks < windowsz)
1289 [ # # ]: 0 : && (free_blocks > 0)
1290 [ # # ]: 0 : && (rsv_is_empty(&my_rsv->rsv_window)))
1291 : : my_rsv = NULL;
1292 : :
1293 [ # # ]: 0 : if (free_blocks > 0) {
1294 : 0 : grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) %
1295 : 0 : EXT2_BLOCKS_PER_GROUP(sb));
1296 : 0 : bitmap_bh = read_block_bitmap(sb, group_no);
1297 [ # # ]: 0 : if (!bitmap_bh)
1298 : : goto io_error;
1299 : 0 : grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1300 : : bitmap_bh, grp_target_blk,
1301 : : my_rsv, &num);
1302 [ # # ]: 0 : if (grp_alloc_blk >= 0)
1303 : : goto allocated;
1304 : : }
1305 : :
1306 : 0 : ngroups = EXT2_SB(sb)->s_groups_count;
1307 : 0 : smp_rmb();
1308 : :
1309 : : /*
1310 : : * Now search the rest of the groups. We assume that
1311 : : * group_no and gdp correctly point to the last group visited.
1312 : : */
1313 [ # # ]: 0 : for (bgi = 0; bgi < ngroups; bgi++) {
1314 : 0 : group_no++;
1315 [ # # ]: 0 : if (group_no >= ngroups)
1316 : : group_no = 0;
1317 : 0 : gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1318 [ # # ]: 0 : if (!gdp)
1319 : : goto io_error;
1320 : :
1321 : 0 : free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1322 : : /*
1323 : : * skip this group (and avoid loading bitmap) if there
1324 : : * are no free blocks
1325 : : */
1326 [ # # ]: 0 : if (!free_blocks)
1327 : 0 : continue;
1328 : : /*
1329 : : * skip this group if the number of
1330 : : * free blocks is less than half of the reservation
1331 : : * window size.
1332 : : */
1333 [ # # ][ # # ]: 0 : if (my_rsv && (free_blocks <= (windowsz/2)))
1334 : 0 : continue;
1335 : :
1336 : : brelse(bitmap_bh);
1337 : 0 : bitmap_bh = read_block_bitmap(sb, group_no);
1338 [ # # ]: 0 : if (!bitmap_bh)
1339 : : goto io_error;
1340 : : /*
1341 : : * try to allocate block(s) from this group, without a goal(-1).
1342 : : */
1343 : 0 : grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1344 : : bitmap_bh, -1, my_rsv, &num);
1345 [ # # ]: 0 : if (grp_alloc_blk >= 0)
1346 : : goto allocated;
1347 : : }
1348 : : /*
1349 : : * We may end up a bogus earlier ENOSPC error due to
1350 : : * filesystem is "full" of reservations, but
1351 : : * there maybe indeed free blocks available on disk
1352 : : * In this case, we just forget about the reservations
1353 : : * just do block allocation as without reservations.
1354 : : */
1355 [ # # ]: 0 : if (my_rsv) {
1356 : : my_rsv = NULL;
1357 : : windowsz = 0;
1358 : : group_no = goal_group;
1359 : : goto retry_alloc;
1360 : : }
1361 : : /* No space left on the device */
1362 : 0 : *errp = -ENOSPC;
1363 : 0 : goto out;
1364 : :
1365 : : allocated:
1366 : :
1367 : : ext2_debug("using block group %d(%d)\n",
1368 : : group_no, gdp->bg_free_blocks_count);
1369 : :
1370 : 0 : ret_block = grp_alloc_blk + ext2_group_first_block_no(sb, group_no);
1371 : :
1372 [ # # ][ # # ]: 0 : if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) ||
[ # # ]
1373 [ # # ][ # # ]: 0 : in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) ||
1374 [ # # ]: 0 : in_range(ret_block, le32_to_cpu(gdp->bg_inode_table),
1375 [ # # ]: 0 : EXT2_SB(sb)->s_itb_per_group) ||
1376 [ # # ]: 0 : in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table),
1377 : : EXT2_SB(sb)->s_itb_per_group)) {
1378 : 0 : ext2_error(sb, "ext2_new_blocks",
1379 : : "Allocating block in system zone - "
1380 : : "blocks from "E2FSBLK", length %lu",
1381 : : ret_block, num);
1382 : : /*
1383 : : * ext2_try_to_allocate marked the blocks we allocated as in
1384 : : * use. So we may want to selectively mark some of the blocks
1385 : : * as free
1386 : : */
1387 : 0 : goto retry_alloc;
1388 : : }
1389 : :
1390 : : performed_allocation = 1;
1391 : :
1392 [ # # ]: 0 : if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) {
1393 : 0 : ext2_error(sb, "ext2_new_blocks",
1394 : : "block("E2FSBLK") >= blocks count(%d) - "
1395 : : "block_group = %d, es == %p ", ret_block,
1396 : : le32_to_cpu(es->s_blocks_count), group_no, es);
1397 : 0 : goto out;
1398 : : }
1399 : :
1400 : 0 : group_adjust_blocks(sb, group_no, gdp, gdp_bh, -num);
1401 : 0 : percpu_counter_sub(&sbi->s_freeblocks_counter, num);
1402 : :
1403 : 0 : mark_buffer_dirty(bitmap_bh);
1404 [ # # ]: 0 : if (sb->s_flags & MS_SYNCHRONOUS)
1405 : 0 : sync_dirty_buffer(bitmap_bh);
1406 : :
1407 : 0 : *errp = 0;
1408 : : brelse(bitmap_bh);
1409 [ # # ]: 0 : if (num < *count) {
1410 : 0 : dquot_free_block_nodirty(inode, *count-num);
1411 : : mark_inode_dirty(inode);
1412 : 0 : *count = num;
1413 : : }
1414 : 0 : return ret_block;
1415 : :
1416 : : io_error:
1417 : 0 : *errp = -EIO;
1418 : : out:
1419 : : /*
1420 : : * Undo the block allocation
1421 : : */
1422 [ # # ]: 0 : if (!performed_allocation) {
1423 : 0 : dquot_free_block_nodirty(inode, *count);
1424 : : mark_inode_dirty(inode);
1425 : : }
1426 : : brelse(bitmap_bh);
1427 : : return 0;
1428 : : }
1429 : :
1430 : 0 : ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp)
1431 : : {
1432 : 0 : unsigned long count = 1;
1433 : :
1434 : 0 : return ext2_new_blocks(inode, goal, &count, errp);
1435 : : }
1436 : :
1437 : : #ifdef EXT2FS_DEBUG
1438 : :
1439 : : unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars)
1440 : : {
1441 : : return numchars * BITS_PER_BYTE - memweight(map->b_data, numchars);
1442 : : }
1443 : :
1444 : : #endif /* EXT2FS_DEBUG */
1445 : :
1446 : 0 : unsigned long ext2_count_free_blocks (struct super_block * sb)
1447 : : {
1448 : : struct ext2_group_desc * desc;
1449 : : unsigned long desc_count = 0;
1450 : : int i;
1451 : : #ifdef EXT2FS_DEBUG
1452 : : unsigned long bitmap_count, x;
1453 : : struct ext2_super_block *es;
1454 : :
1455 : : es = EXT2_SB(sb)->s_es;
1456 : : desc_count = 0;
1457 : : bitmap_count = 0;
1458 : : desc = NULL;
1459 : : for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1460 : : struct buffer_head *bitmap_bh;
1461 : : desc = ext2_get_group_desc (sb, i, NULL);
1462 : : if (!desc)
1463 : : continue;
1464 : : desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1465 : : bitmap_bh = read_block_bitmap(sb, i);
1466 : : if (!bitmap_bh)
1467 : : continue;
1468 : :
1469 : : x = ext2_count_free(bitmap_bh, sb->s_blocksize);
1470 : : printk ("group %d: stored = %d, counted = %lu\n",
1471 : : i, le16_to_cpu(desc->bg_free_blocks_count), x);
1472 : : bitmap_count += x;
1473 : : brelse(bitmap_bh);
1474 : : }
1475 : : printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n",
1476 : : (long)le32_to_cpu(es->s_free_blocks_count),
1477 : : desc_count, bitmap_count);
1478 : : return bitmap_count;
1479 : : #else
1480 [ # # ]: 0 : for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1481 : 0 : desc = ext2_get_group_desc (sb, i, NULL);
1482 [ # # ]: 0 : if (!desc)
1483 : 0 : continue;
1484 : 0 : desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1485 : : }
1486 : 0 : return desc_count;
1487 : : #endif
1488 : : }
1489 : :
1490 : : static inline int test_root(int a, int b)
1491 : : {
1492 : : int num = b;
1493 : :
1494 [ # # ][ # # ]: 0 : while (a > num)
[ # # ]
1495 : 0 : num *= b;
1496 : : return num == a;
1497 : : }
1498 : :
1499 : 0 : static int ext2_group_sparse(int group)
1500 : : {
1501 [ # # ]: 0 : if (group <= 1)
1502 : : return 1;
1503 [ # # ][ # # ]: 0 : return (test_root(group, 3) || test_root(group, 5) ||
[ # # ]
1504 : : test_root(group, 7));
1505 : : }
1506 : :
1507 : : /**
1508 : : * ext2_bg_has_super - number of blocks used by the superblock in group
1509 : : * @sb: superblock for filesystem
1510 : : * @group: group number to check
1511 : : *
1512 : : * Return the number of blocks used by the superblock (primary or backup)
1513 : : * in this group. Currently this will be only 0 or 1.
1514 : : */
1515 : 0 : int ext2_bg_has_super(struct super_block *sb, int group)
1516 : : {
1517 [ # # # # ]: 0 : if (EXT2_HAS_RO_COMPAT_FEATURE(sb,EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
1518 : 0 : !ext2_group_sparse(group))
1519 : : return 0;
1520 : 0 : return 1;
1521 : : }
1522 : :
1523 : : /**
1524 : : * ext2_bg_num_gdb - number of blocks used by the group table in group
1525 : : * @sb: superblock for filesystem
1526 : : * @group: group number to check
1527 : : *
1528 : : * Return the number of blocks used by the group descriptor table
1529 : : * (primary or backup) in this group. In the future there may be a
1530 : : * different number of descriptor blocks in each group.
1531 : : */
1532 : 0 : unsigned long ext2_bg_num_gdb(struct super_block *sb, int group)
1533 : : {
1534 [ # # ]: 0 : return ext2_bg_has_super(sb, group) ? EXT2_SB(sb)->s_gdb_count : 0;
1535 : : }
1536 : :
|