original_kernel/fs/erofs
Gao Xiang cc4b2dd95f erofs: fix infinite loop due to a race of filling compressed_bvecs
I encountered a race issue after lengthy (~594647 secs) stress tests on
a 64k-page arm64 VM with several 4k-block EROFS images.  The timing
is like below:

z_erofs_try_inplace_io                  z_erofs_fill_bio_vec
  cmpxchg(&compressed_bvecs[].page,
          NULL, ..)
                                        [access bufvec]
  compressed_bvecs[] = *bvec;

Previously, z_erofs_submit_queue() just accessed bufvec->page only, so
other fields in bufvec didn't matter.  After the subpage block support
is landed, .offset and .end can be used too, but filling bufvec isn't
an atomic operation which can cause inconsistency.

Let's use a spinlock to keep the atomicity of each bufvec.  More
specifically, just reuse the existing spinlock `pcl->obj.lockref.lock`
since it's rarely used (also it takes a short time if even used) as long
as the pcluster has a reference.

Fixes: 192351616a ("erofs: support I/O submission for sub-page compressed blocks")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Yue Hu <huyue2@coolpad.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240125120039.3228103-1-hsiangkao@linux.alibaba.com
2024-01-26 18:07:36 +08:00
..
Kconfig
Makefile
compress.h
data.c
decompressor.c Changes since last update: 2024-01-18 18:12:26 -08:00
decompressor_deflate.c
decompressor_lzma.c
dir.c
erofs_fs.h
fscache.c erofs: get rid of unneeded GFP_NOFS 2024-01-25 11:24:19 +08:00
inode.c erofs: get rid of unneeded GFP_NOFS 2024-01-25 11:24:19 +08:00
internal.h
namei.c
pcpubuf.c
super.c
sysfs.c
utils.c erofs: get rid of unneeded GFP_NOFS 2024-01-25 11:24:19 +08:00
xattr.c
xattr.h
zdata.c erofs: fix infinite loop due to a race of filling compressed_bvecs 2024-01-26 18:07:36 +08:00
zmap.c Changes since last update: 2024-01-18 18:12:26 -08:00