Whamcloud - gitweb
Branch b1_8
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext3-statfs-2.6.22.patch
1 Index: linux-2.6.18.8/fs/ext3/super.c
2 ===================================================================
3 --- linux-2.6.18.8.orig/fs/ext3/super.c 2007-07-20 16:51:14.000000000 +0200
4 +++ linux-2.6.18.8/fs/ext3/super.c      2007-07-20 16:54:17.000000000 +0200
5 @@ -2572,19 +2572,19 @@ static int ext3_statfs (struct dentry * 
6         struct super_block *sb = dentry->d_sb;
7         struct ext3_sb_info *sbi = EXT3_SB(sb);
8         struct ext3_super_block *es = sbi->s_es;
9 -       ext3_fsblk_t overhead;
10 -       int i;
11         u64 fsid;
12  
13 -       if (test_opt (sb, MINIX_DF))
14 -               overhead = 0;
15 -       else {
16 -               unsigned long ngroups;
17 -               ngroups = EXT3_SB(sb)->s_groups_count;
18 +       if (test_opt(sb, MINIX_DF)) {
19 +               sbi->s_overhead_last = 0;
20 +       } else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) {
21 +               unsigned long ngroups = sbi->s_groups_count, i;
22 +               ext3_fsblk_t overhead = 0;
23                 smp_rmb();
24  
25                 /*
26 -                * Compute the overhead (FS structures)
27 +                * Compute the overhead (FS structures).  This is constant
28 +                * for a given filesystem unless the number of block groups
29 +                * changes so we cache the previous value until it does.
30                  */
31  
32                 /*
33 @@ -2605,18 +2605,23 @@ static int ext3_statfs (struct dentry * 
34                  * Every block group has an inode bitmap, a block
35                  * bitmap, and an inode table.
36                  */
37 -               overhead += (ngroups * (2 + EXT3_SB(sb)->s_itb_per_group));
38 +               overhead += ngroups * (2 + sbi->s_itb_per_group);
39 +               sbi->s_overhead_last = overhead;
40 +               smp_wmb();
41 +               sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);
42         }
43  
44         buf->f_type = EXT3_SUPER_MAGIC;
45         buf->f_bsize = sb->s_blocksize;
46 -       buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead;
47 +       buf->f_blocks = le32_to_cpu(es->s_blocks_count) - sbi->s_overhead_last;
48         buf->f_bfree = percpu_counter_sum(&sbi->s_freeblocks_counter);
49 +       es->s_free_blocks_count = cpu_to_le32(buf->f_bfree);
50         buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count);
51         if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count))
52                 buf->f_bavail = 0;
53         buf->f_files = le32_to_cpu(es->s_inodes_count);
54         buf->f_ffree = percpu_counter_sum(&sbi->s_freeinodes_counter);
55 +       es->s_free_inodes_count = cpu_to_le32(buf->f_ffree);
56         buf->f_namelen = EXT3_NAME_LEN;
57         return 0;
58  }
59 Index: linux-2.6.18.8/include/linux/ext3_fs_sb.h
60 ===================================================================
61 --- linux-2.6.18.8.orig/include/linux/ext3_fs_sb.h      2007-07-20 16:51:23.000000000 +0200
62 +++ linux-2.6.18.8/include/linux/ext3_fs_sb.h   2007-07-20 16:51:43.000000000 +0200
63 @@ -45,6 +45,8 @@ struct ext3_sb_info {
64         unsigned long s_gdb_count;      /* Number of group descriptor blocks */
65         unsigned long s_desc_per_block; /* Number of group descriptors per block */
66         unsigned long s_groups_count;   /* Number of groups in the fs */
67 +       unsigned long s_overhead_last;  /* Last calculated overhead */
68 +       unsigned long s_blocks_last;    /* Last seen block count */
69         struct buffer_head * s_sbh;     /* Buffer containing the super block */
70         struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */
71         struct buffer_head ** s_group_desc;