Whamcloud - gitweb
LU-17744 ldiskfs: mballoc stats fixes 72/54772/3 master
authorAlexander Zarochentsev <alexander.zarochentsev@hpe.com>
Sun, 31 Mar 2024 20:21:56 +0000 (20:21 +0000)
committerOleg Drokin <green@whamcloud.com>
Tue, 23 Apr 2024 19:57:50 +0000 (19:57 +0000)
Change mballoc statistics to use correct
allocation loop ids.

Fixes: 95f8ae56774 ("LU-12103 ldiskfs: don't search large block range if disk full")
HPE-bug-id: LUS-11936
Signed-off-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Change-Id: I892ead5355865ec9c07fdc758e127c711b42cb1b
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54772
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
ldiskfs/kernel_patches/patches/linux-5.4/ext4-simple-blockalloc.patch
ldiskfs/kernel_patches/patches/linux-5.8/ext4-simple-blockalloc.patch
ldiskfs/kernel_patches/patches/linux-5.9/ext4-simple-blockalloc.patch
ldiskfs/kernel_patches/patches/rhel7.6/ext4-simple-blockalloc.patch
ldiskfs/kernel_patches/patches/rhel8/ext4-simple-blockalloc.patch
ldiskfs/kernel_patches/patches/ubuntu20.04.3/ext4-simple-blockalloc.patch
ldiskfs/kernel_patches/patches/ubuntu2004/ext4-simple-blockalloc.patch

index 5b3a0b6..f043569 100644 (file)
@@ -17,7 +17,7 @@ Index: linux-stage/fs/ext4/ext4.h
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
@@ -97,7 +97,7 @@ Index: linux-stage/fs/ext4/mballoc.c
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2520,6 +2553,93 @@ const struct file_operations ext4_seq_mb
+@@ -2520,6 +2553,96 @@ const struct file_operations ext4_seq_mb
        .write         = ext4_mb_last_group_write,
  };
  
        .write         = ext4_mb_last_group_write,
  };
  
@@ -118,17 +118,19 @@ Index: linux-stage/fs/ext4/mballoc.c
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]));
-+      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[3]));
++      seq_printf(seq, "\tskipped_c0_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]));
-+      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[1]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[1]));
-+      seq_printf(seq, "\tskipped_c3_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
@@ -159,6 +161,7 @@ Index: linux-stage/fs/ext4/mballoc.c
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
@@ -216,14 +219,15 @@ Index: linux-stage/fs/ext4/mballoc.c
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
-@@ -2951,6 +3082,16 @@ int ext4_mb_release(struct super_block *
+@@ -2951,6 +3082,17 @@ int ext4_mb_release(struct super_block *
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%llu, %llu, %llu) useless c(0,1,2) loops",
++                      "mballoc: (%llu, %llu, %llu, %llu) useless c(0,1,2,3) loops",
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]),
index e266034..0e06c78 100644 (file)
@@ -22,7 +22,7 @@
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
@@ -98,7 +98,7 @@
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2624,6 +2657,92 @@ const struct proc_ops ext4_seq_mb_last_g
+@@ -2624,6 +2657,95 @@ const struct proc_ops ext4_seq_mb_last_g
        .proc_write     = ext4_mb_last_group_write,
  };
  
        .proc_write     = ext4_mb_last_group_write,
  };
  
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
-+      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++                 atomic64_read(&sbi->s_bal_cX_failed[3]));
++      seq_printf(seq, "\tskipped_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
-+      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
-+      seq_printf(seq, "\tskipped_c3_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
-@@ -3042,6 +3165,16 @@ int ext4_mb_release(struct super_block *
+@@ -3042,6 +3165,17 @@ int ext4_mb_release(struct super_block *
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%llu, %llu, %llu) useless c(0,1,2) loops",
++                      "mballoc: (%llu, %llu, %llu, %llu) useless c(0,1,2,3) loops",
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
index 3b62efb..cabf2ed 100644 (file)
@@ -22,7 +22,7 @@
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
@@ -98,7 +98,7 @@
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2746,6 +2779,92 @@ const struct proc_ops ext4_seq_mb_last_g
+@@ -2746,6 +2779,95 @@ const struct proc_ops ext4_seq_mb_last_g
        .proc_write     = ext4_mb_last_group_write,
  };
  
        .proc_write     = ext4_mb_last_group_write,
  };
  
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
-+      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++                 atomic64_read(&sbi->s_bal_cX_failed[3]));
++      seq_printf(seq, "\tskipped_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
-+      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
-+      seq_printf(seq, "\tskipped_c3_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
-@@ -3185,6 +3308,16 @@ int ext4_mb_release(struct super_block *
+@@ -3185,6 +3308,17 @@ int ext4_mb_release(struct super_block *
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%llu, %llu, %llu) useless c(0,1,2) loops",
++                      "mballoc: (%llu, %llu, %llu, %llu) useless c(0,1,2,3) loops",
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
index a516663..26ccdfe 100644 (file)
@@ -64,7 +64,7 @@ Index: linux-stage/fs/ext4/mballoc.c
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2316,6 +2350,93 @@ static const struct seq_operations ext4_
+@@ -2316,6 +2350,96 @@ static const struct seq_operations ext4_
        .show   = ext4_mb_seq_groups_show,
  };
  
        .show   = ext4_mb_seq_groups_show,
  };
  
@@ -85,12 +85,14 @@ Index: linux-stage/fs/ext4/mballoc.c
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %lu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %lu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %lu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %lu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %lu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %lu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
++      seq_printf(seq, "\tuseless_c3_loops: %lu\n",
++                 atomic64_read(&sbi->s_bal_cX_failed[3]));
 +      seq_printf(seq, "\tskipped_c1_loops: %lu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +      seq_printf(seq, "\tskipped_c2_loops: %lu\n",
 +      seq_printf(seq, "\tskipped_c1_loops: %lu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +      seq_printf(seq, "\tskipped_c2_loops: %lu\n",
@@ -126,6 +128,7 @@ Index: linux-stage/fs/ext4/mballoc.c
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
@@ -200,14 +203,15 @@ Index: linux-stage/fs/ext4/mballoc.c
        }
  
        if (sbi->s_group_info) {
        }
  
        if (sbi->s_group_info) {
-@@ -2936,6 +3064,16 @@ int ext4_mb_release(struct super_block *
+@@ -2936,6 +3064,17 @@ int ext4_mb_release(struct super_block *
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%lu, %lu, %lu) useless c(0,1,2) loops",
++                      "mballoc: (%lu, %lu, %lu, %lu) useless c(0,1,2,3) loops",
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%lu, %lu, %lu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%lu, %lu, %lu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
@@ -236,7 +240,7 @@ Index: linux-stage/fs/ext4/ext4.h
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
index 1d9b22a..43bba2a 100644 (file)
@@ -17,7 +17,7 @@ index 3b9ec24..64dc5fd 100644
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
@@ -97,7 +97,7 @@ index 15c962f..7870406 100644
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2510,6 +2543,93 @@ const struct file_operations ext4_seq_mb_last_group_fops = {
+@@ -2510,6 +2543,96 @@ const struct file_operations ext4_seq_mb_last_group_fops = {
        .write         = ext4_mb_last_group_write,
  };
  
        .write         = ext4_mb_last_group_write,
  };
  
@@ -118,17 +118,19 @@ index 15c962f..7870406 100644
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]));
-+      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[3]));
++      seq_printf(seq, "\tskipped_c0_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]));
-+      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[1]));
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[1]));
-+      seq_printf(seq, "\tskipped_c3_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +                 (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
@@ -159,6 +161,7 @@ index 15c962f..7870406 100644
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
@@ -216,15 +219,16 @@ index 15c962f..7870406 100644
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
-@@ -2922,6 +3046,16 @@ int ext4_mb_release(struct super_block *sb)
+@@ -2922,6 +3046,17 @@ int ext4_mb_release(struct super_block *sb)
                                atomic_read(&sbi->s_bal_allocated),
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
 +              ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_allocated),
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
 +              ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%llu, %llu, %llu) useless c(0,1,2) loops",
++                      "mballoc: (%llu, %llu, %llu, %llu) useless c(0,1,2,3) loops",
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              (unsigned long long)atomic64_read(&sbi->s_bal_cX_skipped[0]),
index 66603b7..3d6627b 100644 (file)
@@ -16,7 +16,7 @@ diff -ur a/fs/ext4/ext4.h b/fs/ext4/ext4.h
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
@@ -93,7 +93,7 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2719,6 +2752,92 @@
+@@ -2719,6 +2752,95 @@
        .proc_write     = ext4_mb_last_group_write,
  };
  
        .proc_write     = ext4_mb_last_group_write,
  };
  
@@ -114,17 +114,19 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
-+      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++                 atomic64_read(&sbi->s_bal_cX_failed[3]));
++      seq_printf(seq, "\tskipped_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
-+      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
-+      seq_printf(seq, "\tskipped_c3_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
@@ -155,6 +157,7 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
@@ -204,14 +207,15 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
-@@ -3166,6 +3289,16 @@
+@@ -3166,6 +3289,17 @@
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%llu, %llu, %llu) useless c(0,1,2) loops",
++                      "mballoc: (%llu, %llu, %llu, %llu) useless c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
index 72932bc..2302113 100644 (file)
@@ -16,7 +16,7 @@ diff -ur a/fs/ext4/ext4.h b/fs/ext4/ext4.h
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
        atomic_t s_bal_breaks;  /* too long searches */
        atomic_t s_bal_2orders; /* 2^order hits */
 +      /* cX loop didn't find blocks */
-+      atomic64_t s_bal_cX_failed[3];
++      atomic64_t s_bal_cX_failed[4];
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
 +      atomic64_t s_bal_cX_skipped[3];
        spinlock_t s_bal_lock;
        unsigned long s_mb_buddies_generated;
@@ -93,7 +93,7 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
        }
  
        if (ac->ac_b_ex.fe_len > 0 && ac->ac_status != AC_STATUS_FOUND &&
-@@ -2643,6 +2676,92 @@
+@@ -2643,6 +2676,95 @@
        .proc_write     = ext4_mb_last_group_write,
  };
  
        .proc_write     = ext4_mb_last_group_write,
  };
  
@@ -114,17 +114,19 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
 +      seq_printf(seq, "\t\tbreaks: %u\n", atomic_read(&sbi->s_bal_breaks));
 +      seq_printf(seq, "\t\tlost: %u\n", atomic_read(&sbi->s_mb_lost_chunks));
 +
-+      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[0]));
-+      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[1]));
-+      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
 +                 atomic64_read(&sbi->s_bal_cX_failed[2]));
-+      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
++      seq_printf(seq, "\tuseless_c3_loops: %llu\n",
++                 atomic64_read(&sbi->s_bal_cX_failed[3]));
++      seq_printf(seq, "\tskipped_c0_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[0]));
-+      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c1_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
 +                 atomic64_read(&sbi->s_bal_cX_skipped[1]));
-+      seq_printf(seq, "\tskipped_c3_loops: %llu\n",
++      seq_printf(seq, "\tskipped_c2_loops: %llu\n",
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
 +                 atomic64_read(&sbi->s_bal_cX_skipped[2]));
 +      seq_printf(seq, "\tbuddies_generated: %lu\n",
 +                 sbi->s_mb_buddies_generated);
@@ -155,6 +157,7 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
 +      atomic64_set(&sbi->s_bal_cX_failed[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[1], 0),
 +      atomic64_set(&sbi->s_bal_cX_failed[2], 0);
++      atomic64_set(&sbi->s_bal_cX_failed[3], 0);
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
 +
 +      atomic64_set(&sbi->s_bal_cX_skipped[0], 0),
 +      atomic64_set(&sbi->s_bal_cX_skipped[1], 0),
@@ -204,14 +207,15 @@ diff -ur a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
        /*
         * The default group preallocation is 512, which for 4k block
         * sizes translates to 2 megabytes.  However for bigalloc file
-@@ -3062,6 +3185,16 @@
+@@ -3062,6 +3185,17 @@
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
                                atomic_read(&sbi->s_bal_reqs),
                                atomic_read(&sbi->s_bal_success));
                ext4_msg(sb, KERN_INFO,
-+                      "mballoc: (%llu, %llu, %llu) useless c(0,1,2) loops",
++                      "mballoc: (%llu, %llu, %llu, %llu) useless c(0,1,2,3) loops",
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[0]),
 +                              atomic64_read(&sbi->s_bal_cX_failed[1]),
-+                              atomic64_read(&sbi->s_bal_cX_failed[2]));
++                              atomic64_read(&sbi->s_bal_cX_failed[2]),
++                              atomic64_read(&sbi->s_bal_cX_failed[3]));
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),
 +              ext4_msg(sb, KERN_INFO,
 +                      "mballoc: (%llu, %llu, %llu) skipped c(0,1,2) loops",
 +                              atomic64_read(&sbi->s_bal_cX_skipped[0]),