16 #include <linux/slab.h>
17 #include <linux/sched.h>
19 #include <linux/capability.h>
37 #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
41 struct buffer_head ** bh)
43 unsigned long group_desc;
50 "block_group >= groups_count - "
51 "block_group = %d, groups_count = %lu",
61 "Group descriptor not loaded - "
62 "block_group = %d, group_desc = %lu, desc = %lu",
63 block_group, group_desc, offset);
76 struct buffer_head *bh)
83 group_first_block = ext2_group_first_block_no(sb, block_group);
87 offset = bitmap_blk - group_first_block;
94 offset = bitmap_blk - group_first_block;
101 offset = bitmap_blk - group_first_block;
103 offset + EXT2_SB(sb)->s_itb_per_group,
105 if (next_zero_bit >= offset + EXT2_SB(sb)->s_itb_per_group)
111 "Invalid block bitmap - "
112 "block_group = %d, block = %lu",
113 block_group, bitmap_blk);
123 static struct buffer_head *
124 read_block_bitmap(
struct super_block *sb,
unsigned int block_group)
127 struct buffer_head * bh =
NULL;
134 bh = sb_getblk(sb, bitmap_blk);
137 "Cannot read block bitmap - "
138 "block_group = %d, block_bitmap = %u",
148 "Cannot read block bitmap - "
149 "block_group = %d, block_bitmap = %u",
154 ext2_valid_block_bitmap(sb, desc, block_group, bh);
171 static void group_adjust_blocks(
struct super_block *sb,
int group_no,
176 unsigned free_blocks;
178 spin_lock(sb_bgl_lock(sbi, group_no));
181 spin_unlock(sb_bgl_lock(sbi, group_no));
220 printk(
"Block Allocation Reservation Windows Map (%s):\n", fn);
224 printk(
"reservation window 0x%p "
225 "start: %lu, end: %lu\n",
226 rsv, rsv->rsv_start, rsv->rsv_end);
227 if (rsv->rsv_start && rsv->rsv_start >= rsv->rsv_end) {
228 printk(
"Bad reservation %p (start >= end)\n",
232 if (prev && prev->rsv_end >= rsv->rsv_start) {
233 printk(
"Bad reservation %p (prev->end >= start)\n",
239 printk(
"Restarting reservation walk in verbose mode\n");
247 printk(
"Window map complete.\n");
250 #define rsv_window_dump(root, verbose) \
251 __rsv_window_dump((root), (verbose), __func__)
253 #define rsv_window_dump(root, verbose) do {} while (0)
278 group_first_block = ext2_group_first_block_no(sb, group);
282 (rsv->
_rsv_end < group_first_block))
284 if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start)
285 || (grp_goal + group_first_block > rsv->
_rsv_end)))
313 else if (goal > rsv->rsv_end)
324 if (rsv->rsv_start > goal) {
341 struct rb_root *root = &EXT2_SB(sb)->s_rsv_window_root;
354 if (start < this->rsv_start)
356 else if (start > this->
rsv_end)
364 rb_link_node(node, parent, p);
377 static void rsv_window_remove(
struct super_block *sb,
474 rsv_window_remove(inode->
i_sb, rsv);
475 spin_unlock(rsv_lock);
488 struct buffer_head *bitmap_bh =
NULL;
489 struct buffer_head * bh2;
498 unsigned freed = 0, group_freed;
501 block + count < block ||
504 "Freeing blocks not in datazone - "
505 "block = %lu, count = %lu", block, count);
509 ext2_debug (
"freeing block(s) %lu-%lu\n", block, block + count - 1);
526 bitmap_bh = read_block_bitmap(sb, block_group);
541 "Freeing blocks in system zones - "
542 "Block = %lu, count = %lu",
547 for (i = 0, group_freed = 0; i <
count; i++) {
549 bit + i, bitmap_bh->b_data)) {
551 "bit already cleared for block %lu", block + i);
561 group_adjust_blocks(sb, block_group, desc, bh2, group_freed);
562 freed += group_freed;
571 release_blocks(sb, freed);
572 dquot_free_block_nodirty(inode, freed);
591 if (next >= maxblocks)
609 find_next_usable_block(
int start,
struct buffer_head *bh,
int maxblocks)
624 if (end_goal > maxblocks)
625 end_goal = maxblocks;
636 p = ((
char *)bh->b_data) + (here >> 3);
637 r =
memscan(p, 0, ((maxblocks + 7) >> 3) - (here >> 3));
638 next = (r - ((
char *)bh->b_data)) << 3;
640 if (next < maxblocks && next >= here)
643 here = bitmap_search_next_usable_block(here, bh, maxblocks);
672 unsigned long *count,
677 unsigned long num = 0;
681 group_first_block = ext2_group_first_block_no(sb, group);
683 start = my_rsv->
_rsv_start - group_first_block;
687 end = my_rsv->
_rsv_end - group_first_block + 1;
691 if ((start <= grp_goal) && (grp_goal < end))
707 grp_goal = find_next_usable_block(start, bitmap_bh, end);
713 for (i = 0; i < 7 && grp_goal > start &&
723 bitmap_bh->b_data)) {
736 while (num < *count && grp_goal < end
738 grp_goal, bitmap_bh->b_data)) {
743 return grp_goal - num;
782 static int find_next_reservable_window(
803 cur = rsv->rsv_end + 1;
814 if (cur > last_block)
828 if (cur + size <= rsv->rsv_start) {
847 if ((prev != my_rsv) && (!rsv_is_empty(&my_rsv->
rsv_window)))
848 rsv_window_remove(sb, my_rsv);
857 my_rsv->rsv_start =
cur;
858 my_rsv->rsv_end = cur + size - 1;
906 unsigned int group,
struct buffer_head *bitmap_bh)
911 struct rb_root *fs_rsv_root = &EXT2_SB(sb)->s_rsv_window_root;
914 spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
916 group_first_block = ext2_group_first_block_no(sb, group);
920 start_block = group_first_block;
922 start_block = grp_goal + group_first_block;
941 if ((my_rsv->rsv_start <= group_end_block) &&
942 (my_rsv->rsv_end > group_end_block) &&
943 (start_block >= my_rsv->rsv_start))
947 (my_rsv->rsv_end - my_rsv->rsv_start + 1) / 2)) {
965 search_head = search_reserve_window(fs_rsv_root, start_block);
975 ret = find_next_reservable_window(search_head, my_rsv, sb,
976 start_block, group_end_block);
980 rsv_window_remove(sb, my_rsv);
981 spin_unlock(rsv_lock);
994 spin_unlock(rsv_lock);
995 first_free_block = bitmap_search_next_usable_block(
996 my_rsv->rsv_start - group_first_block,
997 bitmap_bh, group_end_block - group_first_block + 1);
999 if (first_free_block < 0) {
1004 spin_lock(rsv_lock);
1006 rsv_window_remove(sb, my_rsv);
1007 spin_unlock(rsv_lock);
1011 start_block = first_free_block + group_first_block;
1016 if (start_block >= my_rsv->rsv_start && start_block <= my_rsv->rsv_end)
1024 search_head = my_rsv;
1025 spin_lock(rsv_lock);
1051 spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
1053 if (!spin_trylock(rsv_lock))
1059 my_rsv->rsv_end +=
size;
1063 if ((next_rsv->rsv_start - my_rsv->rsv_end - 1) >= size)
1064 my_rsv->rsv_end +=
size;
1066 my_rsv->rsv_end = next_rsv->rsv_start - 1;
1068 spin_unlock(rsv_lock);
1098 ext2_try_to_allocate_with_rsv(
struct super_block *sb,
unsigned int group,
1101 unsigned long *count)
1105 unsigned long num = *
count;
1113 if (my_rsv ==
NULL) {
1114 return ext2_try_to_allocate(sb, group, bitmap_bh,
1115 grp_goal, count,
NULL);
1123 group_first_block = ext2_group_first_block_no(sb, group);
1142 if (rsv_is_empty(&my_rsv->
rsv_window) || (ret < 0) ||
1144 grp_goal, group, sb)) {
1147 ret = alloc_new_reservation(my_rsv, grp_goal, sb,
1152 if (!goal_in_my_reservation(&my_rsv->
rsv_window,
1153 grp_goal, group, sb))
1155 }
else if (grp_goal >= 0) {
1156 int curr = my_rsv->rsv_end -
1157 (grp_goal + group_first_block) + 1;
1160 try_to_extend_reservation(my_rsv, sb,
1164 if ((my_rsv->rsv_start > group_last_block) ||
1165 (my_rsv->rsv_end < group_first_block)) {
1169 ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal,
1187 static int ext2_has_free_blocks(
struct ext2_sb_info *sbi)
1217 unsigned long *count,
int *errp)
1219 struct buffer_head *bitmap_bh =
NULL;
1220 struct buffer_head *gdp_bh;
1227 int performed_allocation = 0;
1235 unsigned short windowsz = 0;
1236 unsigned long ngroups;
1237 unsigned long num = *
count;
1243 printk(
"ext2_new_blocks: nonexistent device");
1250 ret = dquot_alloc_block(inode, num);
1257 es = EXT2_SB(sb)->s_es;
1267 block_i = EXT2_I(inode)->i_block_alloc_info;
1274 if (!ext2_has_free_blocks(sbi)) {
1287 goal_group = group_no;
1298 if (my_rsv && (free_blocks < windowsz)
1299 && (free_blocks > 0)
1303 if (free_blocks > 0) {
1306 bitmap_bh = read_block_bitmap(sb, group_no);
1309 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1310 bitmap_bh, grp_target_blk,
1312 if (grp_alloc_blk >= 0)
1316 ngroups = EXT2_SB(sb)->s_groups_count;
1323 for (bgi = 0; bgi < ngroups; bgi++) {
1325 if (group_no >= ngroups)
1343 if (my_rsv && (free_blocks <= (windowsz/2)))
1347 bitmap_bh = read_block_bitmap(sb, group_no);
1353 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1354 bitmap_bh, -1, my_rsv, &num);
1355 if (grp_alloc_blk >= 0)
1368 group_no = goal_group;
1380 ret_block = grp_alloc_blk + ext2_group_first_block_no(sb, group_no);
1385 EXT2_SB(sb)->s_itb_per_group) ||
1387 EXT2_SB(sb)->s_itb_per_group)) {
1389 "Allocating block in system zone - "
1390 "blocks from "E2FSBLK", length %lu",
1400 performed_allocation = 1;
1404 "block("E2FSBLK") >= blocks count(%d) - "
1405 "block_group = %d, es == %p ", ret_block,
1410 group_adjust_blocks(sb, group_no, gdp, gdp_bh, -num);
1419 dquot_free_block_nodirty(inode, *count-num);
1420 mark_inode_dirty(inode);
1430 if (!performed_allocation) {
1431 dquot_free_block_nodirty(inode, *count);
1432 mark_inode_dirty(inode);
1440 unsigned long count = 1;
1460 unsigned long bitmap_count,
x;
1463 es = EXT2_SB(sb)->s_es;
1467 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1468 struct buffer_head *bitmap_bh;
1473 bitmap_bh = read_block_bitmap(sb, i);
1478 printk (
"group %d: stored = %d, counted = %lu\n",
1483 printk(
"ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n",
1485 desc_count, bitmap_count);
1486 return bitmap_count;
1488 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1498 static inline int test_root(
int a,
int b)
1507 static int ext2_group_sparse(
int group)
1511 return (test_root(group, 3) || test_root(group, 5) ||
1512 test_root(group, 7));
1526 !ext2_group_sparse(group))