[PATCH v2] btrfs: Fix avail_in bytes for s390 zlib HW compression path

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

 



Since the input data length passed to zlib_compress_folios() can be
arbitrary, always setting strm.avail_in to a multiple of PAGE_SIZE may
cause read-in bytes to exceed the input range. Currently this triggers
an assert in btrfs_compress_folios() on the debug kernel (see below).
Fix strm.avail_in calculation for S390 hardware acceleration path.

 assertion failed: *total_in <= orig_len, in fs/btrfs/compression.c:1041
 ------------[ cut here ]------------
 kernel BUG at fs/btrfs/compression.c:1041!
 monitor event: 0040 ilc:2 [#1] PREEMPT SMP
 CPU: 16 UID: 0 PID: 325 Comm: kworker/u273:3 Not tainted 6.13.0-20241204.rc1.git6.fae3b21430ca.300.fc41.s390x+debug #1
 Hardware name: IBM 3931 A01 703 (z/VM 7.4.0)
 Workqueue: btrfs-delalloc btrfs_work_helper
 Krnl PSW : 0704d00180000000 0000021761df6538 (btrfs_compress_folios+0x198/0x1a0)
            R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:1 PM:0 RI:0 EA:3
 Krnl GPRS: 0000000080000000 0000000000000001 0000000000000047 0000000000000000
            0000000000000006 ffffff01757bb000 000001976232fcc0 000000000000130c
            000001976232fcd0 000001976232fcc8 00000118ff4a0e30 0000000000000001
            00000111821ab400 0000011100000000 0000021761df6534 000001976232fb58
 Krnl Code: 0000021761df6528: c020006f5ef4        larl    %r2,0000021762be2310
            0000021761df652e: c0e5ffbd09d5        brasl   %r14,00000217615978d8
           #0000021761df6534: af000000            mc      0,0
           >0000021761df6538: 0707                bcr     0,%r7
            0000021761df653a: 0707                bcr     0,%r7
            0000021761df653c: 0707                bcr     0,%r7
            0000021761df653e: 0707                bcr     0,%r7
            0000021761df6540: c004004bb7ec        brcl    0,000002176276d518
 Call Trace:
  [<0000021761df6538>] btrfs_compress_folios+0x198/0x1a0
 ([<0000021761df6534>] btrfs_compress_folios+0x194/0x1a0)
  [<0000021761d97788>] compress_file_range+0x3b8/0x6d0
  [<0000021761dcee7c>] btrfs_work_helper+0x10c/0x160
  [<0000021761645760>] process_one_work+0x2b0/0x5d0
  [<000002176164637e>] worker_thread+0x20e/0x3e0
  [<000002176165221a>] kthread+0x15a/0x170
  [<00000217615b859c>] __ret_from_fork+0x3c/0x60
  [<00000217626e72d2>] ret_from_fork+0xa/0x38
 INFO: lockdep is turned off.
 Last Breaking-Event-Address:
  [<0000021761597924>] _printk+0x4c/0x58
 Kernel panic - not syncing: Fatal exception: panic_on_oops

Fixes: fd1e75d0105d ("btrfs: make compression path to be subpage compatible")
Signed-off-by: Mikhail Zaslonko <zaslonko@xxxxxxxxxxxxx>
Acked-by: Ilya Leoshkevich <iii@xxxxxxxxxxxxx>
Reviewed-by: Qu Wenruo <wqu@xxxxxxxx>
---
 fs/btrfs/zlib.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Changes since v1
----------------
Call Trace added to the commit message 

diff --git a/fs/btrfs/zlib.c b/fs/btrfs/zlib.c
index ddf0d5a448a7..c9e92c6941ec 100644
--- a/fs/btrfs/zlib.c
+++ b/fs/btrfs/zlib.c
@@ -174,10 +174,10 @@ int zlib_compress_folios(struct list_head *ws, struct address_space *mapping,
 					copy_page(workspace->buf + i * PAGE_SIZE,
 						  data_in);
 					start += PAGE_SIZE;
-					workspace->strm.avail_in =
-						(in_buf_folios << PAGE_SHIFT);
 				}
 				workspace->strm.next_in = workspace->buf;
+				workspace->strm.avail_in = min(bytes_left,
+							       in_buf_folios << PAGE_SHIFT);
 			} else {
 				unsigned int pg_off;
 				unsigned int cur_len;
-- 
2.45.2





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Kernel Development]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Info]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Linux Media]     [Device Mapper]

  Powered by Linux