Skip to content

Commit a5d8b9d

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: fix to unlock folio in f2fs_read_data_large_folio()
We missed to unlock folio in error path of f2fs_read_data_large_folio(), fix it. With below testcase, it can reproduce the bug. touch /mnt/f2fs/file truncate -s $((1024*1024*1024)) /mnt/f2fs/file f2fs_io setflags immutable /mnt/f2fs/file sync echo 3 > /proc/sys/vm/drop_caches time dd if=/mnt/f2fs/file of=/dev/null bs=1M count=1024 f2fs_io clearflags immutable /mnt/f2fs/file echo 1 > /proc/sys/vm/drop_caches time dd if=/mnt/f2fs/file of=/dev/null bs=1M count=1024 time dd if=/mnt/f2fs/file of=/dev/null bs=1M count=1024 Signed-off-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent fe15bc3 commit a5d8b9d

1 file changed

Lines changed: 10 additions & 12 deletions

File tree

fs/f2fs/data.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,11 +2453,11 @@ static int f2fs_read_data_large_folio(struct inode *inode,
24532453
int ret = 0;
24542454
bool folio_in_bio;
24552455

2456-
if (!IS_IMMUTABLE(inode))
2457-
return -EOPNOTSUPP;
2458-
2459-
if (f2fs_compressed_file(inode))
2456+
if (!IS_IMMUTABLE(inode) || f2fs_compressed_file(inode)) {
2457+
if (folio)
2458+
folio_unlock(folio);
24602459
return -EOPNOTSUPP;
2460+
}
24612461

24622462
map.m_seg_type = NO_CHECK_TYPE;
24632463

@@ -2565,18 +2565,16 @@ static int f2fs_read_data_large_folio(struct inode *inode,
25652565
last_block_in_bio = block_nr;
25662566
}
25672567
trace_f2fs_read_folio(folio, DATA);
2568+
err_out:
2569+
if (!folio_in_bio) {
2570+
folio_end_read(folio, !ret);
2571+
if (ret)
2572+
return ret;
2573+
}
25682574
if (rac) {
2569-
if (!folio_in_bio)
2570-
folio_end_read(folio, true);
25712575
folio = readahead_folio(rac);
25722576
goto next_folio;
25732577
}
2574-
err_out:
2575-
/* Nothing was submitted. */
2576-
if (!bio) {
2577-
folio_end_read(folio, !ret);
2578-
return ret;
2579-
}
25802578
out:
25812579
f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
25822580
if (ret) {

0 commit comments

Comments
 (0)