在 2008-10-24五的 15:27 -0500,Eric Sandeen写道: > Mingming pointed out that ext4_claim_free_blocks & ext4_has_free_blocks > are largely cut & pasted; they can be collapsed/merged as follows. > > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > Reviewed-by: Mingming Cao <cmm@xxxxxxxxxx> > Index: linux-2.6/fs/ext4/balloc.c > =================================================================== > --- linux-2.6.orig/fs/ext4/balloc.c 2008-10-24 15:04:51.672001367 -0500 > +++ linux-2.6/fs/ext4/balloc.c 2008-10-24 15:07:28.369001684 -0500 > @@ -589,8 +589,15 @@ void ext4_free_blocks(handle_t *handle, > return; > } > > -int ext4_claim_free_blocks(struct ext4_sb_info *sbi, > - s64 nblocks) > +/** > + * ext4_has_free_blocks() > + * @sbi: in-core super block structure. > + * @nblocks: number of needed blocks > + * > + * Check if filesystem has nblocks free & available for allocation. > + * On success return 1, return 0 on failure. > + */ > +int ext4_has_free_blocks(struct ext4_sb_info *sbi, s64 nblocks) > { > s64 free_blocks, dirty_blocks; > s64 root_blocks = 0; > @@ -620,53 +627,21 @@ int ext4_claim_free_blocks(struct ext4_s > */ > if (free_blocks < ((root_blocks + nblocks) + dirty_blocks)) > /* we don't have free space */ > - return -ENOSPC; > + return 0; > > - /* Add the blocks to nblocks */ > - percpu_counter_add(dbc, nblocks); > - return 0; > + return 1; > } > > -/** > - * ext4_has_free_blocks() > - * @sbi: in-core super block structure. > - * @nblocks: number of neeed blocks > - * > - * Check if filesystem has free blocks available for allocation. > - * Return the number of blocks avaible for allocation for this request > - * On success, return nblocks > - */ > -ext4_fsblk_t ext4_has_free_blocks(struct ext4_sb_info *sbi, > +int ext4_claim_free_blocks(struct ext4_sb_info *sbi, > s64 nblocks) > { > - s64 free_blocks, dirty_blocks; > - s64 root_blocks = 0; > - struct percpu_counter *fbc = &sbi->s_freeblocks_counter; > - struct percpu_counter *dbc = &sbi->s_dirtyblocks_counter; > - > - free_blocks = percpu_counter_read_positive(fbc); > - dirty_blocks = percpu_counter_read_positive(dbc); > - > - if (!capable(CAP_SYS_RESOURCE) && > - sbi->s_resuid != current->fsuid && > - (sbi->s_resgid == 0 || !in_group_p(sbi->s_resgid))) > - root_blocks = ext4_r_blocks_count(sbi->s_es); > - > - if (free_blocks - (nblocks + root_blocks + dirty_blocks) < > - EXT4_FREEBLOCKS_WATERMARK) { > - free_blocks = percpu_counter_sum(fbc); > - dirty_blocks = percpu_counter_sum(dbc); > - } > - if (free_blocks <= (root_blocks + dirty_blocks)) > - /* we don't have free space */ > + if (ext4_has_free_blocks(sbi, nblocks)) { > + percpu_counter_add(&sbi->s_dirtyblocks_counter, nblocks); > return 0; > - > - if (free_blocks - (root_blocks + dirty_blocks) < nblocks) > - return free_blocks - (root_blocks + dirty_blocks); > - return nblocks; > + } else > + return -ENOSPC; > } > > - > /** > * ext4_should_retry_alloc() > * @sb: super block > Index: linux-2.6/fs/ext4/ext4.h > =================================================================== > --- linux-2.6.orig/fs/ext4/ext4.h 2008-10-24 14:45:07.000000000 -0500 > +++ linux-2.6/fs/ext4/ext4.h 2008-10-24 15:05:22.227064688 -0500 > @@ -1003,8 +1003,7 @@ extern ext4_fsblk_t ext4_new_blocks(hand > ext4_lblk_t iblock, ext4_fsblk_t goal, > unsigned long *count, int *errp); > extern int ext4_claim_free_blocks(struct ext4_sb_info *sbi, s64 nblocks); > -extern ext4_fsblk_t ext4_has_free_blocks(struct ext4_sb_info *sbi, > - s64 nblocks); > +extern int ext4_has_free_blocks(struct ext4_sb_info *sbi, s64 nblocks); > extern void ext4_free_blocks(handle_t *handle, struct inode *inode, > ext4_fsblk_t block, unsigned long count, int metadata); > extern void ext4_free_blocks_sb(handle_t *handle, struct super_block *sb, > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html