ext4: mballoc: add blocks to PA list under same spinlock after allocating blocks
authorRitesh Harjani <riteshh@linux.ibm.com>
Wed, 20 May 2020 06:40:32 +0000 (12:10 +0530)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 4 Jun 2020 03:16:53 +0000 (23:16 -0400)
commit53f86b170dfa8d50b8b3fb1c5cf17c33b2327db2
treed76dec5a659413307ebc463bdc4922d101071fdf
parentde8ff14cab998f51a3a289d2b58d6d440782f77e
ext4: mballoc: add blocks to PA list under same spinlock after allocating blocks

ext4_mb_discard_preallocations() only checks for grp->bb_prealloc_list
of every group to discard the group's PA to free up the space if
allocation request fails. Consider below race:-

Process A   Process B

1. allocate blocks
1. Fails block allocation from
     ext4_mb_regular_allocator()
   ext4_lock_group()
allocated blocks
more than ac_o_ex.fe_len
   ext4_unlock_group()
2. Scans the
   grp->bb_prealloc_list (under
   ext4_lock_group()) and
   find nothing and thus return
   -ENOSPC.

2. Add the additional blocks to PA list

   ext4_lock_group()
    add blocks to grp->bb_prealloc_list
   ext4_unlock_group()

Above race could be avoided if we add those additional blocks to
grp->bb_prealloc_list at the same time with block allocation when
ext4_lock_group() was still held.
With this discard-PA will know if there are actually any blocks which
could be freed from the PA

Signed-off-by: Ritesh Harjani <riteshh@linux.ibm.com>
Link: https://lore.kernel.org/r/a2217dd782585b42328981832e6d396abaaccb80.1589955723.git.riteshh@linux.ibm.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/mballoc.c