balloc.c (aa7eb8e78d8ecd6cd0475d86ea8385ff9cb47ece) | balloc.c (60ad4466821a96913a9b567115e194ed1087c2d7) |
---|---|
1/* 2 * linux/fs/ext4/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 * --- 606 unchanged lines hidden (view full) --- 615 if (!EXT4_HAS_INCOMPAT_FEATURE(sb,EXT4_FEATURE_INCOMPAT_META_BG) || 616 metagroup < first_meta_bg) 617 return ext4_bg_num_gdb_nometa(sb, group); 618 619 return ext4_bg_num_gdb_meta(sb,group); 620 621} 622 | 1/* 2 * linux/fs/ext4/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 * --- 606 unchanged lines hidden (view full) --- 615 if (!EXT4_HAS_INCOMPAT_FEATURE(sb,EXT4_FEATURE_INCOMPAT_META_BG) || 616 metagroup < first_meta_bg) 617 return ext4_bg_num_gdb_nometa(sb, group); 618 619 return ext4_bg_num_gdb_meta(sb,group); 620 621} 622 |
623/** 624 * ext4_inode_to_goal_block - return a hint for block allocation 625 * @inode: inode for block allocation 626 * 627 * Return the ideal location to start allocating blocks for a 628 * newly created inode. 629 */ 630ext4_fsblk_t ext4_inode_to_goal_block(struct inode *inode) 631{ 632 struct ext4_inode_info *ei = EXT4_I(inode); 633 ext4_group_t block_group; 634 ext4_grpblk_t colour; 635 int flex_size = ext4_flex_bg_size(EXT4_SB(inode->i_sb)); 636 ext4_fsblk_t bg_start; 637 ext4_fsblk_t last_block; 638 639 block_group = ei->i_block_group; 640 if (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) { 641 /* 642 * If there are at least EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME 643 * block groups per flexgroup, reserve the first block 644 * group for directories and special files. Regular 645 * files will start at the second block group. This 646 * tends to speed up directory access and improves 647 * fsck times. 648 */ 649 block_group &= ~(flex_size-1); 650 if (S_ISREG(inode->i_mode)) 651 block_group++; 652 } 653 bg_start = ext4_group_first_block_no(inode->i_sb, block_group); 654 last_block = ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es) - 1; 655 656 /* 657 * If we are doing delayed allocation, we don't need take 658 * colour into account. 659 */ 660 if (test_opt(inode->i_sb, DELALLOC)) 661 return bg_start; 662 663 if (bg_start + EXT4_BLOCKS_PER_GROUP(inode->i_sb) <= last_block) 664 colour = (current->pid % 16) * 665 (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); 666 else 667 colour = (current->pid % 16) * ((last_block - bg_start) / 16); 668 return bg_start + colour; 669} 670 |
|