FAILED: patch "[PATCH] zram: set default primary compressor in zram_destroy_comps()" failed to apply to 6.18-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x dde75313eed0b014c437f48dd75c0308b592cbf9
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090323-dreamboat-stable-993d@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From dde75313eed0b014c437f48dd75c0308b592cbf9 Mon Sep 17 00:00:00 2001
From: Sergey Senozhatsky <[email protected]>
Date: Wed, 29 Jul 2026 13:57:35 +0900
Subject: [PATCH] zram: set default primary compressor in zram_destroy_comps()
Patch series "zram: fix zram issues reported by sashiko".
Sashiko drove by and reported [1] a couple of zram issues:
a possible BUG_ON() in zlib code due to missing winbits range validation and one possible NULL-ptr dereference in zcomp. Both are low risk yet still worth fixing.
This patch (of 2):
zram_destroy_comps() resets all compressors and leaves them set to NULL, including the primary one, which is invalid device state, as now comp_algorithm_show()->strcmp() can be called on a NULL compressor. Set default primary compressor in zram_destroy_comps().
drivers/block/zram/zram_drv.c +1 -2
@@ -2828,6 +2828,7 @@ static void zram_destroy_comps(struct zram *zram) zram->comp_algs[prio] =NULL ;zram_comp_params_reset (zram); +comp_algorithm_set (zram,ZRAM_PRIMARY_COMP , default_compressor); }static void zram_reset_device (struct zram *zram)
@@ -2845,8 +2846,6 @@ static void zram_reset_device(struct zram *zram)zram_destroy_comps (zram);memset (&zram->stats,0 ,sizeof (zram->stats));reset_bdev (zram); - -comp_algorithm_set (zram,ZRAM_PRIMARY_COMP , default_compressor); } static ssize_t disksize_store(struct device *dev, struct device_attribute *attr,
Sasha Levin
maintainerPATCH 1/5 zram: take write lock in wb limit store handlers
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit 7c929664fddfdaaa4afe5ae833d0f3044709d95c ]
Write device attrs handlers should take write zram init_lock. While at it, fixup coding styles.
Stable-dep-of: dde75313eed0 ("zram: set default primary compressor in zram_destroy_comps()")
--- drivers/block/zram/zram_drv.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/block/zram/zram_drv.c +10 -7
@@ -501,7 +501,8 @@ static ssize_t idle_store(struct device *dev,#ifdef CONFIG_ZRAM_WRITEBACK static ssize_t writeback_limit_enable_store (struct device *dev, -struct device_attribute *attr,const char *buf,size_t len) +struct device_attribute *attr, +const char *buf,size_t len) {struct zram *zram =dev_to_zram (dev);u64 val;
@@ -510,18 +511,19 @@ static ssize_t writeback_limit_enable_store(struct device *dev,if (kstrtoull (buf,10 , &val))return ret; -down_read (&zram->init_lock); +down_write (&zram->init_lock);spin_lock (&zram->wb_limit_lock); zram->wb_limit_enable = val;spin_unlock (&zram->wb_limit_lock); -up_read (&zram->init_lock); +up_write (&zram->init_lock); ret = len;return ret; }static ssize_t writeback_limit_enable_show (struct device *dev, -struct device_attribute *attr,char *buf) +struct device_attribute *attr, +char *buf) {bool val;struct zram *zram =dev_to_zram (dev);
@@ -536,7 +538,8 @@ static ssize_t writeback_limit_enable_show(struct device *dev, }static ssize_t writeback_limit_store (struct device *dev, -struct device_attribute *attr,const char *buf,size_t len) +struct device_attribute *attr, +const char *buf,size_t len) {struct zram *zram =dev_to_zram (dev);u64 val;
@@ -545,11 +548,11 @@ static ssize_t writeback_limit_store(struct device *dev,if (kstrtoull (buf,10 , &val))return ret; -down_read (&zram->init_lock); +down_write (&zram->init_lock);spin_lock (&zram->wb_limit_lock); zram->bd_wb_limit = val;spin_unlock (&zram->wb_limit_lock); -up_read (&zram->init_lock); +up_write (&zram->init_lock); ret = len;return ret;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/5 zram: drop wb_limit_lock
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit a4f506c569e1320c2db4a32955e47961fcf02b05 ]
We don't need wb_limit_lock. Writeback limit setters take an exclusive write zram init_lock, while wb_limit modifications happen only from a single task and under zram read init_lock. No concurrent wb_limit modifications are possible (we permit only one post-processing task at a time). Add lockdep assertions to wb_limit mutators.
While at it, fixup coding styles.
Stable-dep-of: dde75313eed0 ("zram: set default primary compressor in zram_destroy_comps()")
--- drivers/block/zram/zram_drv.c | 23 ++++------------------- drivers/block/zram/zram_drv.h | 1 - 2 files changed, 4 insertions(+), 20 deletions(-)
drivers/block/zram/zram_drv.c +4 -19
@@ -512,9 +512,7 @@ static ssize_t writeback_limit_enable_store(struct device *dev,return ret;down_write (&zram->init_lock); -spin_lock (&zram->wb_limit_lock); zram->wb_limit_enable = val; -spin_unlock (&zram->wb_limit_lock);up_write (&zram->init_lock); ret = len;
@@ -529,9 +527,7 @@ static ssize_t writeback_limit_enable_show(struct device *dev,struct zram *zram =dev_to_zram (dev);down_read (&zram->init_lock); -spin_lock (&zram->wb_limit_lock); val = zram->wb_limit_enable; -spin_unlock (&zram->wb_limit_lock);up_read (&zram->init_lock);return sysfs_emit (buf,"%d\n" , val);
@@ -549,9 +545,7 @@ static ssize_t writeback_limit_store(struct device *dev,return ret;down_write (&zram->init_lock); -spin_lock (&zram->wb_limit_lock); zram->bd_wb_limit = val; -spin_unlock (&zram->wb_limit_lock);up_write (&zram->init_lock); ret = len;
@@ -559,15 +553,13 @@ static ssize_t writeback_limit_store(struct device *dev, }static ssize_t writeback_limit_show (struct device *dev, -struct device_attribute *attr,char *buf) +struct device_attribute *attr,char *buf) {u64 val;struct zram *zram =dev_to_zram (dev);down_read (&zram->init_lock); -spin_lock (&zram->wb_limit_lock); val = zram->bd_wb_limit; -spin_unlock (&zram->wb_limit_lock);up_read (&zram->init_lock);return sysfs_emit (buf,"%llu\n" , val);
@@ -747,18 +739,17 @@ static int zram_writeback_slots(struct zram *zram, struct zram_pp_ctl *ctl)int ret =0 , err;u32 index; +lockdep_assert_held_read (&zram->init_lock); + page =alloc_page (GFP_KERNEL );if (!page)return -ENOMEM ;while ((pps =select_pp_slot (ctl))) { -spin_lock (&zram->wb_limit_lock);if (zram->wb_limit_enable && !zram->bd_wb_limit) { -spin_unlock (&zram->wb_limit_lock); ret = -EIO ;break ; } -spin_unlock (&zram->wb_limit_lock);if (!blk_idx) { blk_idx =alloc_block_bdev (zram);
@@ -824,10 +815,8 @@ static int zram_writeback_slots(struct zram *zram, struct zram_pp_ctl *ctl)zram_set_handle (zram, index, blk_idx); blk_idx =0 ;atomic64_inc (&zram->stats.pages_stored); -spin_lock (&zram->wb_limit_lock);if (zram->wb_limit_enable && zram->bd_wb_limit >0 ) zram->bd_wb_limit -=1UL << (PAGE_SHIFT -12 ); -spin_unlock (&zram->wb_limit_lock); next:zram_slot_unlock (zram, index);release_pp_slot (zram, pps);
@@ -2467,7 +2456,7 @@ static void zram_destroy_comps(struct zram *zram)static void zram_reset_device (struct zram *zram) { -down_write (&zram->init_lock); +guard (rwsem_write)(&zram->init_lock); zram->limit_pages =0 ;
@@ -2483,7 +2472,6 @@ static void zram_reset_device(struct zram *zram)reset_bdev (zram);comp_algorithm_set (zram,ZRAM_PRIMARY_COMP , default_compressor); -up_write (&zram->init_lock); } static ssize_t disksize_store(struct device *dev,
@@ -2695,9 +2683,6 @@ static int zram_add(void) device_id = ret;init_rwsem (&zram->init_lock); -#ifdef CONFIG_ZRAM_WRITEBACK -spin_lock_init (&zram->wb_limit_lock); -#endif /* gendisk structure */ zram->disk =blk_alloc_disk (&lim,NUMA_NO_NODE );
drivers/block/zram/zram_drv.h +0 -1
@@ -127,7 +127,6 @@ struct zram {bool claim;/* Protected by disk->open_mutex */ #ifdef CONFIG_ZRAM_WRITEBACK struct file *backing_dev; -spinlock_t wb_limit_lock;bool wb_limit_enable;u64 bd_wb_limit;struct block_device *bdev;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/5 zram: read slot block idx under slot lock
In reply to Sasha LevinFrom: Sergey Senozhatsky <[email protected]>
[ Upstream commit 1b1a4e4d6797a57fefa40569fc920ce573bbf75b ]
Read slot's block id under slot-lock. We release the slot-lock for bdev read so, technically, slot still can get freed in the meantime, but at least we will read bdev block (page) that holds previous know slot data, not from slot->handle bdev block, which can be anything at that point.
Stable-dep-of: dde75313eed0 ("zram: set default primary compressor in zram_destroy_comps()")
--- drivers/block/zram/zram_drv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/block/zram/zram_drv.c +3 -3
@@ -1732,14 +1732,14 @@ static int zram_read_page(struct zram *zram, struct page *page, u32 index, ret =zram_read_from_zspool (zram, page, index);zram_slot_unlock (zram, index); }else { +unsigned long blk_idx =zram_get_handle (zram, index); +/* * The slot should be unlocked before reading from the backing * device. */ zram_slot_unlock (zram, index); - - ret =read_from_bdev (zram, page,zram_get_handle (zram, index), - parent); + ret =read_from_bdev (zram, page, blk_idx, parent); }/* Should NEVER happen. Return bio error if it does. */
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/5 zram: fix the issue that the write - back limits might overflow
In reply to Sasha LevinFrom: Yuwen Chen <[email protected]>
[ Upstream commit 04d31610a7221cca624646241b1f6b3edd6c99fd ]
When the page size exceeds 4KB, if bd_wb_limit is set to a value that is not aligned with the page size, it will cause a numerical wrap-around issue for bd_wb_limit. For example, when the page size is set to 16KB and bd_wb_limit is set to 3, after one write-back operation, the value of bd_wb_limit will become -1. More seriously, since bd_wb_limit is an unsigned number, its value may become as large as 2^64 - 1.
The core reason for this problem is that the unit of bd_wb_limit is 4KB. For example, when a write-back occurs on a system with a page size of 16KB, 4 needs to be subtracted from bd_wb_limit. This operation takes place in the zram_account_writeback_submit function.
This patch fixes the issue by limiting bd_wb_limit to be an integer multiple of PAGE_SIZE / 4096.
Stable-dep-of: dde75313eed0 ("zram: set default primary compressor in zram_destroy_comps()")
--- drivers/block/zram/zram_drv.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/block/zram/zram_drv.c +10 -0
@@ -544,6 +544,16 @@ static ssize_t writeback_limit_store(struct device *dev,if (kstrtoull (buf,10 , &val))return ret; +/* +* When the page size is greater than 4KB, if bd_wb_limit is set to +* a value that is not page - size aligned, it will cause value +* wrapping. For example, when the page size is set to 16KB and +* bd_wb_limit is set to 3, a single write - back operation will +* cause bd_wb_limit to become -1. Even more terrifying is that +* bd_wb_limit is an unsigned number. +*/ + val =rounddown (val,PAGE_SIZE /4096 ); +down_write (&zram->init_lock); zram->bd_wb_limit = val;up_write (&zram->init_lock);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 5/5 zram: set default primary compressor in zram_destroy_comps()
In reply to Sasha LevinFrom: Sergey Senozhatsky <[email protected]>
[ Upstream commit dde75313eed0b014c437f48dd75c0308b592cbf9 ]
Patch series "zram: fix zram issues reported by sashiko".
Sashiko drove by and reported [1] a couple of zram issues:
a possible BUG_ON() in zlib code due to missing winbits range validation and one possible NULL-ptr dereference in zcomp. Both are low risk yet still worth fixing.
This patch (of 2):
zram_destroy_comps() resets all compressors and leaves them set to NULL, including the primary one, which is invalid device state, as now comp_algorithm_show()->strcmp() can be called on a NULL compressor. Set default primary compressor in zram_destroy_comps().
--- drivers/block/zram/zram_drv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/block/zram/zram_drv.c +1 -2
@@ -2462,6 +2462,7 @@ static void zram_destroy_comps(struct zram *zram) }zram_comp_params_reset (zram); +comp_algorithm_set (zram,ZRAM_PRIMARY_COMP , default_compressor); }static void zram_reset_device (struct zram *zram)
@@ -2480,8 +2481,6 @@ static void zram_reset_device(struct zram *zram)memset (&zram->stats,0 ,sizeof (zram->stats));atomic_set (&zram->pp_in_progress,0 );reset_bdev (zram); - -comp_algorithm_set (zram,ZRAM_PRIMARY_COMP , default_compressor); } static ssize_t disksize_store(struct device *dev,
Signature · 1 line
2.53.0