]> git.itanic.dy.fi Git - linux-stable/blobdiff - fs/ext4/mballoc.c
ext4: avoid unnecessary spreading of allocations among groups
[linux-stable] / fs / ext4 / mballoc.c
index 7d5e66fded0e55d9531026b4746a4765a3fe5c2a..da84f3456fbb584ab261aab31a853645c3b2a1a7 100644 (file)
@@ -1077,23 +1077,25 @@ mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp)
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        int i;
 
-       if (test_opt2(sb, MB_OPTIMIZE_SCAN) && grp->bb_largest_free_order >= 0) {
+       for (i = MB_NUM_ORDERS(sb) - 1; i >= 0; i--)
+               if (grp->bb_counters[i] > 0)
+                       break;
+       /* No need to move between order lists? */
+       if (!test_opt2(sb, MB_OPTIMIZE_SCAN) ||
+           i == grp->bb_largest_free_order) {
+               grp->bb_largest_free_order = i;
+               return;
+       }
+
+       if (grp->bb_largest_free_order >= 0) {
                write_lock(&sbi->s_mb_largest_free_orders_locks[
                                              grp->bb_largest_free_order]);
                list_del_init(&grp->bb_largest_free_order_node);
                write_unlock(&sbi->s_mb_largest_free_orders_locks[
                                              grp->bb_largest_free_order]);
        }
-       grp->bb_largest_free_order = -1; /* uninit */
-
-       for (i = MB_NUM_ORDERS(sb) - 1; i >= 0; i--) {
-               if (grp->bb_counters[i] > 0) {
-                       grp->bb_largest_free_order = i;
-                       break;
-               }
-       }
-       if (test_opt2(sb, MB_OPTIMIZE_SCAN) &&
-           grp->bb_largest_free_order >= 0 && grp->bb_free) {
+       grp->bb_largest_free_order = i;
+       if (grp->bb_largest_free_order >= 0 && grp->bb_free) {
                write_lock(&sbi->s_mb_largest_free_orders_locks[
                                              grp->bb_largest_free_order]);
                list_add_tail(&grp->bb_largest_free_order_node,