Patch "ext4: fix dead loop in ext4_mb_new_blocks" has been added to the 5.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ext4: fix dead loop in ext4_mb_new_blocks

to the 5.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ext4-fix-dead-loop-in-ext4_mb_new_blocks.patch
and it can be found in the queue-5.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6e2d9385db271ed7e66a21ee7d6e76173fca6221
Author: Ye Bin <yebin10@xxxxxxxxxx>
Date:   Wed Sep 16 19:38:59 2020 +0800

    ext4: fix dead loop in ext4_mb_new_blocks
    
    [ Upstream commit 70022da804f0f3f152115688885608c39182082e ]
    
    As we test disk offline/online with running fsstress, we find fsstress
    process is keeping running state.
    kworker/u32:3-262   [004] ...1   140.787471: ext4_mb_discard_preallocations: dev 8,32 needed 114
    ....
    kworker/u32:3-262   [004] ...1   140.787471: ext4_mb_discard_preallocations: dev 8,32 needed 114
    
    ext4_mb_new_blocks
    repeat:
            ext4_mb_discard_preallocations_should_retry(sb, ac, &seq)
                    freed = ext4_mb_discard_preallocations
                            ext4_mb_discard_group_preallocations
                                    this_cpu_inc(discard_pa_seq);
                    ---> freed == 0
                    seq_retry = ext4_get_discard_pa_seq_sum
                            for_each_possible_cpu(__cpu)
                                    __seq += per_cpu(discard_pa_seq, __cpu);
                    if (seq_retry != *seq) {
                            *seq = seq_retry;
                            ret = true;
                    }
    
    As we see seq_retry is sum of discard_pa_seq every cpu, if
    ext4_mb_discard_group_preallocations return zero discard_pa_seq in this
    cpu maybe increase one, so condition "seq_retry != *seq" have always
    been met.
    Ritesh Harjani suggest to in ext4_mb_discard_group_preallocations function we
    only increase discard_pa_seq when there is some PA to free.
    
    Fixes: 07b5b8e1ac40 ("ext4: mballoc: introduce pcpu seqcnt for freeing PA to improve ENOSPC handling")
    Signed-off-by: Ye Bin <yebin10@xxxxxxxxxx>
    Reviewed-by: Jan Kara <jack@xxxxxxx>
    Reviewed-by: Ritesh Harjani <riteshh@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20200916113859.1556397-3-yebin10@xxxxxxxxxx
    Signed-off-by: Theodore Ts'o <tytso@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 132c118d12e15..ff47347012f4b 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -4189,7 +4189,6 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
 	INIT_LIST_HEAD(&list);
 repeat:
 	ext4_lock_group(sb, group);
-	this_cpu_inc(discard_pa_seq);
 	list_for_each_entry_safe(pa, tmp,
 				&grp->bb_prealloc_list, pa_group_list) {
 		spin_lock(&pa->pa_lock);
@@ -4206,6 +4205,9 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
 		/* seems this one can be freed ... */
 		ext4_mb_mark_pa_deleted(sb, pa);
 
+		if (!free)
+			this_cpu_inc(discard_pa_seq);
+
 		/* we can trust pa_free ... */
 		free += pa->pa_free;
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux