Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] fast ext3_statfs

Under I/O load it may take up to a dozen seconds to read all group
descriptors. This is what ext3_statfs() does. At the same time, we already
maintain global numbers of free inodes/blocks. Why don't we use them instead
of group reading and summing?

Cc: Ravikiran G Thirumalai <kiran@scalex86.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Alex Tomas and committed by
Linus Torvalds
09fe316a e933b6d6

+4 -3
+4 -3
fs/ext3/super.c
··· 2326 2326 2327 2327 static int ext3_statfs (struct super_block * sb, struct kstatfs * buf) 2328 2328 { 2329 - struct ext3_super_block *es = EXT3_SB(sb)->s_es; 2329 + struct ext3_sb_info *sbi = EXT3_SB(sb); 2330 + struct ext3_super_block *es = sbi->s_es; 2330 2331 unsigned long overhead; 2331 2332 int i; 2332 2333 ··· 2369 2368 buf->f_type = EXT3_SUPER_MAGIC; 2370 2369 buf->f_bsize = sb->s_blocksize; 2371 2370 buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead; 2372 - buf->f_bfree = ext3_count_free_blocks (sb); 2371 + buf->f_bfree = percpu_counter_sum(&sbi->s_freeblocks_counter); 2373 2372 buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count); 2374 2373 if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count)) 2375 2374 buf->f_bavail = 0; 2376 2375 buf->f_files = le32_to_cpu(es->s_inodes_count); 2377 - buf->f_ffree = ext3_count_free_inodes (sb); 2376 + buf->f_ffree = percpu_counter_sum(&sbi->s_freeinodes_counter); 2378 2377 buf->f_namelen = EXT3_NAME_LEN; 2379 2378 return 0; 2380 2379 }