diff -urN ext2-3/fs/ext2/ialloc.c ext2-4/fs/ext2/ialloc.c --- ext2-3/fs/ext2/ialloc.c Fri Dec 1 10:40:41 2000 +++ ext2-4/fs/ext2/ialloc.c Fri Dec 1 11:00:19 2000 @@ -88,44 +88,39 @@ static int load_inode_bitmap (struct super_block * sb, unsigned int block_group) { - int i, j, retval = 0; + int i, j, retval = 0, slot = 0; unsigned long inode_bitmap_number; - struct buffer_head * inode_bitmap; struct ext2_sb_info *sbi = &sb->u.ext2_sb; + struct buffer_head *bh = sbi->s_inode_bitmap[0]; if (block_group >= sbi->s_groups_count) ext2_panic (sb, "load_inode_bitmap", "block_group >= groups_count - " "block_group = %d, groups_count = %lu", block_group, sbi->s_groups_count); + if (sbi->s_loaded_inode_bitmaps > 0 && - sbi->s_inode_bitmap_number[0] == block_group && - sbi->s_inode_bitmap[0] != NULL) - return 0; + sbi->s_inode_bitmap_number[0] == block_group && bh) + goto found; + if (sbi->s_groups_count <= EXT2_MAX_GROUP_LOADED) { - if (sbi->s_inode_bitmap[block_group]) { - if (sbi->s_inode_bitmap_number[block_group] != block_group) - ext2_panic (sb, "load_inode_bitmap", - "block_group != inode_bitmap_number"); - else - return block_group; - } else { - retval = read_inode_bitmap (sb, block_group, - block_group); - if (retval < 0) - return retval; - return block_group; - } + slot = block_group; + bh = sbi->s_inode_bitmap[slot]; + if (!bh) + goto read_it; + if (sbi->s_inode_bitmap_number[slot] == slot) + goto found; + ext2_panic (sb, "load_inode_bitmap", + "block_group != inode_bitmap_number"); } for (i = 0; i < sbi->s_loaded_inode_bitmaps && sbi->s_inode_bitmap_number[i] != block_group; i++) ; - if (i < sbi->s_loaded_inode_bitmaps && - sbi->s_inode_bitmap_number[i] == block_group) { + if (i < sbi->s_loaded_inode_bitmaps) { inode_bitmap_number = sbi->s_inode_bitmap_number[i]; - inode_bitmap = sbi->s_inode_bitmap[i]; + bh = sbi->s_inode_bitmap[i]; for (j = i; j > 0; j--) { sbi->s_inode_bitmap_number[j] = sbi->s_inode_bitmap_number[j - 1]; @@ -133,15 +128,15 @@ sbi->s_inode_bitmap[j - 1]; } sbi->s_inode_bitmap_number[0] = inode_bitmap_number; - sbi->s_inode_bitmap[0] = inode_bitmap; + sbi->s_inode_bitmap[0] = bh; /* * There's still one special case here --- if inode_bitmap == 0 * then our last attempt to read the bitmap failed and we have * just ended up caching that failure. Try again to read it. */ - if (!inode_bitmap) - retval = read_inode_bitmap (sb, block_group, 0); + if (bh) + goto found; } else { if (sbi->s_loaded_inode_bitmaps < EXT2_MAX_GROUP_LOADED) @@ -154,9 +149,14 @@ sbi->s_inode_bitmap[j] = sbi->s_inode_bitmap[j - 1]; } - retval = read_inode_bitmap (sb, block_group, 0); } - return retval; + +read_it: + retval = read_inode_bitmap (sb, block_group, slot); + if (retval < 0) + return retval; +found: + return slot; } /*