Patch "f2fs: fix scheduling while atomic in decompression path" has been added to the 6.2-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

    f2fs: fix scheduling while atomic in decompression path

to the 6.2-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:
     f2fs-fix-scheduling-while-atomic-in-decompression-pa.patch
and it can be found in the queue-6.2 subdirectory.

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



commit 55053c0308b588f66503c18e7980d3ac94bc9613
Author: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
Date:   Thu Mar 23 15:37:54 2023 -0700

    f2fs: fix scheduling while atomic in decompression path
    
    [ Upstream commit 1aa161e43106d46ca8e9a86f4aa28d420258134b ]
    
    [   16.945668][    C0] Call trace:
    [   16.945678][    C0]  dump_backtrace+0x110/0x204
    [   16.945706][    C0]  dump_stack_lvl+0x84/0xbc
    [   16.945735][    C0]  __schedule_bug+0xb8/0x1ac
    [   16.945756][    C0]  __schedule+0x724/0xbdc
    [   16.945778][    C0]  schedule+0x154/0x258
    [   16.945793][    C0]  bit_wait_io+0x48/0xa4
    [   16.945808][    C0]  out_of_line_wait_on_bit+0x114/0x198
    [   16.945824][    C0]  __sync_dirty_buffer+0x1f8/0x2e8
    [   16.945853][    C0]  __f2fs_commit_super+0x140/0x1f4
    [   16.945881][    C0]  f2fs_commit_super+0x110/0x28c
    [   16.945898][    C0]  f2fs_handle_error+0x1f4/0x2f4
    [   16.945917][    C0]  f2fs_decompress_cluster+0xc4/0x450
    [   16.945942][    C0]  f2fs_end_read_compressed_page+0xc0/0xfc
    [   16.945959][    C0]  f2fs_handle_step_decompress+0x118/0x1cc
    [   16.945978][    C0]  f2fs_read_end_io+0x168/0x2b0
    [   16.945993][    C0]  bio_endio+0x25c/0x2c8
    [   16.946015][    C0]  dm_io_dec_pending+0x3e8/0x57c
    [   16.946052][    C0]  clone_endio+0x134/0x254
    [   16.946069][    C0]  bio_endio+0x25c/0x2c8
    [   16.946084][    C0]  blk_update_request+0x1d4/0x478
    [   16.946103][    C0]  scsi_end_request+0x38/0x4cc
    [   16.946129][    C0]  scsi_io_completion+0x94/0x184
    [   16.946147][    C0]  scsi_finish_command+0xe8/0x154
    [   16.946164][    C0]  scsi_complete+0x90/0x1d8
    [   16.946181][    C0]  blk_done_softirq+0xa4/0x11c
    [   16.946198][    C0]  _stext+0x184/0x614
    [   16.946214][    C0]  __irq_exit_rcu+0x78/0x144
    [   16.946234][    C0]  handle_domain_irq+0xd4/0x154
    [   16.946260][    C0]  gic_handle_irq.33881+0x5c/0x27c
    [   16.946281][    C0]  call_on_irq_stack+0x40/0x70
    [   16.946298][    C0]  do_interrupt_handler+0x48/0xa4
    [   16.946313][    C0]  el1_interrupt+0x38/0x68
    [   16.946346][    C0]  el1h_64_irq_handler+0x20/0x30
    [   16.946362][    C0]  el1h_64_irq+0x78/0x7c
    [   16.946377][    C0]  finish_task_switch+0xc8/0x3d8
    [   16.946394][    C0]  __schedule+0x600/0xbdc
    [   16.946408][    C0]  preempt_schedule_common+0x34/0x5c
    [   16.946423][    C0]  preempt_schedule+0x44/0x48
    [   16.946438][    C0]  process_one_work+0x30c/0x550
    [   16.946456][    C0]  worker_thread+0x414/0x8bc
    [   16.946472][    C0]  kthread+0x16c/0x1e0
    [   16.946486][    C0]  ret_from_fork+0x10/0x20
    
    Fixes: bff139b49d9f ("f2fs: handle decompress only post processing in softirq")
    Fixes: 95fa90c9e5a7 ("f2fs: support recording errors into superblock")
    Reviewed-by: Chao Yu <chao@xxxxxxxxxx>
    Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
index 2628c347f44fd..07c96fea76fe1 100644
--- a/fs/f2fs/compress.c
+++ b/fs/f2fs/compress.c
@@ -759,7 +759,12 @@ void f2fs_decompress_cluster(struct decompress_io_ctx *dic, bool in_task)
 
 	if (dic->clen > PAGE_SIZE * dic->nr_cpages - COMPRESS_HEADER_SIZE) {
 		ret = -EFSCORRUPTED;
-		f2fs_handle_error(sbi, ERROR_FAIL_DECOMPRESSION);
+
+		/* Avoid f2fs_commit_super in irq context */
+		if (in_task)
+			f2fs_save_errors(sbi, ERROR_FAIL_DECOMPRESSION);
+		else
+			f2fs_handle_error(sbi, ERROR_FAIL_DECOMPRESSION);
 		goto out_release;
 	}
 
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index e8953c3dc81ab..42962ee0a1179 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -3576,6 +3576,7 @@ int f2fs_quota_sync(struct super_block *sb, int type);
 loff_t max_file_blocks(struct inode *inode);
 void f2fs_quota_off_umount(struct super_block *sb);
 void f2fs_handle_stop(struct f2fs_sb_info *sbi, unsigned char reason);
+void f2fs_save_errors(struct f2fs_sb_info *sbi, unsigned char flag);
 void f2fs_handle_error(struct f2fs_sb_info *sbi, unsigned char error);
 int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover);
 int f2fs_sync_fs(struct super_block *sb, int sync);
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 551468dad3275..3711445a2489b 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -3895,7 +3895,7 @@ void f2fs_handle_stop(struct f2fs_sb_info *sbi, unsigned char reason)
 	f2fs_up_write(&sbi->sb_lock);
 }
 
-static void f2fs_save_errors(struct f2fs_sb_info *sbi, unsigned char flag)
+void f2fs_save_errors(struct f2fs_sb_info *sbi, unsigned char flag)
 {
 	spin_lock(&sbi->error_lock);
 	if (!test_bit(flag, (unsigned long *)sbi->errors)) {



[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