diff options
-rw-r--r-- | fs/ext3/balloc.c | 215 | ||||
-rw-r--r-- | fs/ext3/ialloc.c | 10 | ||||
-rw-r--r-- | fs/ext3/inode.c | 2 | ||||
-rw-r--r-- | fs/ext3/resize.c | 43 | ||||
-rw-r--r-- | fs/ext3/super.c | 2 | ||||
-rw-r--r-- | fs/ext3/xattr.c | 27 | ||||
-rw-r--r-- | include/linux/ext3_fs.h | 19 | ||||
-rw-r--r-- | include/linux/ext3_fs_i.h | 8 |
8 files changed, 177 insertions, 149 deletions
diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 77927d6938f6..b1633cd28eca 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c | |||
@@ -163,10 +163,10 @@ restart: | |||
163 | #endif | 163 | #endif |
164 | 164 | ||
165 | static int | 165 | static int |
166 | goal_in_my_reservation(struct ext3_reserve_window *rsv, int goal, | 166 | goal_in_my_reservation(struct ext3_reserve_window *rsv, ext3_grpblk_t grp_goal, |
167 | unsigned int group, struct super_block * sb) | 167 | unsigned int group, struct super_block * sb) |
168 | { | 168 | { |
169 | unsigned long group_first_block, group_last_block; | 169 | ext3_fsblk_t group_first_block, group_last_block; |
170 | 170 | ||
171 | group_first_block = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + | 171 | group_first_block = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + |
172 | group * EXT3_BLOCKS_PER_GROUP(sb); | 172 | group * EXT3_BLOCKS_PER_GROUP(sb); |
@@ -175,8 +175,8 @@ goal_in_my_reservation(struct ext3_reserve_window *rsv, int goal, | |||
175 | if ((rsv->_rsv_start > group_last_block) || | 175 | if ((rsv->_rsv_start > group_last_block) || |
176 | (rsv->_rsv_end < group_first_block)) | 176 | (rsv->_rsv_end < group_first_block)) |
177 | return 0; | 177 | return 0; |
178 | if ((goal >= 0) && ((goal + group_first_block < rsv->_rsv_start) | 178 | if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start) |
179 | || (goal + group_first_block > rsv->_rsv_end))) | 179 | || (grp_goal + group_first_block > rsv->_rsv_end))) |
180 | return 0; | 180 | return 0; |
181 | return 1; | 181 | return 1; |
182 | } | 182 | } |
@@ -187,7 +187,7 @@ goal_in_my_reservation(struct ext3_reserve_window *rsv, int goal, | |||
187 | * Returns NULL if there are no windows or if all windows start after the goal. | 187 | * Returns NULL if there are no windows or if all windows start after the goal. |
188 | */ | 188 | */ |
189 | static struct ext3_reserve_window_node * | 189 | static struct ext3_reserve_window_node * |
190 | search_reserve_window(struct rb_root *root, unsigned long goal) | 190 | search_reserve_window(struct rb_root *root, ext3_fsblk_t goal) |
191 | { | 191 | { |
192 | struct rb_node *n = root->rb_node; | 192 | struct rb_node *n = root->rb_node; |
193 | struct ext3_reserve_window_node *rsv; | 193 | struct ext3_reserve_window_node *rsv; |
@@ -223,7 +223,7 @@ void ext3_rsv_window_add(struct super_block *sb, | |||
223 | { | 223 | { |
224 | struct rb_root *root = &EXT3_SB(sb)->s_rsv_window_root; | 224 | struct rb_root *root = &EXT3_SB(sb)->s_rsv_window_root; |
225 | struct rb_node *node = &rsv->rsv_node; | 225 | struct rb_node *node = &rsv->rsv_node; |
226 | unsigned int start = rsv->rsv_start; | 226 | ext3_fsblk_t start = rsv->rsv_start; |
227 | 227 | ||
228 | struct rb_node ** p = &root->rb_node; | 228 | struct rb_node ** p = &root->rb_node; |
229 | struct rb_node * parent = NULL; | 229 | struct rb_node * parent = NULL; |
@@ -310,20 +310,20 @@ void ext3_discard_reservation(struct inode *inode) | |||
310 | 310 | ||
311 | /* Free given blocks, update quota and i_blocks field */ | 311 | /* Free given blocks, update quota and i_blocks field */ |
312 | void ext3_free_blocks_sb(handle_t *handle, struct super_block *sb, | 312 | void ext3_free_blocks_sb(handle_t *handle, struct super_block *sb, |
313 | unsigned long block, unsigned long count, | 313 | ext3_fsblk_t block, unsigned long count, |
314 | int *pdquot_freed_blocks) | 314 | unsigned long *pdquot_freed_blocks) |
315 | { | 315 | { |
316 | struct buffer_head *bitmap_bh = NULL; | 316 | struct buffer_head *bitmap_bh = NULL; |
317 | struct buffer_head *gd_bh; | 317 | struct buffer_head *gd_bh; |
318 | unsigned long block_group; | 318 | unsigned long block_group; |
319 | unsigned long bit; | 319 | ext3_grpblk_t bit; |
320 | unsigned long i; | 320 | unsigned long i; |
321 | unsigned long overflow; | 321 | unsigned long overflow; |
322 | struct ext3_group_desc * desc; | 322 | struct ext3_group_desc * desc; |
323 | struct ext3_super_block * es; | 323 | struct ext3_super_block * es; |
324 | struct ext3_sb_info *sbi; | 324 | struct ext3_sb_info *sbi; |
325 | int err = 0, ret; | 325 | int err = 0, ret; |
326 | unsigned group_freed; | 326 | ext3_grpblk_t group_freed; |
327 | 327 | ||
328 | *pdquot_freed_blocks = 0; | 328 | *pdquot_freed_blocks = 0; |
329 | sbi = EXT3_SB(sb); | 329 | sbi = EXT3_SB(sb); |
@@ -333,7 +333,7 @@ void ext3_free_blocks_sb(handle_t *handle, struct super_block *sb, | |||
333 | block + count > le32_to_cpu(es->s_blocks_count)) { | 333 | block + count > le32_to_cpu(es->s_blocks_count)) { |
334 | ext3_error (sb, "ext3_free_blocks", | 334 | ext3_error (sb, "ext3_free_blocks", |
335 | "Freeing blocks not in datazone - " | 335 | "Freeing blocks not in datazone - " |
336 | "block = %lu, count = %lu", block, count); | 336 | "block = "E3FSBLK", count = %lu", block, count); |
337 | goto error_return; | 337 | goto error_return; |
338 | } | 338 | } |
339 | 339 | ||
@@ -369,7 +369,7 @@ do_more: | |||
369 | sbi->s_itb_per_group)) | 369 | sbi->s_itb_per_group)) |
370 | ext3_error (sb, "ext3_free_blocks", | 370 | ext3_error (sb, "ext3_free_blocks", |
371 | "Freeing blocks in system zones - " | 371 | "Freeing blocks in system zones - " |
372 | "Block = %lu, count = %lu", | 372 | "Block = "E3FSBLK", count = %lu", |
373 | block, count); | 373 | block, count); |
374 | 374 | ||
375 | /* | 375 | /* |
@@ -453,7 +453,8 @@ do_more: | |||
453 | bit + i, bitmap_bh->b_data)) { | 453 | bit + i, bitmap_bh->b_data)) { |
454 | jbd_unlock_bh_state(bitmap_bh); | 454 | jbd_unlock_bh_state(bitmap_bh); |
455 | ext3_error(sb, __FUNCTION__, | 455 | ext3_error(sb, __FUNCTION__, |
456 | "bit already cleared for block %lu", block + i); | 456 | "bit already cleared for block "E3FSBLK, |
457 | block + i); | ||
457 | jbd_lock_bh_state(bitmap_bh); | 458 | jbd_lock_bh_state(bitmap_bh); |
458 | BUFFER_TRACE(bitmap_bh, "bit already cleared"); | 459 | BUFFER_TRACE(bitmap_bh, "bit already cleared"); |
459 | } else { | 460 | } else { |
@@ -493,10 +494,10 @@ error_return: | |||
493 | 494 | ||
494 | /* Free given blocks, update quota and i_blocks field */ | 495 | /* Free given blocks, update quota and i_blocks field */ |
495 | void ext3_free_blocks(handle_t *handle, struct inode *inode, | 496 | void ext3_free_blocks(handle_t *handle, struct inode *inode, |
496 | unsigned long block, unsigned long count) | 497 | ext3_fsblk_t block, unsigned long count) |
497 | { | 498 | { |
498 | struct super_block * sb; | 499 | struct super_block * sb; |
499 | int dquot_freed_blocks; | 500 | unsigned long dquot_freed_blocks; |
500 | 501 | ||
501 | sb = inode->i_sb; | 502 | sb = inode->i_sb; |
502 | if (!sb) { | 503 | if (!sb) { |
@@ -525,7 +526,7 @@ void ext3_free_blocks(handle_t *handle, struct inode *inode, | |||
525 | * data-writes at some point, and disable it for metadata allocations or | 526 | * data-writes at some point, and disable it for metadata allocations or |
526 | * sync-data inodes. | 527 | * sync-data inodes. |
527 | */ | 528 | */ |
528 | static int ext3_test_allocatable(int nr, struct buffer_head *bh) | 529 | static int ext3_test_allocatable(ext3_grpblk_t nr, struct buffer_head *bh) |
529 | { | 530 | { |
530 | int ret; | 531 | int ret; |
531 | struct journal_head *jh = bh2jh(bh); | 532 | struct journal_head *jh = bh2jh(bh); |
@@ -542,11 +543,11 @@ static int ext3_test_allocatable(int nr, struct buffer_head *bh) | |||
542 | return ret; | 543 | return ret; |
543 | } | 544 | } |
544 | 545 | ||
545 | static int | 546 | static ext3_grpblk_t |
546 | bitmap_search_next_usable_block(int start, struct buffer_head *bh, | 547 | bitmap_search_next_usable_block(ext3_grpblk_t start, struct buffer_head *bh, |
547 | int maxblocks) | 548 | ext3_grpblk_t maxblocks) |
548 | { | 549 | { |
549 | int next; | 550 | ext3_grpblk_t next; |
550 | struct journal_head *jh = bh2jh(bh); | 551 | struct journal_head *jh = bh2jh(bh); |
551 | 552 | ||
552 | /* | 553 | /* |
@@ -576,10 +577,11 @@ bitmap_search_next_usable_block(int start, struct buffer_head *bh, | |||
576 | * the initial goal; then for a free byte somewhere in the bitmap; then | 577 | * the initial goal; then for a free byte somewhere in the bitmap; then |
577 | * for any free bit in the bitmap. | 578 | * for any free bit in the bitmap. |
578 | */ | 579 | */ |
579 | static int | 580 | static ext3_grpblk_t |
580 | find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) | 581 | find_next_usable_block(ext3_grpblk_t start, struct buffer_head *bh, |
582 | ext3_grpblk_t maxblocks) | ||
581 | { | 583 | { |
582 | int here, next; | 584 | ext3_grpblk_t here, next; |
583 | char *p, *r; | 585 | char *p, *r; |
584 | 586 | ||
585 | if (start > 0) { | 587 | if (start > 0) { |
@@ -591,7 +593,7 @@ find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) | |||
591 | * less than EXT3_BLOCKS_PER_GROUP. Aligning up to the | 593 | * less than EXT3_BLOCKS_PER_GROUP. Aligning up to the |
592 | * next 64-bit boundary is simple.. | 594 | * next 64-bit boundary is simple.. |
593 | */ | 595 | */ |
594 | int end_goal = (start + 63) & ~63; | 596 | ext3_grpblk_t end_goal = (start + 63) & ~63; |
595 | if (end_goal > maxblocks) | 597 | if (end_goal > maxblocks) |
596 | end_goal = maxblocks; | 598 | end_goal = maxblocks; |
597 | here = ext3_find_next_zero_bit(bh->b_data, end_goal, start); | 599 | here = ext3_find_next_zero_bit(bh->b_data, end_goal, start); |
@@ -628,7 +630,7 @@ find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) | |||
628 | * zero (failure). | 630 | * zero (failure). |
629 | */ | 631 | */ |
630 | static inline int | 632 | static inline int |
631 | claim_block(spinlock_t *lock, int block, struct buffer_head *bh) | 633 | claim_block(spinlock_t *lock, ext3_grpblk_t block, struct buffer_head *bh) |
632 | { | 634 | { |
633 | struct journal_head *jh = bh2jh(bh); | 635 | struct journal_head *jh = bh2jh(bh); |
634 | int ret; | 636 | int ret; |
@@ -651,12 +653,13 @@ claim_block(spinlock_t *lock, int block, struct buffer_head *bh) | |||
651 | * new bitmap. In that case we must release write access to the old one via | 653 | * new bitmap. In that case we must release write access to the old one via |
652 | * ext3_journal_release_buffer(), else we'll run out of credits. | 654 | * ext3_journal_release_buffer(), else we'll run out of credits. |
653 | */ | 655 | */ |
654 | static int | 656 | static ext3_grpblk_t |
655 | ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, | 657 | ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, |
656 | struct buffer_head *bitmap_bh, int goal, | 658 | struct buffer_head *bitmap_bh, ext3_grpblk_t grp_goal, |
657 | unsigned long *count, struct ext3_reserve_window *my_rsv) | 659 | unsigned long *count, struct ext3_reserve_window *my_rsv) |
658 | { | 660 | { |
659 | int group_first_block, start, end; | 661 | ext3_fsblk_t group_first_block; |
662 | ext3_grpblk_t start, end; | ||
660 | unsigned long num = 0; | 663 | unsigned long num = 0; |
661 | 664 | ||
662 | /* we do allocation within the reservation window if we have a window */ | 665 | /* we do allocation within the reservation window if we have a window */ |
@@ -673,13 +676,13 @@ ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, | |||
673 | if (end > EXT3_BLOCKS_PER_GROUP(sb)) | 676 | if (end > EXT3_BLOCKS_PER_GROUP(sb)) |
674 | /* reservation window crosses group boundary */ | 677 | /* reservation window crosses group boundary */ |
675 | end = EXT3_BLOCKS_PER_GROUP(sb); | 678 | end = EXT3_BLOCKS_PER_GROUP(sb); |
676 | if ((start <= goal) && (goal < end)) | 679 | if ((start <= grp_goal) && (grp_goal < end)) |
677 | start = goal; | 680 | start = grp_goal; |
678 | else | 681 | else |
679 | goal = -1; | 682 | grp_goal = -1; |
680 | } else { | 683 | } else { |
681 | if (goal > 0) | 684 | if (grp_goal > 0) |
682 | start = goal; | 685 | start = grp_goal; |
683 | else | 686 | else |
684 | start = 0; | 687 | start = 0; |
685 | end = EXT3_BLOCKS_PER_GROUP(sb); | 688 | end = EXT3_BLOCKS_PER_GROUP(sb); |
@@ -688,43 +691,43 @@ ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, | |||
688 | BUG_ON(start > EXT3_BLOCKS_PER_GROUP(sb)); | 691 | BUG_ON(start > EXT3_BLOCKS_PER_GROUP(sb)); |
689 | 692 | ||
690 | repeat: | 693 | repeat: |
691 | if (goal < 0 || !ext3_test_allocatable(goal, bitmap_bh)) { | 694 | if (grp_goal < 0 || !ext3_test_allocatable(grp_goal, bitmap_bh)) { |
692 | goal = find_next_usable_block(start, bitmap_bh, end); | 695 | grp_goal = find_next_usable_block(start, bitmap_bh, end); |
693 | if (goal < 0) | 696 | if (grp_goal < 0) |
694 | goto fail_access; | 697 | goto fail_access; |
695 | if (!my_rsv) { | 698 | if (!my_rsv) { |
696 | int i; | 699 | int i; |
697 | 700 | ||
698 | for (i = 0; i < 7 && goal > start && | 701 | for (i = 0; i < 7 && grp_goal > start && |
699 | ext3_test_allocatable(goal - 1, | 702 | ext3_test_allocatable(grp_goal - 1, |
700 | bitmap_bh); | 703 | bitmap_bh); |
701 | i++, goal--) | 704 | i++, grp_goal--) |
702 | ; | 705 | ; |
703 | } | 706 | } |
704 | } | 707 | } |
705 | start = goal; | 708 | start = grp_goal; |
706 | 709 | ||
707 | if (!claim_block(sb_bgl_lock(EXT3_SB(sb), group), goal, bitmap_bh)) { | 710 | if (!claim_block(sb_bgl_lock(EXT3_SB(sb), group), grp_goal, bitmap_bh)) { |
708 | /* | 711 | /* |
709 | * The block was allocated by another thread, or it was | 712 | * The block was allocated by another thread, or it was |
710 | * allocated and then freed by another thread | 713 | * allocated and then freed by another thread |
711 | */ | 714 | */ |
712 | start++; | 715 | start++; |
713 | goal++; | 716 | grp_goal++; |
714 | if (start >= end) | 717 | if (start >= end) |
715 | goto fail_access; | 718 | goto fail_access; |
716 | goto repeat; | 719 | goto repeat; |
717 | } | 720 | } |
718 | num++; | 721 | num++; |
719 | goal++; | 722 | grp_goal++; |
720 | while (num < *count && goal < end | 723 | while (num < *count && grp_goal < end |
721 | && ext3_test_allocatable(goal, bitmap_bh) | 724 | && ext3_test_allocatable(grp_goal, bitmap_bh) |
722 | && claim_block(sb_bgl_lock(EXT3_SB(sb), group), goal, bitmap_bh)) { | 725 | && claim_block(sb_bgl_lock(EXT3_SB(sb), group), grp_goal, bitmap_bh)) { |
723 | num++; | 726 | num++; |
724 | goal++; | 727 | grp_goal++; |
725 | } | 728 | } |
726 | *count = num; | 729 | *count = num; |
727 | return goal - num; | 730 | return grp_goal - num; |
728 | fail_access: | 731 | fail_access: |
729 | *count = num; | 732 | *count = num; |
730 | return -1; | 733 | return -1; |
@@ -766,12 +769,13 @@ fail_access: | |||
766 | static int find_next_reservable_window( | 769 | static int find_next_reservable_window( |
767 | struct ext3_reserve_window_node *search_head, | 770 | struct ext3_reserve_window_node *search_head, |
768 | struct ext3_reserve_window_node *my_rsv, | 771 | struct ext3_reserve_window_node *my_rsv, |
769 | struct super_block * sb, int start_block, | 772 | struct super_block * sb, |
770 | int last_block) | 773 | ext3_fsblk_t start_block, |
774 | ext3_fsblk_t last_block) | ||
771 | { | 775 | { |
772 | struct rb_node *next; | 776 | struct rb_node *next; |
773 | struct ext3_reserve_window_node *rsv, *prev; | 777 | struct ext3_reserve_window_node *rsv, *prev; |
774 | int cur; | 778 | ext3_fsblk_t cur; |
775 | int size = my_rsv->rsv_goal_size; | 779 | int size = my_rsv->rsv_goal_size; |
776 | 780 | ||
777 | /* TODO: make the start of the reservation window byte-aligned */ | 781 | /* TODO: make the start of the reservation window byte-aligned */ |
@@ -873,10 +877,10 @@ static int find_next_reservable_window( | |||
873 | * | 877 | * |
874 | * @rsv: the reservation | 878 | * @rsv: the reservation |
875 | * | 879 | * |
876 | * @goal: The goal (group-relative). It is where the search for a | 880 | * @grp_goal: The goal (group-relative). It is where the search for a |
877 | * free reservable space should start from. | 881 | * free reservable space should start from. |
878 | * if we have a goal(goal >0 ), then start from there, | 882 | * if we have a grp_goal(grp_goal >0 ), then start from there, |
879 | * no goal(goal = -1), we start from the first block | 883 | * no grp_goal(grp_goal = -1), we start from the first block |
880 | * of the group. | 884 | * of the group. |
881 | * | 885 | * |
882 | * @sb: the super block | 886 | * @sb: the super block |
@@ -885,12 +889,12 @@ static int find_next_reservable_window( | |||
885 | * | 889 | * |
886 | */ | 890 | */ |
887 | static int alloc_new_reservation(struct ext3_reserve_window_node *my_rsv, | 891 | static int alloc_new_reservation(struct ext3_reserve_window_node *my_rsv, |
888 | int goal, struct super_block *sb, | 892 | ext3_grpblk_t grp_goal, struct super_block *sb, |
889 | unsigned int group, struct buffer_head *bitmap_bh) | 893 | unsigned int group, struct buffer_head *bitmap_bh) |
890 | { | 894 | { |
891 | struct ext3_reserve_window_node *search_head; | 895 | struct ext3_reserve_window_node *search_head; |
892 | int group_first_block, group_end_block, start_block; | 896 | ext3_fsblk_t group_first_block, group_end_block, start_block; |
893 | int first_free_block; | 897 | ext3_grpblk_t first_free_block; |
894 | struct rb_root *fs_rsv_root = &EXT3_SB(sb)->s_rsv_window_root; | 898 | struct rb_root *fs_rsv_root = &EXT3_SB(sb)->s_rsv_window_root; |
895 | unsigned long size; | 899 | unsigned long size; |
896 | int ret; | 900 | int ret; |
@@ -900,10 +904,10 @@ static int alloc_new_reservation(struct ext3_reserve_window_node *my_rsv, | |||
900 | group * EXT3_BLOCKS_PER_GROUP(sb); | 904 | group * EXT3_BLOCKS_PER_GROUP(sb); |
901 | group_end_block = group_first_block + EXT3_BLOCKS_PER_GROUP(sb) - 1; | 905 | group_end_block = group_first_block + EXT3_BLOCKS_PER_GROUP(sb) - 1; |
902 | 906 | ||
903 | if (goal < 0) | 907 | if (grp_goal < 0) |
904 | start_block = group_first_block; | 908 | start_block = group_first_block; |
905 | else | 909 | else |
906 | start_block = goal + group_first_block; | 910 | start_block = grp_goal + group_first_block; |
907 | 911 | ||
908 | size = my_rsv->rsv_goal_size; | 912 | size = my_rsv->rsv_goal_size; |
909 | 913 | ||
@@ -1057,14 +1061,15 @@ static void try_to_extend_reservation(struct ext3_reserve_window_node *my_rsv, | |||
1057 | * sorted double linked list should be fast. | 1061 | * sorted double linked list should be fast. |
1058 | * | 1062 | * |
1059 | */ | 1063 | */ |
1060 | static int | 1064 | static ext3_grpblk_t |
1061 | ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, | 1065 | ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, |
1062 | unsigned int group, struct buffer_head *bitmap_bh, | 1066 | unsigned int group, struct buffer_head *bitmap_bh, |
1063 | int goal, struct ext3_reserve_window_node * my_rsv, | 1067 | ext3_grpblk_t grp_goal, |
1068 | struct ext3_reserve_window_node * my_rsv, | ||
1064 | unsigned long *count, int *errp) | 1069 | unsigned long *count, int *errp) |
1065 | { | 1070 | { |
1066 | unsigned long group_first_block; | 1071 | ext3_fsblk_t group_first_block; |
1067 | int ret = 0; | 1072 | ext3_grpblk_t ret = 0; |
1068 | int fatal; | 1073 | int fatal; |
1069 | unsigned long num = *count; | 1074 | unsigned long num = *count; |
1070 | 1075 | ||
@@ -1090,12 +1095,12 @@ ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, | |||
1090 | */ | 1095 | */ |
1091 | if (my_rsv == NULL ) { | 1096 | if (my_rsv == NULL ) { |
1092 | ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, | 1097 | ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, |
1093 | goal, count, NULL); | 1098 | grp_goal, count, NULL); |
1094 | goto out; | 1099 | goto out; |
1095 | } | 1100 | } |
1096 | /* | 1101 | /* |
1097 | * goal is a group relative block number (if there is a goal) | 1102 | * grp_goal is a group relative block number (if there is a goal) |
1098 | * 0 < goal < EXT3_BLOCKS_PER_GROUP(sb) | 1103 | * 0 < grp_goal < EXT3_BLOCKS_PER_GROUP(sb) |
1099 | * first block is a filesystem wide block number | 1104 | * first block is a filesystem wide block number |
1100 | * first block is the block number of the first block in this group | 1105 | * first block is the block number of the first block in this group |
1101 | */ | 1106 | */ |
@@ -1119,24 +1124,24 @@ ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, | |||
1119 | */ | 1124 | */ |
1120 | while (1) { | 1125 | while (1) { |
1121 | if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) || | 1126 | if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) || |
1122 | !goal_in_my_reservation(&my_rsv->rsv_window, goal, group, sb)) { | 1127 | !goal_in_my_reservation(&my_rsv->rsv_window, grp_goal, group, sb)) { |
1123 | if (my_rsv->rsv_goal_size < *count) | 1128 | if (my_rsv->rsv_goal_size < *count) |
1124 | my_rsv->rsv_goal_size = *count; | 1129 | my_rsv->rsv_goal_size = *count; |
1125 | ret = alloc_new_reservation(my_rsv, goal, sb, | 1130 | ret = alloc_new_reservation(my_rsv, grp_goal, sb, |
1126 | group, bitmap_bh); | 1131 | group, bitmap_bh); |
1127 | if (ret < 0) | 1132 | if (ret < 0) |
1128 | break; /* failed */ | 1133 | break; /* failed */ |
1129 | 1134 | ||
1130 | if (!goal_in_my_reservation(&my_rsv->rsv_window, goal, group, sb)) | 1135 | if (!goal_in_my_reservation(&my_rsv->rsv_window, grp_goal, group, sb)) |
1131 | goal = -1; | 1136 | grp_goal = -1; |
1132 | } else if (goal > 0 && (my_rsv->rsv_end-goal+1) < *count) | 1137 | } else if (grp_goal > 0 && (my_rsv->rsv_end-grp_goal+1) < *count) |
1133 | try_to_extend_reservation(my_rsv, sb, | 1138 | try_to_extend_reservation(my_rsv, sb, |
1134 | *count-my_rsv->rsv_end + goal - 1); | 1139 | *count-my_rsv->rsv_end + grp_goal - 1); |
1135 | 1140 | ||
1136 | if ((my_rsv->rsv_start >= group_first_block + EXT3_BLOCKS_PER_GROUP(sb)) | 1141 | if ((my_rsv->rsv_start >= group_first_block + EXT3_BLOCKS_PER_GROUP(sb)) |
1137 | || (my_rsv->rsv_end < group_first_block)) | 1142 | || (my_rsv->rsv_end < group_first_block)) |
1138 | BUG(); | 1143 | BUG(); |
1139 | ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, goal, | 1144 | ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, grp_goal, |
1140 | &num, &my_rsv->rsv_window); | 1145 | &num, &my_rsv->rsv_window); |
1141 | if (ret >= 0) { | 1146 | if (ret >= 0) { |
1142 | my_rsv->rsv_alloc_hit += num; | 1147 | my_rsv->rsv_alloc_hit += num; |
@@ -1164,7 +1169,7 @@ out: | |||
1164 | 1169 | ||
1165 | static int ext3_has_free_blocks(struct ext3_sb_info *sbi) | 1170 | static int ext3_has_free_blocks(struct ext3_sb_info *sbi) |
1166 | { | 1171 | { |
1167 | int free_blocks, root_blocks; | 1172 | ext3_fsblk_t free_blocks, root_blocks; |
1168 | 1173 | ||
1169 | free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); | 1174 | free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); |
1170 | root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); | 1175 | root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); |
@@ -1200,19 +1205,20 @@ int ext3_should_retry_alloc(struct super_block *sb, int *retries) | |||
1200 | * bitmap, and then for any free bit if that fails. | 1205 | * bitmap, and then for any free bit if that fails. |
1201 | * This function also updates quota and i_blocks field. | 1206 | * This function also updates quota and i_blocks field. |
1202 | */ | 1207 | */ |
1203 | int ext3_new_blocks(handle_t *handle, struct inode *inode, | 1208 | ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode, |
1204 | unsigned long goal, unsigned long *count, int *errp) | 1209 | ext3_fsblk_t goal, unsigned long *count, int *errp) |
1205 | { | 1210 | { |
1206 | struct buffer_head *bitmap_bh = NULL; | 1211 | struct buffer_head *bitmap_bh = NULL; |
1207 | struct buffer_head *gdp_bh; | 1212 | struct buffer_head *gdp_bh; |
1208 | int group_no; | 1213 | int group_no; |
1209 | int goal_group; | 1214 | int goal_group; |
1210 | int ret_block; | 1215 | ext3_grpblk_t grp_target_blk; /* blockgroup relative goal block */ |
1216 | ext3_grpblk_t grp_alloc_blk; /* blockgroup-relative allocated block*/ | ||
1217 | ext3_fsblk_t ret_block; /* filesyetem-wide allocated block */ | ||
1211 | int bgi; /* blockgroup iteration index */ | 1218 | int bgi; /* blockgroup iteration index */ |
1212 | int target_block; | ||
1213 | int fatal = 0, err; | 1219 | int fatal = 0, err; |
1214 | int performed_allocation = 0; | 1220 | int performed_allocation = 0; |
1215 | int free_blocks; | 1221 | ext3_grpblk_t free_blocks; /* number of free blocks in a group */ |
1216 | struct super_block *sb; | 1222 | struct super_block *sb; |
1217 | struct ext3_group_desc *gdp; | 1223 | struct ext3_group_desc *gdp; |
1218 | struct ext3_super_block *es; | 1224 | struct ext3_super_block *es; |
@@ -1285,16 +1291,17 @@ retry: | |||
1285 | my_rsv = NULL; | 1291 | my_rsv = NULL; |
1286 | 1292 | ||
1287 | if (free_blocks > 0) { | 1293 | if (free_blocks > 0) { |
1288 | ret_block = ((goal - le32_to_cpu(es->s_first_data_block)) % | 1294 | grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) % |
1289 | EXT3_BLOCKS_PER_GROUP(sb)); | 1295 | EXT3_BLOCKS_PER_GROUP(sb)); |
1290 | bitmap_bh = read_block_bitmap(sb, group_no); | 1296 | bitmap_bh = read_block_bitmap(sb, group_no); |
1291 | if (!bitmap_bh) | 1297 | if (!bitmap_bh) |
1292 | goto io_error; | 1298 | goto io_error; |
1293 | ret_block = ext3_try_to_allocate_with_rsv(sb, handle, group_no, | 1299 | grp_alloc_blk = ext3_try_to_allocate_with_rsv(sb, handle, |
1294 | bitmap_bh, ret_block, my_rsv, &num, &fatal); | 1300 | group_no, bitmap_bh, grp_target_blk, |
1301 | my_rsv, &num, &fatal); | ||
1295 | if (fatal) | 1302 | if (fatal) |
1296 | goto out; | 1303 | goto out; |
1297 | if (ret_block >= 0) | 1304 | if (grp_alloc_blk >= 0) |
1298 | goto allocated; | 1305 | goto allocated; |
1299 | } | 1306 | } |
1300 | 1307 | ||
@@ -1327,11 +1334,15 @@ retry: | |||
1327 | bitmap_bh = read_block_bitmap(sb, group_no); | 1334 | bitmap_bh = read_block_bitmap(sb, group_no); |
1328 | if (!bitmap_bh) | 1335 | if (!bitmap_bh) |
1329 | goto io_error; | 1336 | goto io_error; |
1330 | ret_block = ext3_try_to_allocate_with_rsv(sb, handle, group_no, | 1337 | /* |
1331 | bitmap_bh, -1, my_rsv, &num, &fatal); | 1338 | * try to allocate block(s) from this group, without a goal(-1). |
1339 | */ | ||
1340 | grp_alloc_blk = ext3_try_to_allocate_with_rsv(sb, handle, | ||
1341 | group_no, bitmap_bh, -1, my_rsv, | ||
1342 | &num, &fatal); | ||
1332 | if (fatal) | 1343 | if (fatal) |
1333 | goto out; | 1344 | goto out; |
1334 | if (ret_block >= 0) | 1345 | if (grp_alloc_blk >= 0) |
1335 | goto allocated; | 1346 | goto allocated; |
1336 | } | 1347 | } |
1337 | /* | 1348 | /* |
@@ -1360,18 +1371,19 @@ allocated: | |||
1360 | if (fatal) | 1371 | if (fatal) |
1361 | goto out; | 1372 | goto out; |
1362 | 1373 | ||
1363 | target_block = ret_block + group_no * EXT3_BLOCKS_PER_GROUP(sb) | 1374 | ret_block = grp_alloc_blk + group_no * EXT3_BLOCKS_PER_GROUP(sb) |
1364 | + le32_to_cpu(es->s_first_data_block); | 1375 | + le32_to_cpu(es->s_first_data_block); |
1365 | 1376 | ||
1366 | if (in_range(le32_to_cpu(gdp->bg_block_bitmap), target_block, num) || | 1377 | if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) || |
1367 | in_range(le32_to_cpu(gdp->bg_inode_bitmap), target_block, num) || | 1378 | in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) || |
1368 | in_range(target_block, le32_to_cpu(gdp->bg_inode_table), | 1379 | in_range(ret_block, le32_to_cpu(gdp->bg_inode_table), |
1369 | EXT3_SB(sb)->s_itb_per_group) || | 1380 | EXT3_SB(sb)->s_itb_per_group) || |
1370 | in_range(target_block + num - 1, le32_to_cpu(gdp->bg_inode_table), | 1381 | in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table), |
1371 | EXT3_SB(sb)->s_itb_per_group)) | 1382 | EXT3_SB(sb)->s_itb_per_group)) |
1372 | ext3_error(sb, "ext3_new_block", | 1383 | ext3_error(sb, "ext3_new_block", |
1373 | "Allocating block in system zone - " | 1384 | "Allocating block in system zone - " |
1374 | "blocks from %u, length %lu", target_block, num); | 1385 | "blocks from "E3FSBLK", length %lu", |
1386 | ret_block, num); | ||
1375 | 1387 | ||
1376 | performed_allocation = 1; | 1388 | performed_allocation = 1; |
1377 | 1389 | ||
@@ -1380,7 +1392,7 @@ allocated: | |||
1380 | struct buffer_head *debug_bh; | 1392 | struct buffer_head *debug_bh; |
1381 | 1393 | ||
1382 | /* Record bitmap buffer state in the newly allocated block */ | 1394 | /* Record bitmap buffer state in the newly allocated block */ |
1383 | debug_bh = sb_find_get_block(sb, target_block); | 1395 | debug_bh = sb_find_get_block(sb, ret_block); |
1384 | if (debug_bh) { | 1396 | if (debug_bh) { |
1385 | BUFFER_TRACE(debug_bh, "state when allocated"); | 1397 | BUFFER_TRACE(debug_bh, "state when allocated"); |
1386 | BUFFER_TRACE2(debug_bh, bitmap_bh, "bitmap state"); | 1398 | BUFFER_TRACE2(debug_bh, bitmap_bh, "bitmap state"); |
@@ -1393,24 +1405,21 @@ allocated: | |||
1393 | int i; | 1405 | int i; |
1394 | 1406 | ||
1395 | for (i = 0; i < num; i++) { | 1407 | for (i = 0; i < num; i++) { |
1396 | if (ext3_test_bit(ret_block, | 1408 | if (ext3_test_bit(grp_alloc_blk+i, |
1397 | bh2jh(bitmap_bh)->b_committed_data)) { | 1409 | bh2jh(bitmap_bh)->b_committed_data)) { |
1398 | printk("%s: block was unexpectedly set in " | 1410 | printk("%s: block was unexpectedly set in " |
1399 | "b_committed_data\n", __FUNCTION__); | 1411 | "b_committed_data\n", __FUNCTION__); |
1400 | } | 1412 | } |
1401 | } | 1413 | } |
1402 | } | 1414 | } |
1403 | ext3_debug("found bit %d\n", ret_block); | 1415 | ext3_debug("found bit %d\n", grp_alloc_blk); |
1404 | spin_unlock(sb_bgl_lock(sbi, group_no)); | 1416 | spin_unlock(sb_bgl_lock(sbi, group_no)); |
1405 | jbd_unlock_bh_state(bitmap_bh); | 1417 | jbd_unlock_bh_state(bitmap_bh); |
1406 | #endif | 1418 | #endif |
1407 | 1419 | ||
1408 | /* ret_block was blockgroup-relative. Now it becomes fs-relative */ | ||
1409 | ret_block = target_block; | ||
1410 | |||
1411 | if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) { | 1420 | if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) { |
1412 | ext3_error(sb, "ext3_new_block", | 1421 | ext3_error(sb, "ext3_new_block", |
1413 | "block(%d) >= blocks count(%d) - " | 1422 | "block("E3FSBLK") >= blocks count(%d) - " |
1414 | "block_group = %d, es == %p ", ret_block, | 1423 | "block_group = %d, es == %p ", ret_block, |
1415 | le32_to_cpu(es->s_blocks_count), group_no, es); | 1424 | le32_to_cpu(es->s_blocks_count), group_no, es); |
1416 | goto out; | 1425 | goto out; |
@@ -1421,7 +1430,7 @@ allocated: | |||
1421 | * list of some description. We don't know in advance whether | 1430 | * list of some description. We don't know in advance whether |
1422 | * the caller wants to use it as metadata or data. | 1431 | * the caller wants to use it as metadata or data. |
1423 | */ | 1432 | */ |
1424 | ext3_debug("allocating block %d. Goal hits %d of %d.\n", | 1433 | ext3_debug("allocating block %lu. Goal hits %d of %d.\n", |
1425 | ret_block, goal_hits, goal_attempts); | 1434 | ret_block, goal_hits, goal_attempts); |
1426 | 1435 | ||
1427 | spin_lock(sb_bgl_lock(sbi, group_no)); | 1436 | spin_lock(sb_bgl_lock(sbi, group_no)); |
@@ -1461,8 +1470,8 @@ out: | |||
1461 | return 0; | 1470 | return 0; |
1462 | } | 1471 | } |
1463 | 1472 | ||
1464 | int ext3_new_block(handle_t *handle, struct inode *inode, | 1473 | ext3_fsblk_t ext3_new_block(handle_t *handle, struct inode *inode, |
1465 | unsigned long goal, int *errp) | 1474 | ext3_fsblk_t goal, int *errp) |
1466 | { | 1475 | { |
1467 | unsigned long count = 1; | 1476 | unsigned long count = 1; |
1468 | 1477 | ||
@@ -1520,7 +1529,7 @@ unsigned long ext3_count_free_blocks(struct super_block *sb) | |||
1520 | } | 1529 | } |
1521 | 1530 | ||
1522 | static inline int | 1531 | static inline int |
1523 | block_in_use(unsigned long block, struct super_block *sb, unsigned char *map) | 1532 | block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map) |
1524 | { | 1533 | { |
1525 | return ext3_test_bit ((block - | 1534 | return ext3_test_bit ((block - |
1526 | le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) % | 1535 | le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) % |
diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index dc826464f313..36546ed36a14 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c | |||
@@ -262,9 +262,11 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent) | |||
262 | int ngroups = sbi->s_groups_count; | 262 | int ngroups = sbi->s_groups_count; |
263 | int inodes_per_group = EXT3_INODES_PER_GROUP(sb); | 263 | int inodes_per_group = EXT3_INODES_PER_GROUP(sb); |
264 | int freei, avefreei; | 264 | int freei, avefreei; |
265 | int freeb, avefreeb; | 265 | ext3_fsblk_t freeb, avefreeb; |
266 | int blocks_per_dir, ndirs; | 266 | ext3_fsblk_t blocks_per_dir; |
267 | int max_debt, max_dirs, min_blocks, min_inodes; | 267 | int ndirs; |
268 | int max_debt, max_dirs, min_inodes; | ||
269 | ext3_grpblk_t min_blocks; | ||
268 | int group = -1, i; | 270 | int group = -1, i; |
269 | struct ext3_group_desc *desc; | 271 | struct ext3_group_desc *desc; |
270 | struct buffer_head *bh; | 272 | struct buffer_head *bh; |
@@ -307,7 +309,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent) | |||
307 | min_inodes = avefreei - inodes_per_group / 4; | 309 | min_inodes = avefreei - inodes_per_group / 4; |
308 | min_blocks = avefreeb - EXT3_BLOCKS_PER_GROUP(sb) / 4; | 310 | min_blocks = avefreeb - EXT3_BLOCKS_PER_GROUP(sb) / 4; |
309 | 311 | ||
310 | max_debt = EXT3_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, BLOCK_COST); | 312 | max_debt = EXT3_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, (ext3_fsblk_t)BLOCK_COST); |
311 | if (max_debt * INODE_COST > inodes_per_group) | 313 | if (max_debt * INODE_COST > inodes_per_group) |
312 | max_debt = inodes_per_group / INODE_COST; | 314 | max_debt = inodes_per_group / INODE_COST; |
313 | if (max_debt > 255) | 315 | if (max_debt > 255) |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 2edd7eec88fd..b02bc32c57a4 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -62,7 +62,7 @@ static int ext3_inode_is_fast_symlink(struct inode *inode) | |||
62 | * still needs to be revoked. | 62 | * still needs to be revoked. |
63 | */ | 63 | */ |
64 | int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, | 64 | int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, |
65 | struct buffer_head *bh, int blocknr) | 65 | struct buffer_head *bh, ext3_fsblk_t blocknr) |
66 | { | 66 | { |
67 | int err; | 67 | int err; |
68 | 68 | ||
diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c index a31dff81ed77..82c678e92682 100644 --- a/fs/ext3/resize.c +++ b/fs/ext3/resize.c | |||
@@ -28,16 +28,16 @@ static int verify_group_input(struct super_block *sb, | |||
28 | { | 28 | { |
29 | struct ext3_sb_info *sbi = EXT3_SB(sb); | 29 | struct ext3_sb_info *sbi = EXT3_SB(sb); |
30 | struct ext3_super_block *es = sbi->s_es; | 30 | struct ext3_super_block *es = sbi->s_es; |
31 | unsigned start = le32_to_cpu(es->s_blocks_count); | 31 | ext3_fsblk_t start = le32_to_cpu(es->s_blocks_count); |
32 | unsigned end = start + input->blocks_count; | 32 | ext3_fsblk_t end = start + input->blocks_count; |
33 | unsigned group = input->group; | 33 | unsigned group = input->group; |
34 | unsigned itend = input->inode_table + sbi->s_itb_per_group; | 34 | ext3_fsblk_t itend = input->inode_table + sbi->s_itb_per_group; |
35 | unsigned overhead = ext3_bg_has_super(sb, group) ? | 35 | unsigned overhead = ext3_bg_has_super(sb, group) ? |
36 | (1 + ext3_bg_num_gdb(sb, group) + | 36 | (1 + ext3_bg_num_gdb(sb, group) + |
37 | le16_to_cpu(es->s_reserved_gdt_blocks)) : 0; | 37 | le16_to_cpu(es->s_reserved_gdt_blocks)) : 0; |
38 | unsigned metaend = start + overhead; | 38 | ext3_fsblk_t metaend = start + overhead; |
39 | struct buffer_head *bh = NULL; | 39 | struct buffer_head *bh = NULL; |
40 | int free_blocks_count; | 40 | ext3_grpblk_t free_blocks_count; |
41 | int err = -EINVAL; | 41 | int err = -EINVAL; |
42 | 42 | ||
43 | input->free_blocks_count = free_blocks_count = | 43 | input->free_blocks_count = free_blocks_count = |
@@ -64,7 +64,8 @@ static int verify_group_input(struct super_block *sb, | |||
64 | ext3_warning(sb, __FUNCTION__, "Bad blocks count %u", | 64 | ext3_warning(sb, __FUNCTION__, "Bad blocks count %u", |
65 | input->blocks_count); | 65 | input->blocks_count); |
66 | else if (!(bh = sb_bread(sb, end - 1))) | 66 | else if (!(bh = sb_bread(sb, end - 1))) |
67 | ext3_warning(sb, __FUNCTION__, "Cannot read last block (%u)", | 67 | ext3_warning(sb, __FUNCTION__, |
68 | "Cannot read last block ("E3FSBLK")", | ||
68 | end - 1); | 69 | end - 1); |
69 | else if (outside(input->block_bitmap, start, end)) | 70 | else if (outside(input->block_bitmap, start, end)) |
70 | ext3_warning(sb, __FUNCTION__, | 71 | ext3_warning(sb, __FUNCTION__, |
@@ -77,7 +78,7 @@ static int verify_group_input(struct super_block *sb, | |||
77 | else if (outside(input->inode_table, start, end) || | 78 | else if (outside(input->inode_table, start, end) || |
78 | outside(itend - 1, start, end)) | 79 | outside(itend - 1, start, end)) |
79 | ext3_warning(sb, __FUNCTION__, | 80 | ext3_warning(sb, __FUNCTION__, |
80 | "Inode table not in group (blocks %u-%u)", | 81 | "Inode table not in group (blocks %u-"E3FSBLK")", |
81 | input->inode_table, itend - 1); | 82 | input->inode_table, itend - 1); |
82 | else if (input->inode_bitmap == input->block_bitmap) | 83 | else if (input->inode_bitmap == input->block_bitmap) |
83 | ext3_warning(sb, __FUNCTION__, | 84 | ext3_warning(sb, __FUNCTION__, |
@@ -85,24 +86,27 @@ static int verify_group_input(struct super_block *sb, | |||
85 | input->block_bitmap); | 86 | input->block_bitmap); |
86 | else if (inside(input->block_bitmap, input->inode_table, itend)) | 87 | else if (inside(input->block_bitmap, input->inode_table, itend)) |
87 | ext3_warning(sb, __FUNCTION__, | 88 | ext3_warning(sb, __FUNCTION__, |
88 | "Block bitmap (%u) in inode table (%u-%u)", | 89 | "Block bitmap (%u) in inode table (%u-"E3FSBLK")", |
89 | input->block_bitmap, input->inode_table, itend-1); | 90 | input->block_bitmap, input->inode_table, itend-1); |
90 | else if (inside(input->inode_bitmap, input->inode_table, itend)) | 91 | else if (inside(input->inode_bitmap, input->inode_table, itend)) |
91 | ext3_warning(sb, __FUNCTION__, | 92 | ext3_warning(sb, __FUNCTION__, |
92 | "Inode bitmap (%u) in inode table (%u-%u)", | 93 | "Inode bitmap (%u) in inode table (%u-"E3FSBLK")", |
93 | input->inode_bitmap, input->inode_table, itend-1); | 94 | input->inode_bitmap, input->inode_table, itend-1); |
94 | else if (inside(input->block_bitmap, start, metaend)) | 95 | else if (inside(input->block_bitmap, start, metaend)) |
95 | ext3_warning(sb, __FUNCTION__, | 96 | ext3_warning(sb, __FUNCTION__, |
96 | "Block bitmap (%u) in GDT table (%u-%u)", | 97 | "Block bitmap (%u) in GDT table" |
98 | " ("E3FSBLK"-"E3FSBLK")", | ||
97 | input->block_bitmap, start, metaend - 1); | 99 | input->block_bitmap, start, metaend - 1); |
98 | else if (inside(input->inode_bitmap, start, metaend)) | 100 | else if (inside(input->inode_bitmap, start, metaend)) |
99 | ext3_warning(sb, __FUNCTION__, | 101 | ext3_warning(sb, __FUNCTION__, |
100 | "Inode bitmap (%u) in GDT table (%u-%u)", | 102 | "Inode bitmap (%u) in GDT table" |
103 | " ("E3FSBLK"-"E3FSBLK")", | ||
101 | input->inode_bitmap, start, metaend - 1); | 104 | input->inode_bitmap, start, metaend - 1); |
102 | else if (inside(input->inode_table, start, metaend) || | 105 | else if (inside(input->inode_table, start, metaend) || |
103 | inside(itend - 1, start, metaend)) | 106 | inside(itend - 1, start, metaend)) |
104 | ext3_warning(sb, __FUNCTION__, | 107 | ext3_warning(sb, __FUNCTION__, |
105 | "Inode table (%u-%u) overlaps GDT table (%u-%u)", | 108 | "Inode table (%u-"E3FSBLK") overlaps" |
109 | "GDT table ("E3FSBLK"-"E3FSBLK")", | ||
106 | input->inode_table, itend - 1, start, metaend - 1); | 110 | input->inode_table, itend - 1, start, metaend - 1); |
107 | else | 111 | else |
108 | err = 0; | 112 | err = 0; |
@@ -171,7 +175,7 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
171 | struct buffer_head *bh; | 175 | struct buffer_head *bh; |
172 | handle_t *handle; | 176 | handle_t *handle; |
173 | unsigned long block; | 177 | unsigned long block; |
174 | int bit; | 178 | ext3_grpblk_t bit; |
175 | int i; | 179 | int i; |
176 | int err = 0, err2; | 180 | int err = 0, err2; |
177 | 181 | ||
@@ -340,7 +344,7 @@ static int verify_reserved_gdb(struct super_block *sb, | |||
340 | while ((grp = ext3_list_backups(sb, &three, &five, &seven)) < end) { | 344 | while ((grp = ext3_list_backups(sb, &three, &five, &seven)) < end) { |
341 | if (le32_to_cpu(*p++) != grp * EXT3_BLOCKS_PER_GROUP(sb) + blk){ | 345 | if (le32_to_cpu(*p++) != grp * EXT3_BLOCKS_PER_GROUP(sb) + blk){ |
342 | ext3_warning(sb, __FUNCTION__, | 346 | ext3_warning(sb, __FUNCTION__, |
343 | "reserved GDT %ld missing grp %d (%ld)", | 347 | "reserved GDT %lu missing grp %d (%lu)", |
344 | blk, grp, | 348 | blk, grp, |
345 | grp * EXT3_BLOCKS_PER_GROUP(sb) + blk); | 349 | grp * EXT3_BLOCKS_PER_GROUP(sb) + blk); |
346 | return -EINVAL; | 350 | return -EINVAL; |
@@ -906,11 +910,12 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, | |||
906 | { | 910 | { |
907 | unsigned long o_blocks_count; | 911 | unsigned long o_blocks_count; |
908 | unsigned long o_groups_count; | 912 | unsigned long o_groups_count; |
909 | unsigned long last; | 913 | ext3_grpblk_t last; |
910 | int add; | 914 | ext3_grpblk_t add; |
911 | struct buffer_head * bh; | 915 | struct buffer_head * bh; |
912 | handle_t *handle; | 916 | handle_t *handle; |
913 | int err, freed_blocks; | 917 | int err; |
918 | unsigned long freed_blocks; | ||
914 | 919 | ||
915 | /* We don't need to worry about locking wrt other resizers just | 920 | /* We don't need to worry about locking wrt other resizers just |
916 | * yet: we're going to revalidate es->s_blocks_count after | 921 | * yet: we're going to revalidate es->s_blocks_count after |
@@ -1001,10 +1006,10 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, | |||
1001 | ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); | 1006 | ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); |
1002 | sb->s_dirt = 1; | 1007 | sb->s_dirt = 1; |
1003 | unlock_super(sb); | 1008 | unlock_super(sb); |
1004 | ext3_debug("freeing blocks %ld through %ld\n", o_blocks_count, | 1009 | ext3_debug("freeing blocks %lu through %lu\n", o_blocks_count, |
1005 | o_blocks_count + add); | 1010 | o_blocks_count + add); |
1006 | ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks); | 1011 | ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks); |
1007 | ext3_debug("freed blocks %ld through %ld\n", o_blocks_count, | 1012 | ext3_debug("freed blocks %lu through %lu\n", o_blocks_count, |
1008 | o_blocks_count + add); | 1013 | o_blocks_count + add); |
1009 | if ((err = ext3_journal_stop(handle))) | 1014 | if ((err = ext3_journal_stop(handle))) |
1010 | goto exit_put; | 1015 | goto exit_put; |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index e0fc0c83be90..94113500fc55 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -1841,7 +1841,7 @@ static journal_t *ext3_get_dev_journal(struct super_block *sb, | |||
1841 | struct buffer_head * bh; | 1841 | struct buffer_head * bh; |
1842 | journal_t *journal; | 1842 | journal_t *journal; |
1843 | int start; | 1843 | int start; |
1844 | int len; | 1844 | ext3_fsblk_t len; |
1845 | int hblock, blocksize; | 1845 | int hblock, blocksize; |
1846 | unsigned long sb_block; | 1846 | unsigned long sb_block; |
1847 | unsigned long offset; | 1847 | unsigned long offset; |
diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c index e8d60bf6b7df..1ba515de5a75 100644 --- a/fs/ext3/xattr.c +++ b/fs/ext3/xattr.c | |||
@@ -225,7 +225,7 @@ ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, | |||
225 | error = -ENODATA; | 225 | error = -ENODATA; |
226 | if (!EXT3_I(inode)->i_file_acl) | 226 | if (!EXT3_I(inode)->i_file_acl) |
227 | goto cleanup; | 227 | goto cleanup; |
228 | ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); | 228 | ea_idebug(inode, "reading block %u", EXT3_I(inode)->i_file_acl); |
229 | bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); | 229 | bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); |
230 | if (!bh) | 230 | if (!bh) |
231 | goto cleanup; | 231 | goto cleanup; |
@@ -233,7 +233,7 @@ ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, | |||
233 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); | 233 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); |
234 | if (ext3_xattr_check_block(bh)) { | 234 | if (ext3_xattr_check_block(bh)) { |
235 | bad_block: ext3_error(inode->i_sb, __FUNCTION__, | 235 | bad_block: ext3_error(inode->i_sb, __FUNCTION__, |
236 | "inode %ld: bad block %d", inode->i_ino, | 236 | "inode %ld: bad block %u", inode->i_ino, |
237 | EXT3_I(inode)->i_file_acl); | 237 | EXT3_I(inode)->i_file_acl); |
238 | error = -EIO; | 238 | error = -EIO; |
239 | goto cleanup; | 239 | goto cleanup; |
@@ -366,7 +366,7 @@ ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) | |||
366 | error = 0; | 366 | error = 0; |
367 | if (!EXT3_I(inode)->i_file_acl) | 367 | if (!EXT3_I(inode)->i_file_acl) |
368 | goto cleanup; | 368 | goto cleanup; |
369 | ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); | 369 | ea_idebug(inode, "reading block %u", EXT3_I(inode)->i_file_acl); |
370 | bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); | 370 | bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); |
371 | error = -EIO; | 371 | error = -EIO; |
372 | if (!bh) | 372 | if (!bh) |
@@ -375,7 +375,7 @@ ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) | |||
375 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); | 375 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); |
376 | if (ext3_xattr_check_block(bh)) { | 376 | if (ext3_xattr_check_block(bh)) { |
377 | ext3_error(inode->i_sb, __FUNCTION__, | 377 | ext3_error(inode->i_sb, __FUNCTION__, |
378 | "inode %ld: bad block %d", inode->i_ino, | 378 | "inode %ld: bad block %u", inode->i_ino, |
379 | EXT3_I(inode)->i_file_acl); | 379 | EXT3_I(inode)->i_file_acl); |
380 | error = -EIO; | 380 | error = -EIO; |
381 | goto cleanup; | 381 | goto cleanup; |
@@ -647,7 +647,7 @@ ext3_xattr_block_find(struct inode *inode, struct ext3_xattr_info *i, | |||
647 | le32_to_cpu(BHDR(bs->bh)->h_refcount)); | 647 | le32_to_cpu(BHDR(bs->bh)->h_refcount)); |
648 | if (ext3_xattr_check_block(bs->bh)) { | 648 | if (ext3_xattr_check_block(bs->bh)) { |
649 | ext3_error(sb, __FUNCTION__, | 649 | ext3_error(sb, __FUNCTION__, |
650 | "inode %ld: bad block %d", inode->i_ino, | 650 | "inode %ld: bad block %u", inode->i_ino, |
651 | EXT3_I(inode)->i_file_acl); | 651 | EXT3_I(inode)->i_file_acl); |
652 | error = -EIO; | 652 | error = -EIO; |
653 | goto cleanup; | 653 | goto cleanup; |
@@ -792,11 +792,12 @@ inserted: | |||
792 | get_bh(new_bh); | 792 | get_bh(new_bh); |
793 | } else { | 793 | } else { |
794 | /* We need to allocate a new block */ | 794 | /* We need to allocate a new block */ |
795 | int goal = le32_to_cpu( | 795 | ext3_fsblk_t goal = le32_to_cpu( |
796 | EXT3_SB(sb)->s_es->s_first_data_block) + | 796 | EXT3_SB(sb)->s_es->s_first_data_block) + |
797 | EXT3_I(inode)->i_block_group * | 797 | (ext3_fsblk_t)EXT3_I(inode)->i_block_group * |
798 | EXT3_BLOCKS_PER_GROUP(sb); | 798 | EXT3_BLOCKS_PER_GROUP(sb); |
799 | int block = ext3_new_block(handle, inode, goal, &error); | 799 | ext3_fsblk_t block = ext3_new_block(handle, inode, |
800 | goal, &error); | ||
800 | if (error) | 801 | if (error) |
801 | goto cleanup; | 802 | goto cleanup; |
802 | ea_idebug(inode, "creating block %d", block); | 803 | ea_idebug(inode, "creating block %d", block); |
@@ -847,7 +848,7 @@ cleanup_dquot: | |||
847 | 848 | ||
848 | bad_block: | 849 | bad_block: |
849 | ext3_error(inode->i_sb, __FUNCTION__, | 850 | ext3_error(inode->i_sb, __FUNCTION__, |
850 | "inode %ld: bad block %d", inode->i_ino, | 851 | "inode %ld: bad block %u", inode->i_ino, |
851 | EXT3_I(inode)->i_file_acl); | 852 | EXT3_I(inode)->i_file_acl); |
852 | goto cleanup; | 853 | goto cleanup; |
853 | 854 | ||
@@ -1076,14 +1077,14 @@ ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) | |||
1076 | bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); | 1077 | bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); |
1077 | if (!bh) { | 1078 | if (!bh) { |
1078 | ext3_error(inode->i_sb, __FUNCTION__, | 1079 | ext3_error(inode->i_sb, __FUNCTION__, |
1079 | "inode %ld: block %d read error", inode->i_ino, | 1080 | "inode %ld: block %u read error", inode->i_ino, |
1080 | EXT3_I(inode)->i_file_acl); | 1081 | EXT3_I(inode)->i_file_acl); |
1081 | goto cleanup; | 1082 | goto cleanup; |
1082 | } | 1083 | } |
1083 | if (BHDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || | 1084 | if (BHDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || |
1084 | BHDR(bh)->h_blocks != cpu_to_le32(1)) { | 1085 | BHDR(bh)->h_blocks != cpu_to_le32(1)) { |
1085 | ext3_error(inode->i_sb, __FUNCTION__, | 1086 | ext3_error(inode->i_sb, __FUNCTION__, |
1086 | "inode %ld: bad block %d", inode->i_ino, | 1087 | "inode %ld: bad block %u", inode->i_ino, |
1087 | EXT3_I(inode)->i_file_acl); | 1088 | EXT3_I(inode)->i_file_acl); |
1088 | goto cleanup; | 1089 | goto cleanup; |
1089 | } | 1090 | } |
@@ -1210,11 +1211,11 @@ again: | |||
1210 | bh = sb_bread(inode->i_sb, ce->e_block); | 1211 | bh = sb_bread(inode->i_sb, ce->e_block); |
1211 | if (!bh) { | 1212 | if (!bh) { |
1212 | ext3_error(inode->i_sb, __FUNCTION__, | 1213 | ext3_error(inode->i_sb, __FUNCTION__, |
1213 | "inode %ld: block %ld read error", | 1214 | "inode %ld: block %lu read error", |
1214 | inode->i_ino, (unsigned long) ce->e_block); | 1215 | inode->i_ino, (unsigned long) ce->e_block); |
1215 | } else if (le32_to_cpu(BHDR(bh)->h_refcount) >= | 1216 | } else if (le32_to_cpu(BHDR(bh)->h_refcount) >= |
1216 | EXT3_XATTR_REFCOUNT_MAX) { | 1217 | EXT3_XATTR_REFCOUNT_MAX) { |
1217 | ea_idebug(inode, "block %ld refcount %d>=%d", | 1218 | ea_idebug(inode, "block %lu refcount %d>=%d", |
1218 | (unsigned long) ce->e_block, | 1219 | (unsigned long) ce->e_block, |
1219 | le32_to_cpu(BHDR(bh)->h_refcount), | 1220 | le32_to_cpu(BHDR(bh)->h_refcount), |
1220 | EXT3_XATTR_REFCOUNT_MAX); | 1221 | EXT3_XATTR_REFCOUNT_MAX); |
diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 757d54d8f1a5..34136ff02aca 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h | |||
@@ -730,13 +730,15 @@ struct dir_private_info { | |||
730 | /* balloc.c */ | 730 | /* balloc.c */ |
731 | extern int ext3_bg_has_super(struct super_block *sb, int group); | 731 | extern int ext3_bg_has_super(struct super_block *sb, int group); |
732 | extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group); | 732 | extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group); |
733 | extern int ext3_new_block (handle_t *, struct inode *, unsigned long, int *); | 733 | extern ext3_fsblk_t ext3_new_block (handle_t *handle, struct inode *inode, |
734 | extern int ext3_new_blocks (handle_t *, struct inode *, unsigned long, | 734 | ext3_fsblk_t goal, int *errp); |
735 | unsigned long *, int *); | 735 | extern ext3_fsblk_t ext3_new_blocks (handle_t *handle, struct inode *inode, |
736 | extern void ext3_free_blocks (handle_t *, struct inode *, unsigned long, | 736 | ext3_fsblk_t goal, unsigned long *count, int *errp); |
737 | unsigned long); | 737 | extern void ext3_free_blocks (handle_t *handle, struct inode *inode, |
738 | extern void ext3_free_blocks_sb (handle_t *, struct super_block *, | 738 | ext3_fsblk_t block, unsigned long count); |
739 | unsigned long, unsigned long, int *); | 739 | extern void ext3_free_blocks_sb (handle_t *handle, struct super_block *sb, |
740 | ext3_fsblk_t block, unsigned long count, | ||
741 | unsigned long *pdquot_freed_blocks); | ||
740 | extern unsigned long ext3_count_free_blocks (struct super_block *); | 742 | extern unsigned long ext3_count_free_blocks (struct super_block *); |
741 | extern void ext3_check_blocks_bitmap (struct super_block *); | 743 | extern void ext3_check_blocks_bitmap (struct super_block *); |
742 | extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, | 744 | extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, |
@@ -773,7 +775,8 @@ extern unsigned long ext3_count_free (struct buffer_head *, unsigned); | |||
773 | 775 | ||
774 | 776 | ||
775 | /* inode.c */ | 777 | /* inode.c */ |
776 | int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); | 778 | int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, |
779 | struct buffer_head *bh, ext3_fsblk_t blocknr); | ||
777 | struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); | 780 | struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); |
778 | struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); | 781 | struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); |
779 | int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, | 782 | int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, |
diff --git a/include/linux/ext3_fs_i.h b/include/linux/ext3_fs_i.h index 7abf90147180..e1c7509c0c9f 100644 --- a/include/linux/ext3_fs_i.h +++ b/include/linux/ext3_fs_i.h | |||
@@ -21,6 +21,14 @@ | |||
21 | #include <linux/seqlock.h> | 21 | #include <linux/seqlock.h> |
22 | #include <linux/mutex.h> | 22 | #include <linux/mutex.h> |
23 | 23 | ||
24 | /* data type for block offset of block group */ | ||
25 | typedef int ext3_grpblk_t; | ||
26 | |||
27 | /* data type for filesystem-wide blocks number */ | ||
28 | typedef unsigned long ext3_fsblk_t; | ||
29 | |||
30 | #define E3FSBLK "%lu" | ||
31 | |||
24 | struct ext3_reserve_window { | 32 | struct ext3_reserve_window { |
25 | __u32 _rsv_start; /* First byte reserved */ | 33 | __u32 _rsv_start; /* First byte reserved */ |
26 | __u32 _rsv_end; /* Last byte reserved or 0 */ | 34 | __u32 _rsv_end; /* Last byte reserved or 0 */ |