6.12.63-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 290/354 9p: fix cache/debug options printing in v9fs_show_options
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Sandeen <[email protected]>
[ Upstream commit f0445613314f474c1a0ec6fa8a5cd153a618f1b6 ]
commit 4eb3117888a92 changed the cache= option to accept either string shortcuts or bitfield values. It also changed /proc/mounts to emit the option as the hexadecimal numeric value rather than the shortcut string.
However, by printing "cache=%x" without the leading 0x, shortcuts such as "cache=loose" will emit "cache=f" and 'f' is not a string that is parseable by kstrtoint(), so remounting may fail if a remount with "cache=f" is attempted.
debug=%x has had the same problem since options have been displayed in c4fac9100456 ("9p: Implement show_options")
Fix these by adding the 0x prefix to the hexadecimal value shown in /proc/mounts.
Message-ID: <[email protected]>
--- fs/9p/v9fs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/9p/v9fs.c +2 -2
@@ -101,7 +101,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry *root)struct v9fs_session_info *v9ses = root->d_sb->s_fs_info;if (v9ses->debug) -seq_printf (m,",debug=%x" , v9ses->debug); +seq_printf (m,",debug=%#x" , v9ses->debug);if (!uid_eq (v9ses->dfltuid,V9FS_DEFUID ))seq_printf (m,",dfltuid=%u" ,from_kuid_munged (&init_user_ns, v9ses->dfltuid));
@@ -117,7 +117,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry *root)if (v9ses->nodev)seq_puts (m,",nodevmap" );if (v9ses->cache) -seq_printf (m,",cache=%x" , v9ses->cache); +seq_printf (m,",cache=%#x" , v9ses->cache);#ifdef CONFIG_9P_FSCACHE if (v9ses->cachetag && (v9ses->cache &CACHE_FSCACHE ))seq_printf (m,",cachetag=%s" , v9ses->cachetag);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 291/354 sched/fair: Fix unfairness caused by stalled tg_load_avg_contrib when the last task migrates out
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: xupengbo <[email protected]>
[ Upstream commit ca125231dd29fc0678dd3622e9cdea80a51dffe4 ]
When a task is migrated out, there is a probability that the tg->load_avg value will become abnormal. The reason is as follows:
1. Due to the 1ms update period limitation in update_tg_load_avg(), there is a possibility that the reduced load_avg is not updated to tg->load_avg when a task migrates out.
2. Even though __update_blocked_fair() traverses the leaf_cfs_rq_list and calls update_tg_load_avg() for cfs_rqs that are not fully decayed, the key function cfs_rq_is_decayed() does not check whether cfs->tg_load_avg_contrib is null. Consequently, in some cases, __update_blocked_fair() removes cfs_rqs whose avg.load_avg has not been updated to tg->load_avg.
Add a check of cfs_rq->tg_load_avg_contrib in cfs_rq_is_decayed(), which fixes the case (2.) mentioned above.
--- kernel/sched/fair.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/sched/fair.c +3 -0
@@ -4198,6 +4198,9 @@ static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq)if (child_cfs_rq_on_list (cfs_rq))return false; +if (cfs_rq->tg_load_avg_contrib) +return false; +return true; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 292/354 platform/x86:intel/pmc: Update Arrow Lake telemetry GUID
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xi Pardee <[email protected]>
[ Upstream commit 644ab3bc98ee386f178d5209ae8170b3fac591aa ]
Update ARL_PMT_DMU_GUID value. Arrow Lake PMT DMU GUID has been updated after it was add to the driver. This updates ensures that the die C6 value is available in the debug filesystem.
Bugzilla Link: https://bugzilla.kernel.org/show_bug.cgi?id=220421
--- drivers/platform/x86/intel/pmc/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/intel/pmc/core.h +1 -1
@@ -277,7 +277,7 @@ enum ppfear_regs {/* Die C6 from PUNIT telemetry */ #define MTL_PMT_DMU_DIE_C6_OFFSET 15#define MTL_PMT_DMU_GUID 0x1A067102 -#define ARL_PMT_DMU_GUID 0x1A06A000 +#define ARL_PMT_DMU_GUID 0x1A06A102#define LNL_PMC_MMIO_REG_LEN 0x2708#define LNL_PMC_LTR_OSSE 0x1B88
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 293/354 f2fs: keep POSIX_FADV_NOREUSE ranges
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit ef0c333cad8d1940f132a7ce15f15920216a3bd5 ]
This patch records POSIX_FADV_NOREUSE ranges for users to reclaim the caches instantly off from LRU.
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- fs/f2fs/debug.c | 3 +++ fs/f2fs/f2fs.h | 12 +++++++++- fs/f2fs/file.c | 60 ++++++++++++++++++++++++++++++++++++++++++++----- fs/f2fs/inode.c | 14 ++++++++++++ fs/f2fs/super.c | 1 + 5 files changed, 84 insertions(+), 6 deletions(-)
fs/f2fs/debug.c +3 -0
@@ -100,6 +100,7 @@ static void update_general_status(struct f2fs_sb_info *sbi) si->ndirty_imeta =get_pages (sbi,F2FS_DIRTY_IMETA ); si->ndirty_dirs = sbi->ndirty_inode[DIR_INODE ]; si->ndirty_files = sbi->ndirty_inode[FILE_INODE ]; + si->ndonate_files = sbi->donate_files; si->nquota_files = sbi->nquota_files; si->ndirty_all = sbi->ndirty_inode[DIRTY_META ]; si->aw_cnt =atomic_read (&sbi->atomic_files);
@@ -435,6 +436,8 @@ static int stat_show(struct seq_file *s, void *v) si->compr_inode, si->compr_blocks);seq_printf (s," - Swapfile Inode: %u\n" , si->swapfile_inode); +seq_printf (s," - Donate Inode: %u\n" , + si->ndonate_files);seq_printf (s," - Orphan/Append/Update Inode: %u, %u, %u\n" , si->orphans, si->append, si->update); seq_printf(s, "\nMain area: %d segs, %d secs %d zones\n",
fs/f2fs/f2fs.h +11 -1
@@ -849,6 +849,11 @@ struct f2fs_inode_info {#endif struct list_head dirty_list;/* dirty list for dirs and files */ struct list_head gdirty_list;/* linked in global dirty list */ + +/* linked in global inode list for cache donation */ +struct list_head gdonate_list; +pgoff_t donate_start, donate_end;/* inclusive */ +struct task_struct *atomic_write_task;/* store atomic write task */ struct extent_tree *extent_tree[NR_EXTENT_CACHES ];/* cached extent_tree entry */
@@ -1274,6 +1279,7 @@ enum inode_type {DIR_INODE ,/* for dirty dir inode */ FILE_INODE ,/* for dirty regular/symlink inode */ DIRTY_META ,/* for all dirtied inode metadata */ +DONATE_INODE ,/* for all inode to donate pages */ NR_INODE_TYPE, };
@@ -1629,6 +1635,9 @@ struct f2fs_sb_info {unsigned int warm_data_age_threshold;unsigned int last_age_weight; +/* control donate caches */ +unsigned int donate_files; +/* basic filesystem units */ unsigned int log_sectors_per_block;/* log2 sectors per block */ unsigned int log_blocksize;/* log2 block size */
@@ -3997,7 +4006,8 @@ struct f2fs_stat_info {unsigned long long allocated_data_blocks;int ndirty_node, ndirty_dent, ndirty_meta, ndirty_imeta;int ndirty_data, ndirty_qdata; -unsigned int ndirty_dirs, ndirty_files, nquota_files, ndirty_all; +unsigned int ndirty_dirs, ndirty_files, ndirty_all; +unsigned int nquota_files, ndonate_files;int nats, dirty_nats, sits, dirty_sits;int free_nids, avail_nids, alloc_nids;int total_count, utilization;
fs/f2fs/file.c +55 -5
73 lines not on this page · raw message
fs/f2fs/inode.c +14 -0
@@ -807,6 +807,19 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)return 0 ; } +static void f2fs_remove_donate_inode (struct inode *inode) +{ +struct f2fs_sb_info *sbi =F2FS_I_SB (inode); + +if (list_empty (&F2FS_I (inode)->gdonate_list)) +return ; + +spin_lock (&sbi->inode_lock[DONATE_INODE ]); +list_del_init (&F2FS_I (inode)->gdonate_list); + sbi->donate_files--; +spin_unlock (&sbi->inode_lock[DONATE_INODE ]); +} +/* * Called at the last iput() if i_nlink is zero */
@@ -841,6 +854,7 @@ void f2fs_evict_inode(struct inode *inode)f2fs_bug_on (sbi,get_dirty_pages (inode));f2fs_remove_dirty_inode (inode); +f2fs_remove_donate_inode (inode);f2fs_destroy_extent_tree (inode);
fs/f2fs/super.c +1 -0
@@ -1429,6 +1429,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)spin_lock_init (&fi->i_size_lock);INIT_LIST_HEAD (&fi->dirty_list);INIT_LIST_HEAD (&fi->gdirty_list); +INIT_LIST_HEAD (&fi->gdonate_list);init_f2fs_rwsem (&fi->i_gc_rwsem[READ ]);init_f2fs_rwsem (&fi->i_gc_rwsem[WRITE ]);init_f2fs_rwsem (&fi->i_xattr_sem);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 294/354 f2fs: add a sysfs entry to reclaim POSIX_FADV_NOREUSE pages
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit a907f3a68ee26ba493a08a958809208d17f3347e ]
1. fadvise(fd1, POSIX_FADV_NOREUSE, {0,3});
2. fadvise(fd2, POSIX_FADV_NOREUSE, {1,2});
3. fadvise(fd3, POSIX_FADV_NOREUSE, {3,1});
4. echo 1024 > /sys/fs/f2fs/tuning/reclaim_caches_kb
This gives a way to reclaim file-backed pages by iterating all f2fs mounts until reclaiming 1MB page cache ranges, registered by #1, #2, and #3.
5. cat /sys/fs/f2fs/tuning/reclaim_caches_kb
-> gives total number of registered file ranges.
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- Documentation/ABI/testing/sysfs-fs-f2fs | 7 ++ fs/f2fs/f2fs.h | 2 + fs/f2fs/shrinker.c | 90 +++++++++++++++++++++++++ fs/f2fs/sysfs.c | 63 +++++++++++++++++ 4 files changed, 162 insertions(+)
Documentation/ABI/testing/sysfs-fs-f2fs +7 -0
@@ -828,3 +828,10 @@ Date: November 2024 Contact: "Chao Yu" <[email protected]> Description: It controls max read extent count for per-inode, the value of threshold is 10240 by default. + +What: /sys/fs/f2fs/tuning/reclaim_caches_kb +Date: February 2025 +Contact: "Jaegeuk Kim" <[email protected]> +Description: It reclaims the given KBs of file-backed pages registered by + ioctl(F2FS_IOC_DONATE_RANGE). + For example, writing N tries to drop N KBs spaces in LRU.
fs/f2fs/f2fs.h +2 -0
@@ -4271,6 +4271,8 @@ unsigned long f2fs_shrink_count(struct shrinker *shrink, struct shrink_control *sc);unsigned long f2fs_shrink_scan (struct shrinker *shrink,struct shrink_control *sc); +unsigned int f2fs_donate_files (void ); +void f2fs_reclaim_caches (unsigned int reclaim_caches_kb);void f2fs_join_shrinker (struct f2fs_sb_info *sbi);void f2fs_leave_shrinker (struct f2fs_sb_info *sbi);
fs/f2fs/shrinker.c +90 -0
96 lines not on this page · raw message
fs/f2fs/sysfs.c +63 -0
100 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 295/354 f2fs: fix to avoid running out of free segments
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit f7f8932ca6bb22494ef6db671633ad3b4d982271 ]
If checkpoint is disabled, GC can not reclaim any segments, we need to detect such condition and bail out from fallocate() of a pinfile, rather than letting allocator running out of free segment, which may cause f2fs to be shutdown.
reproducer:
mkfs.f2fs -f /dev/vda 16777216
mount -o checkpoint=disable:10% /dev/vda /mnt/f2fs
for ((i=0;i<4096;i++)) do { dd if=/dev/zero of=/mnt/f2fs/$i bs=1M count=1; } done sync
for ((i=0;i<4096;i+=2)) do { rm /mnt/f2fs/$i; } done
sync
touch /mnt/f2fs/pinfilef2fs_io pinfile set /mnt/f2fs/pinfilef2fs_io fallocate 0 0 4201644032 /mnt/f2fs/pinfile
cat /sys/kernel/debug/f2fs/status
output:
- Free: 0 (0)
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- fs/f2fs/file.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
fs/f2fs/file.c +12 -0
@@ -1838,6 +1838,18 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, next_alloc:f2fs_down_write (&sbi->pin_sem); +if (unlikely (is_sbi_flag_set (sbi,SBI_CP_DISABLED ))) { +if (has_not_enough_free_secs (sbi,0 ,0 )) { +f2fs_up_write (&sbi->pin_sem); + err = -ENOSPC ; +f2fs_warn_ratelimited (sbi, +"ino:%lu, start:%lu, end:%lu, need to trigger GC to " +"reclaim enough free segment when checkpoint is enabled" , + inode->i_ino, pg_start, pg_end); + goto out_err; + } + } +if (has_not_enough_free_secs (sbi,0 ,f2fs_sb_has_blkzoned (sbi) ?ZONED_PIN_SEC_REQUIRED_COUNT :GET_SEC_FROM_SEG (sbi,overprovision_segments (sbi)))) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 296/354 f2fs: add carve_out sysfs node
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit d7b549def0eb42a950eebd3bd5343f5c8088c305 ]
For several zoned storage devices, vendors will provide extra space which was used for device level GC than specs and F2FS can use this space for filesystem level GC. To do that, we can reserve the space using reserved_blocks. However, it is not enough, since this extra space should not be shown to users. So, with this new sysfs node, we can hide the space by substracting reserved_blocks from total bytes.
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- Documentation/ABI/testing/sysfs-fs-f2fs | 10 ++++++++++ fs/f2fs/f2fs.h | 3 +++ fs/f2fs/super.c | 3 ++- fs/f2fs/sysfs.c | 2 ++ 4 files changed, 17 insertions(+), 1 deletion(-)
Documentation/ABI/testing/sysfs-fs-f2fs +10 -0
@@ -835,3 +835,13 @@ Contact: "Jaegeuk Kim" <[email protected]> Description: It reclaims the given KBs of file-backed pages registered by ioctl(F2FS_IOC_DONATE_RANGE). For example, writing N tries to drop N KBs spaces in LRU. + +What: /sys/fs/f2fs/<disk>/carve_out +Date: March 2025 +Contact: "Daeho Jeong" <[email protected]> +Description: For several zoned storage devices, vendors will provide extra space which + was used for device level GC than specs and F2FS can use this space for + filesystem level GC. To do that, we can reserve the space using + reserved_blocks. However, it is not enough, since this extra space should + not be shown to users. So, with this new sysfs node, we can hide the space + by substracting reserved_blocks from total bytes.
fs/f2fs/f2fs.h +3 -0
@@ -1813,6 +1813,9 @@ struct f2fs_sb_info {u64 committed_atomic_block;u64 revoked_atomic_block; +/* carve out reserved_blocks from total blocks */ +bool carve_out; +#ifdef CONFIG_F2FS_FS_COMPRESSION struct kmem_cache *page_array_slab;/* page array entry */ unsigned int page_array_slab_size;/* default page array slab size */
fs/f2fs/super.c +2 -1
@@ -1839,7 +1839,8 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = total_count - start_count;spin_lock (&sbi->stat_lock); - +if (sbi->carve_out) + buf->f_blocks -= sbi->current_reserved_blocks; user_block_count = sbi->user_block_count; total_valid_node_count =valid_node_count (sbi); avail_node_count = sbi->total_node_count -F2FS_RESERVED_NODE_NUM ;
fs/f2fs/sysfs.c +2 -0
@@ -1145,6 +1145,7 @@ F2FS_SBI_GENERAL_RW_ATTR(max_read_extent_count);F2FS_SBI_GENERAL_RO_ATTR (unusable_blocks_per_sec);F2FS_SBI_GENERAL_RW_ATTR (blkzone_alloc_policy);#endif +F2FS_SBI_GENERAL_RW_ATTR (carve_out);/* STAT_INFO ATTR */ #ifdef CONFIG_F2FS_STAT_FS
@@ -1332,6 +1333,7 @@ static struct attribute *f2fs_attrs[] = {ATTR_LIST (warm_data_age_threshold),ATTR_LIST (last_age_weight),ATTR_LIST (max_read_extent_count), +ATTR_LIST (carve_out),NULL , };ATTRIBUTE_GROUPS (f2fs);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 297/354 f2fs: sysfs: add encoding_flags entry
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 3fea0641b06ff4e53d95d07a96764d8951d4ced6 ]
This patch adds a new sysfs entry /sys/fs/f2fs/<disk>/encoding_flags, it is a read-only entry to show the value of sb.s_encoding_flags, the value is hexadecimal.
============================ ========== Flag_Name Flag_Value ============================ ========== SB_ENC_STRICT_MODE_FL 0x00000001 SB_ENC_NO_COMPAT_FALLBACK_FL 0x00000002 ============================ ==========
case#1
mkfs.f2fs -f -O casefold -C utf8:strict /dev/vda
mount /dev/vda /mnt/f2fs
cat /sys/fs/f2fs/vda/encoding_flags
1
case#2
mkfs.f2fs -f -O casefold -C utf8 /dev/vda
fsck.f2fs --nolinear-lookup=1 /dev/vda
mount /dev/vda /mnt/f2fs
cat /sys/fs/f2fs/vda/encoding_flags
2
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- Documentation/ABI/testing/sysfs-fs-f2fs | 13 +++++++++++++ fs/f2fs/sysfs.c | 9 +++++++++ 2 files changed, 22 insertions(+)
Documentation/ABI/testing/sysfs-fs-f2fs +13 -0
@@ -845,3 +845,16 @@ Description: For several zoned storage devices, vendors will provide extra space reserved_blocks. However, it is not enough, since this extra space should not be shown to users. So, with this new sysfs node, we can hide the space by substracting reserved_blocks from total bytes. + +What: /sys/fs/f2fs/<disk>/encoding_flags +Date: April 2025 +Contact: "Chao Yu" <[email protected]> +Description: This is a read-only entry to show the value of sb.s_encoding_flags, the + value is hexadecimal. + + ============================ ========== + Flag_Name Flag_Value + ============================ ========== + SB_ENC_STRICT_MODE_FL 0x00000001 + SB_ENC_NO_COMPAT_FALLBACK_FL 0x00000002 + ============================ ==========
fs/f2fs/sysfs.c +9 -0
@@ -274,6 +274,13 @@ static ssize_t encoding_show(struct f2fs_attr *a,return sysfs_emit (buf,"(none)\n" ); } +static ssize_t encoding_flags_show (struct f2fs_attr *a, +struct f2fs_sb_info *sbi,char *buf) +{ +return sysfs_emit (buf,"%x\n" , +le16_to_cpu (F2FS_RAW_SUPER (sbi)->s_encoding_flags)); +} +static ssize_t mounted_time_sec_show (struct f2fs_attr *a,struct f2fs_sb_info *sbi,char *buf) {
@@ -1181,6 +1188,7 @@ F2FS_GENERAL_RO_ATTR(features);F2FS_GENERAL_RO_ATTR (current_reserved_blocks);F2FS_GENERAL_RO_ATTR (unusable);F2FS_GENERAL_RO_ATTR (encoding); +F2FS_GENERAL_RO_ATTR (encoding_flags);F2FS_GENERAL_RO_ATTR (mounted_time_sec);F2FS_GENERAL_RO_ATTR (main_blkaddr);F2FS_GENERAL_RO_ATTR (pending_discard);
@@ -1293,6 +1301,7 @@ static struct attribute *f2fs_attrs[] = {ATTR_LIST (reserved_blocks),ATTR_LIST (current_reserved_blocks),ATTR_LIST (encoding), +ATTR_LIST (encoding_flags),ATTR_LIST (mounted_time_sec), #ifdef CONFIG_F2FS_STAT_FS ATTR_LIST(cp_foreground_calls),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 298/354 f2fs: introduce reserved_pin_section sysfs entry
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 59c1c89e9ba8cefff05aa982dd9e6719f25e8ec5 ]
This patch introduces /sys/fs/f2fs/<dev>/reserved_pin_section for tuning @needed parameter of has_not_enough_free_secs(), if we configure it w/ zero, it can avoid f2fs_gc() as much as possible while fallocating on pinned file.
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- Documentation/ABI/testing/sysfs-fs-f2fs | 9 +++++++++ fs/f2fs/f2fs.h | 3 +++ fs/f2fs/file.c | 5 ++--- fs/f2fs/super.c | 4 ++++ fs/f2fs/sysfs.c | 9 +++++++++ 5 files changed, 27 insertions(+), 3 deletions(-)
Documentation/ABI/testing/sysfs-fs-f2fs +9 -0
@@ -858,3 +858,12 @@ Description: This is a read-only entry to show the value of sb.s_encoding_flags, SB_ENC_STRICT_MODE_FL 0x00000001 SB_ENC_NO_COMPAT_FALLBACK_FL 0x00000002 ============================ ========== + +What: /sys/fs/f2fs/<disk>/reserved_pin_section +Date: June 2025 +Contact: "Chao Yu" <[email protected]> +Description: This threshold is used to control triggering garbage collection while + fallocating on pinned file, so, it can guarantee there is enough free + reserved section before preallocating on pinned file. + By default, the value is ovp_sections, especially, for zoned ufs, the + value is 1.
fs/f2fs/f2fs.h +3 -0
@@ -1702,6 +1702,9 @@ struct f2fs_sb_info {/* for skip statistic */ unsigned long long skipped_gc_rwsem;/* FG_GC only */ +/* free sections reserved for pinned file */ +unsigned int reserved_pin_section; +/* threshold for gc trials on pinned files */ unsigned short gc_pin_file_threshold;struct f2fs_rwsem pin_sem;
fs/f2fs/file.c +2 -3
@@ -1850,9 +1850,8 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, } } -if (has_not_enough_free_secs (sbi,0 ,f2fs_sb_has_blkzoned (sbi) ? -ZONED_PIN_SEC_REQUIRED_COUNT : -GET_SEC_FROM_SEG (sbi,overprovision_segments (sbi)))) { +if (has_not_enough_free_secs (sbi,0 , + sbi->reserved_pin_section)) {f2fs_down_write (&sbi->gc_lock);stat_inc_gc_call_count (sbi,FOREGROUND ); err =f2fs_gc (sbi, &gc_control);
fs/f2fs/super.c +4 -0
@@ -4705,6 +4705,10 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)/* get segno of first zoned block device */ sbi->first_seq_zone_segno =get_first_seq_zone_segno (sbi); + sbi->reserved_pin_section =f2fs_sb_has_blkzoned (sbi) ? +ZONED_PIN_SEC_REQUIRED_COUNT : +GET_SEC_FROM_SEG (sbi,overprovision_segments (sbi)); +/* Read accumulated write IO statistics if exists */ seg_i =CURSEG_I (sbi,CURSEG_HOT_NODE );if (__exist_node_summaries (sbi))
fs/f2fs/sysfs.c +9 -0
@@ -847,6 +847,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"reserved_pin_section" )) { +if (t >GET_SEC_FROM_SEG (sbi,overprovision_segments (sbi))) +return -EINVAL ; + *ui = (unsigned int )t; +return count; + } + *ui = (unsigned int )t;return count;
@@ -1153,6 +1160,7 @@ F2FS_SBI_GENERAL_RO_ATTR(unusable_blocks_per_sec);F2FS_SBI_GENERAL_RW_ATTR (blkzone_alloc_policy);#endif F2FS_SBI_GENERAL_RW_ATTR (carve_out); +F2FS_SBI_GENERAL_RW_ATTR (reserved_pin_section);/* STAT_INFO ATTR */ #ifdef CONFIG_F2FS_STAT_FS
@@ -1343,6 +1351,7 @@ static struct attribute *f2fs_attrs[] = {ATTR_LIST (last_age_weight),ATTR_LIST (max_read_extent_count),ATTR_LIST (carve_out), +ATTR_LIST (reserved_pin_section),NULL , };ATTRIBUTE_GROUPS (f2fs);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 299/354 f2fs: add gc_boost_gc_multiple sysfs node
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit 1d4c5dbba1a53aeaf2c6cc84e7ba94c436d18852 ]
Add a sysfs knob to set a multiplier for the background GC migration window when F2FS Garbage Collection is boosted.
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- Documentation/ABI/testing/sysfs-fs-f2fs | 7 +++++++ fs/f2fs/gc.c | 3 ++- fs/f2fs/gc.h | 1 + fs/f2fs/sysfs.c | 9 +++++++++ 4 files changed, 19 insertions(+), 1 deletion(-)
Documentation/ABI/testing/sysfs-fs-f2fs +7 -0
@@ -867,3 +867,10 @@ Description: This threshold is used to control triggering garbage collection whi reserved section before preallocating on pinned file. By default, the value is ovp_sections, especially, for zoned ufs, the value is 1. + +What: /sys/fs/f2fs/<disk>/gc_boost_gc_multiple +Date: June 2025 +Contact: "Daeho Jeong" <[email protected]> +Description: Set a multiplier for the background GC migration window when F2FS GC is + boosted. The range should be from 1 to the segment count in a section. + Default: 5
fs/f2fs/gc.c +2 -1
@@ -197,6 +197,7 @@ int f2fs_start_gc_thread(struct f2fs_sb_info *sbi) gc_th->urgent_sleep_time =DEF_GC_THREAD_URGENT_SLEEP_TIME ; gc_th->valid_thresh_ratio =DEF_GC_THREAD_VALID_THRESH_RATIO ; + gc_th->boost_gc_multiple =BOOST_GC_MULTIPLE ;if (f2fs_sb_has_blkzoned (sbi)) { gc_th->min_sleep_time =DEF_GC_THREAD_MIN_SLEEP_TIME_ZONED ;
@@ -1757,7 +1758,7 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi, !has_enough_free_blocks(sbi, sbi->gc_thread->boost_zoned_gc_percent)) window_granularity *= -BOOST_GC_MULTIPLE ; + sbi->gc_thread->boost_gc_multiple; end_segno = start_segno + window_granularity; }
fs/f2fs/gc.h +1 -0
@@ -68,6 +68,7 @@ struct f2fs_gc_kthread {unsigned int no_zoned_gc_percent;unsigned int boost_zoned_gc_percent;unsigned int valid_thresh_ratio; +unsigned int boost_gc_multiple; };struct gc_inode_list {
fs/f2fs/sysfs.c +9 -0
@@ -854,6 +854,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"gc_boost_gc_multiple" )) { +if (t <1 || t >SEGS_PER_SEC (sbi)) +return -EINVAL ; + sbi->gc_thread->boost_gc_multiple = (unsigned int )t; +return count; + } + *ui = (unsigned int )t;return count;
@@ -1080,6 +1087,7 @@ GC_THREAD_RW_ATTR(gc_no_gc_sleep_time, no_gc_sleep_time);GC_THREAD_RW_ATTR (gc_no_zoned_gc_percent, no_zoned_gc_percent);GC_THREAD_RW_ATTR (gc_boost_zoned_gc_percent, boost_zoned_gc_percent);GC_THREAD_RW_ATTR (gc_valid_thresh_ratio, valid_thresh_ratio); +GC_THREAD_RW_ATTR (gc_boost_gc_multiple, boost_gc_multiple);/* SM_INFO ATTR */ SM_INFO_RW_ATTR (reclaim_segments, rec_prefree_segments);
@@ -1248,6 +1256,7 @@ static struct attribute *f2fs_attrs[] = {ATTR_LIST (gc_no_zoned_gc_percent),ATTR_LIST (gc_boost_zoned_gc_percent),ATTR_LIST (gc_valid_thresh_ratio), +ATTR_LIST (gc_boost_gc_multiple),ATTR_LIST (gc_idle),ATTR_LIST (gc_urgent), ATTR_LIST(reclaim_segments),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 300/354 f2fs: add gc_boost_gc_greedy sysfs node
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit c8705cefce44fbe85ca3b180dee0e0b5f3d51dc5 ]
Add this to control GC algorithm for boost GC.
Stable-dep-of: e462fc48ceb8 ("f2fs: maintain one time GC mode is enabled during whole zoned GC cycle")
--- Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++ fs/f2fs/gc.c | 3 ++- fs/f2fs/gc.h | 1 + fs/f2fs/sysfs.c | 9 +++++++++ 4 files changed, 18 insertions(+), 1 deletion(-)
Documentation/ABI/testing/sysfs-fs-f2fs +6 -0
@@ -874,3 +874,9 @@ Contact: "Daeho Jeong" <[email protected]> Description: Set a multiplier for the background GC migration window when F2FS GC is boosted. The range should be from 1 to the segment count in a section. Default: 5 + +What: /sys/fs/f2fs/<disk>/gc_boost_gc_greedy +Date: June 2025 +Contact: "Daeho Jeong" <[email protected]> +Description: Control GC algorithm for boost GC. 0: cost benefit, 1: greedy + Default: 1
fs/f2fs/gc.c +2 -1
@@ -141,7 +141,7 @@ static int gc_thread_func(void *data) FOREGROUND : BACKGROUND); sync_mode = (F2FS_OPTION (sbi).bggc_mode ==BGGC_MODE_SYNC ) || - gc_control.one_time; + (gc_control.one_time && gc_th->boost_gc_greedy);/* foreground GC was been triggered via f2fs_balance_fs() */ if (foreground)
@@ -198,6 +198,7 @@ int f2fs_start_gc_thread(struct f2fs_sb_info *sbi) gc_th->urgent_sleep_time =DEF_GC_THREAD_URGENT_SLEEP_TIME ; gc_th->valid_thresh_ratio =DEF_GC_THREAD_VALID_THRESH_RATIO ; gc_th->boost_gc_multiple =BOOST_GC_MULTIPLE ; + gc_th->boost_gc_greedy =GC_GREEDY ;if (f2fs_sb_has_blkzoned (sbi)) { gc_th->min_sleep_time =DEF_GC_THREAD_MIN_SLEEP_TIME_ZONED ;
fs/f2fs/gc.h +1 -0
@@ -69,6 +69,7 @@ struct f2fs_gc_kthread {unsigned int boost_zoned_gc_percent;unsigned int valid_thresh_ratio;unsigned int boost_gc_multiple; +unsigned int boost_gc_greedy; };struct gc_inode_list {
fs/f2fs/sysfs.c +9 -0
@@ -861,6 +861,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,return count; } +if (!strcmp (a->attr.name,"gc_boost_gc_greedy" )) { +if (t >GC_GREEDY ) +return -EINVAL ; + sbi->gc_thread->boost_gc_greedy = (unsigned int )t; +return count; + } + *ui = (unsigned int )t;return count;
@@ -1088,6 +1095,7 @@ GC_THREAD_RW_ATTR(gc_no_zoned_gc_percent, no_zoned_gc_percent);GC_THREAD_RW_ATTR (gc_boost_zoned_gc_percent, boost_zoned_gc_percent);GC_THREAD_RW_ATTR (gc_valid_thresh_ratio, valid_thresh_ratio);GC_THREAD_RW_ATTR (gc_boost_gc_multiple, boost_gc_multiple); +GC_THREAD_RW_ATTR (gc_boost_gc_greedy, boost_gc_greedy);/* SM_INFO ATTR */ SM_INFO_RW_ATTR (reclaim_segments, rec_prefree_segments);
@@ -1257,6 +1265,7 @@ static struct attribute *f2fs_attrs[] = {ATTR_LIST (gc_boost_zoned_gc_percent),ATTR_LIST (gc_valid_thresh_ratio),ATTR_LIST (gc_boost_gc_multiple), +ATTR_LIST (gc_boost_gc_greedy),ATTR_LIST (gc_idle),ATTR_LIST (gc_urgent), ATTR_LIST(reclaim_segments),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 301/354 f2fs: maintain one time GC mode is enabled during whole zoned GC cycle
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit e462fc48ceb8224811c3224650afed05cb7f0872 ]
The current version missed setting one time GC for normal zoned GC cycle. So, valid threshold control is not working. Need to fix it to prevent excessive GC for zoned devices.
--- fs/f2fs/gc.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
fs/f2fs/gc.c +10 -7
@@ -38,13 +38,14 @@ static int gc_thread_func(void *data)struct f2fs_gc_control gc_control = { .victim_segno =NULL_SEGNO , .should_migrate_blocks = false, - .err_gc_skipped = false }; + .err_gc_skipped = false, + .one_time = false }; wait_ms = gc_th->min_sleep_time;set_freezable (); do { - bool sync_mode, foreground = false; + bool sync_mode, foreground = false, gc_boost = false; wait_event_freezable_timeout(*wq, kthread_should_stop() ||
@@ -52,8 +53,12 @@ static int gc_thread_func(void *data) gc_th->gc_wake, msecs_to_jiffies(wait_ms)); -if (test_opt (sbi,GC_MERGE ) &&waitqueue_active (fggc_wq)) +if (test_opt (sbi,GC_MERGE ) &&waitqueue_active (fggc_wq)) { foreground = true; + gc_control.one_time = false; + }else if (f2fs_sb_has_blkzoned (sbi)) { + gc_control.one_time = true; + }/* give it a try one time */ if (gc_th->gc_wake)
@@ -81,8 +86,6 @@ static int gc_thread_func(void *data)continue ; } - gc_control.one_time = false; -/* * [GC triggering condition] * 0. GC is not conducted currently.
@@ -132,7 +135,7 @@ static int gc_thread_func(void *data)if (need_to_boost_gc (sbi)) {decrease_sleep_time (gc_th, &wait_ms);if (f2fs_sb_has_blkzoned (sbi)) - gc_control.one_time = true; + gc_boost = true; }else {increase_sleep_time (gc_th, &wait_ms); }
@@ -141,7 +144,7 @@ static int gc_thread_func(void *data) FOREGROUND : BACKGROUND); sync_mode = (F2FS_OPTION (sbi).bggc_mode ==BGGC_MODE_SYNC ) || - (gc_control.one_time && gc_th->boost_gc_greedy); + (gc_boost && gc_th->boost_gc_greedy);/* foreground GC was been triggered via f2fs_balance_fs() */ if (foreground)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 302/354 NFS: Avoid changing nlink when file removes and attribute updates race
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit bd4928ec799b31c492eb63f9f4a0c1e0bb4bb3f7 ]
If a file removal races with another operation that updates its attributes, then skip the change to nlink, and just mark the attributes as being stale.
--- fs/nfs/dir.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
fs/nfs/dir.c +13 -6
@@ -1903,13 +1903,15 @@ static int nfs_dentry_delete(const struct dentry *dentry) }/* Ensure that we revalidate inode->i_nlink */ -static void nfs_drop_nlink (struct inode *inode) +static void nfs_drop_nlink (struct inode *inode,unsigned long gencount) { +struct nfs_inode *nfsi =NFS_I (inode); +spin_lock (&inode->i_lock);/* drop the inode if we're reasonably sure this is the last link */ -if (inode->i_nlink >0 ) +if (inode->i_nlink >0 && gencount == nfsi->attr_gencount)drop_nlink (inode); -NFS_I (inode)->attr_gencount =nfs_inc_attr_generation_counter (); + nfsi->attr_gencount =nfs_inc_attr_generation_counter ();nfs_set_cache_invalid ( inode,NFS_INO_INVALID_CHANGE |NFS_INO_INVALID_CTIME |NFS_INO_INVALID_NLINK );
@@ -1923,8 +1925,9 @@ static void nfs_drop_nlink(struct inode *inode)static void nfs_dentry_iput (struct dentry *dentry,struct inode *inode) {if (dentry->d_flags &DCACHE_NFSFS_RENAMED ) { +unsigned long gencount =READ_ONCE (NFS_I (inode)->attr_gencount);nfs_complete_unlink (dentry, inode); -nfs_drop_nlink (inode); +nfs_drop_nlink (inode, gencount); }iput (inode); }
@@ -2523,9 +2526,11 @@ static int nfs_safe_remove(struct dentry *dentry)trace_nfs_remove_enter (dir, dentry);if (inode !=NULL ) { +unsigned long gencount =READ_ONCE (NFS_I (inode)->attr_gencount); + error =NFS_PROTO (dir)->remove (dir, dentry);if (error ==0 ) -nfs_drop_nlink (inode); +nfs_drop_nlink (inode, gencount); }else error =NFS_PROTO (dir)->remove (dir, dentry);if (error == -ENOENT )
@@ -2725,6 +2730,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, {struct inode *old_inode =d_inode (old_dentry);struct inode *new_inode =d_inode (new_dentry); +unsigned long new_gencount =0 ;struct dentry *dentry =NULL ;struct rpc_task *task;bool must_unblock = false;
@@ -2777,6 +2783,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, }else {block_revalidate (new_dentry); must_unblock = true; + new_gencount =NFS_I (new_inode)->attr_gencount;spin_unlock (&new_dentry->d_lock); }
@@ -2816,7 +2823,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, new_dir, new_dentry, error);if (!error) {if (new_inode !=NULL ) -nfs_drop_nlink (new_inode); +nfs_drop_nlink (new_inode, new_gencount);/* * The d_move() should be here instead of in an async RPC completion * handler because we need the proper locks to move the dentry. If
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 303/354 fs/nls: Fix utf16 to utf8 conversion
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 25524b6190295577e4918c689644451365e6466d ]
Currently the function responsible for converting between utf16 and utf8 strings will ignore any characters that cannot be converted. This however also includes multi-byte characters that do not fit into the provided string buffer.
This can cause problems if such a multi-byte character is followed by a single-byte character. In such a case the multi-byte character might be ignored when the provided string buffer is too small, but the single-byte character might fit and is thus still copied into the resulting string.
Fix this by stop filling the provided string buffer once a character does not fit. In order to be able to do this extend utf32_to_utf8() to return useful errno codes instead of -1.
--- fs/nls/nls_base.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
fs/nls/nls_base.c +12 -4
@@ -94,7 +94,7 @@ int utf32_to_utf8(unicode_t u, u8 *s, int maxout) l = u;if (l >UNICODE_MAX || (l &SURROGATE_MASK ) ==SURROGATE_PAIR ) -return -1 ; +return -EILSEQ ; nc =0 ;for (t = utf8_table; t->cmask && maxout; t++, maxout--) {
@@ -110,7 +110,7 @@ int utf32_to_utf8(unicode_t u, u8 *s, int maxout)return nc; } } -return -1 ; +return -EOVERFLOW ; }EXPORT_SYMBOL (utf32_to_utf8);
@@ -217,8 +217,16 @@ int utf16s_to_utf8s(const wchar_t *pwcs, int inlen, enum utf16_endian endian, inlen--; } size =utf32_to_utf8 (u, op, maxout); -if (size ==-1 ) { -/* Ignore character and move on */ +if (size <0 ) { +if (size == -EILSEQ ) { +/* Ignore character and move on */ +continue ; + } +/* +* Stop filling the buffer with data once a character +* does not fit anymore. +*/ +break ; }else { op += size; maxout -= size;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 304/354 NFS: Initialise verifiers for visible dentries in readdir and lookup
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 9bd545539b233725a3416801f7c374bff0327d6e ]
Ensure that the verifiers are initialised before calling d_splice_alias() in both nfs_prime_dcache() and nfs_lookup().
--- fs/nfs/dir.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/nfs/dir.c +4 -2
@@ -787,16 +787,17 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry, goto out; } +nfs_set_verifier (dentry, dir_verifier); inode =nfs_fhget (dentry->d_sb, entry->fh, entry->fattr); alias =d_splice_alias (inode, dentry);d_lookup_done (dentry);if (alias) {if (IS_ERR (alias)) goto out; +nfs_set_verifier (alias, dir_verifier);dput (dentry); dentry = alias; } -nfs_set_verifier (dentry, dir_verifier);trace_nfs_readdir_lookup (d_inode (parent), dentry,0 ); out:dput (dentry);
@@ -2002,13 +2003,14 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned innfs_lookup_advise_force_readdirplus (dir, flags); no_entry: +nfs_set_verifier (dentry, dir_verifier); res =d_splice_alias (inode, dentry);if (res !=NULL ) {if (IS_ERR (res)) goto out; +nfs_set_verifier (res, dir_verifier); dentry = res; } -nfs_set_verifier (dentry, dir_verifier); out:trace_nfs_lookup_exit (dir, dentry, flags,PTR_ERR_OR_ZERO (res));nfs_free_fattr (fattr);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 305/354 NFS: Initialise verifiers for visible dentries in nfs_atomic_open()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 518c32a1bc4f8df1a8442ee8cdfea3e2fcff20a0 ]
Ensure that the verifiers are initialised before calling d_splice_alias() in nfs_atomic_open().
--- fs/nfs/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/dir.c +1 -1
@@ -2151,12 +2151,12 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,d_drop (dentry);switch (err) {case -ENOENT : -d_splice_alias (NULL , dentry);if (nfs_server_capable (dir,NFS_CAP_CASE_INSENSITIVE )) dir_verifier =inode_peek_iversion_raw (dir);else dir_verifier =nfs_save_change_attribute (dir);nfs_set_verifier (dentry, dir_verifier); +d_splice_alias (NULL , dentry);break ;case -EISDIR :case -ENOTDIR :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 306/354 nfs/vfs: discard d_exact_alias()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit 3ff6c8707c9a0116d00982851ec1216a42053ace ]
d_exact_alias() is a descendent of d_add_unique() which was introduced 20 years ago mostly likely to work around problems with NFS servers of the time. It is now not used in several situations were it was originally needed and there have been no reports of problems - presumably the old NFS servers have been improved. This only place it is now use is in NFSv4 code and the old problematic servers are thought to have been v2/v3 only.
There is no clear benefit in reusing a unhashed() dentry which happens to have the same name as the dentry we are adding.
So this patch removes d_exact_alias() and the one place that it is used.
Stable-dep-of: 0f900f11002f ("NFS: Initialise verifiers for visible dentries in _nfs4_open_and_get_state")
--- fs/dcache.c | 46 ------------------------------------------ fs/nfs/nfs4proc.c | 4 +--- include/linux/dcache.h | 1 - 3 files changed, 1 insertion(+), 50 deletions(-)
fs/dcache.c +0 -46
@@ -2664,52 +2664,6 @@ void d_add(struct dentry *entry, struct inode *inode) }EXPORT_SYMBOL (d_add); -/** -* d_exact_alias - find and hash an exact unhashed alias -* @entry: dentry to add -* @inode: The inode to go with this dentry -* -* If an unhashed dentry with the same name/parent and desired -* inode already exists, hash and return it. Otherwise, return -* NULL. -* -* Parent directory should be locked. -*/ -struct dentry *d_exact_alias (struct dentry *entry,struct inode *inode) -{ -struct dentry *alias; -unsigned int hash = entry->d_name.hash; - -spin_lock (&inode->i_lock); -hlist_for_each_entry (alias, &inode->i_dentry, d_u.d_alias) { -/* -* Don't need alias->d_lock here, because aliases with -* d_parent == entry->d_parent are not subject to name or -* parent changes, because the parent inode i_mutex is held. -*/ -if (alias->d_name.hash != hash) -continue ; -if (alias->d_parent != entry->d_parent) -continue ; -if (!d_same_name (alias, entry->d_parent, &entry->d_name)) -continue ; -spin_lock (&alias->d_lock); -if (!d_unhashed (alias)) { -spin_unlock (&alias->d_lock); - alias =NULL ; - }else { -dget_dlock (alias); -__d_rehash (alias); -spin_unlock (&alias->d_lock); - } -spin_unlock (&inode->i_lock); -return alias; - } -spin_unlock (&inode->i_lock); -return NULL ; -} -EXPORT_SYMBOL (d_exact_alias); -static void swap_names (struct dentry *dentry,struct dentry *target) {if (unlikely (dname_external (target))) {
fs/nfs/nfs4proc.c +1 -3
@@ -3152,9 +3152,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,if (d_really_is_negative (dentry)) {struct dentry *alias;d_drop (dentry); - alias =d_exact_alias (dentry, state->inode); -if (!alias) - alias =d_splice_alias (igrab (state->inode), dentry); + alias =d_splice_alias (igrab (state->inode), dentry);/* d_splice_alias() can't fail here - it's a non-directory */ if (alias) {dput (ctx->dentry);
include/linux/dcache.h +0 -1
@@ -242,7 +242,6 @@ extern struct dentry * d_splice_alias(struct inode *, struct dentry *);extern struct dentry *d_add_ci (struct dentry *,struct inode *,struct qstr *);extern bool d_same_name (const struct dentry *dentry,const struct dentry *parent,const struct qstr *name); -extern struct dentry *d_exact_alias (struct dentry *,struct inode *);extern struct dentry *d_find_any_alias (struct inode *inode);extern struct dentry *d_obtain_alias (struct inode *);extern struct dentry *d_obtain_root (struct inode *);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 307/354 NFS: Initialise verifiers for visible dentries in _nfs4_open_and_get_state
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 0f900f11002ff52391fc2aa4a75e59f26ed1c242 ]
Ensure that the verifiers are initialised before calling d_splice_alias() in _nfs4_open_and_get_state().
--- fs/nfs/nfs4proc.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
fs/nfs/nfs4proc.c +14 -13
@@ -3148,18 +3148,6 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,if (opendata->o_res.rflags &NFS4_OPEN_RESULT_PRESERVE_UNLINKED )set_bit (NFS_INO_PRESERVE_UNLINKED , &NFS_I (state->inode)->flags); - dentry = opendata->dentry; -if (d_really_is_negative (dentry)) { -struct dentry *alias; -d_drop (dentry); - alias =d_splice_alias (igrab (state->inode), dentry); -/* d_splice_alias() can't fail here - it's a non-directory */ -if (alias) { -dput (ctx->dentry); - ctx->dentry = dentry = alias; - } - } -switch (opendata->o_arg.claim) {default :break ;
@@ -3170,7 +3158,20 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,break ;if (opendata->o_res.delegation.type !=0 ) dir_verifier =nfs_save_change_attribute (dir); -nfs_set_verifier (dentry, dir_verifier); + } + + dentry = opendata->dentry; +nfs_set_verifier (dentry, dir_verifier); +if (d_really_is_negative (dentry)) { +struct dentry *alias; +d_drop (dentry); + alias =d_splice_alias (igrab (state->inode), dentry); +/* d_splice_alias() can't fail here - it's a non-directory */ +if (alias) { +dput (ctx->dentry); +nfs_set_verifier (alias, dir_verifier); + ctx->dentry = dentry = alias; + } }/* Parse layoutget results before we check for access */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 308/354 NFSv4/pNFS: Clear NFS_INO_LAYOUTCOMMIT in pnfs_mark_layout_stateid_invalid
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Curley <[email protected]>
[ Upstream commit e0f8058f2cb56de0b7572f51cd563ca5debce746 ]
Fixes a crash when layout is null during this call stack:
write_inode
-> nfs4_write_inode
-> pnfs_layoutcommit_inodepnfs_set_layoutcommit relies on the lseg refcount to keep the layout around. Need to clear NFS_INO_LAYOUTCOMMIT otherwise we might attempt to reference a null layout.
--- fs/nfs/pnfs.c | 1 + 1 file changed, 1 insertion(+)
fs/nfs/pnfs.c +1 -0
@@ -466,6 +466,7 @@ pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,struct pnfs_layout_segment *lseg, *next;set_bit (NFS_LAYOUT_INVALID_STID , &lo->plh_flags); +clear_bit (NFS_INO_LAYOUTCOMMIT , &NFS_I (lo->plh_inode)->flags);list_for_each_entry_safe (lseg, next, &lo->plh_segs, pls_list)pnfs_clear_lseg_state (lseg, lseg_list);pnfs_clear_layoutreturn_info (lo);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 309/354 Revert "nfs: ignore SB_RDONLY when remounting nfs"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 400fa37afbb11a601c204b72af0f0e5bc2db695c ]
This reverts commit 80c4de6ab44c14e910117a02f2f8241ffc6ec54a.
Silently ignoring the "ro" and "rw" mount options causes user confusion, and regressions.
--- fs/nfs/super.c | 10 ---------- 1 file changed, 10 deletions(-)
fs/nfs/super.c +0 -10
@@ -1046,16 +1046,6 @@ int nfs_reconfigure(struct fs_context *fc)sync_filesystem (sb); -/* -* The SB_RDONLY flag has been removed from the superblock during -* mounts to prevent interference between different filesystems. -* Similarly, it is also necessary to ignore the SB_RDONLY flag -* during reconfiguration; otherwise, it may also result in the -* creation of redundant superblocks when mounting a directory with -* different rw and ro flags multiple times. -*/ - fc->sb_flags_mask &= ~SB_RDONLY ; -/* * Userspace mount programs that send binary options generally send * them populated with default values. We have no way to know which
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 310/354 Revert "nfs: clear SB_RDONLY before getting superblock"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit d216b698d44e33417ad4cc796cb04ccddbb8c0ee ]
This reverts commit 8cd9b785943c57a136536250da80ba1eb6f8eb18.
Silently ignoring the "ro" and "rw" mount options causes user confusion, and regressions.
--- fs/nfs/super.c | 9 --------- 1 file changed, 9 deletions(-)
fs/nfs/super.c +0 -9
@@ -1303,17 +1303,8 @@ int nfs_get_tree_common(struct fs_context *fc)if (IS_ERR (server))return PTR_ERR (server); -/* -* When NFS_MOUNT_UNSHARED is not set, NFS forces the sharing of a -* superblock among each filesystem that mounts sub-directories -* belonging to a single exported root path. -* To prevent interference between different filesystems, the -* SB_RDONLY flag should be removed from the superblock. -*/ if (server->flags &NFS_MOUNT_UNSHARED ) compare_super =NULL ; -else - fc->sb_flags &= ~SB_RDONLY ;/* -o noac implies -o sync */ if (server->flags &NFS_MOUNT_NOAC )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 311/354 Revert "nfs: ignore SB_RDONLY when mounting nfs"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit d4a26d34f1946142f9d32e540490e4926ae9a46b ]
This reverts commit 52cb7f8f177878b4f22397b9c4d2c8f743766be3.
Silently ignoring the "ro" and "rw" mount options causes user confusion, and regressions.
--- fs/nfs/internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/internal.h +1 -1
@@ -13,7 +13,7 @@#include <linux/nfslocalio.h> #include <linux/wait_bit.h> -#define NFS_SB_MASK (SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS) +#define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)extern const struct export_operations nfs_export_ops;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 312/354 NFS: Automounted filesystems should inherit ro,noexec,nodev,sync flags
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 8675c69816e4276b979ff475ee5fac4688f80125 ]
When a filesystem is being automounted, it needs to preserve the user-set superblock mount options, such as the "ro" flag.
--- fs/nfs/namespace.c | 6 ++++++ fs/nfs/super.c | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-)
fs/nfs/namespace.c +6 -0
@@ -149,6 +149,7 @@ struct vfsmount *nfs_d_automount(struct path *path)struct vfsmount *mnt =ERR_PTR (-ENOMEM );struct nfs_server *server =NFS_SB (path->dentry->d_sb);struct nfs_client *client = server->nfs_client; +unsigned long s_flags = path->dentry->d_sb->s_flags;int timeout =READ_ONCE (nfs_mountpoint_expiry_timeout);int ret;
@@ -174,6 +175,11 @@ struct vfsmount *nfs_d_automount(struct path *path) fc->net_ns =get_net (client->cl_net); } +/* Inherit the flags covered by NFS_SB_MASK */ + fc->sb_flags_mask |=NFS_SB_MASK ; + fc->sb_flags &= ~NFS_SB_MASK ; + fc->sb_flags |= s_flags &NFS_SB_MASK ; +/* for submounts we want the same server; referrals will reassign */ memcpy (&ctx->nfs_server._address, &client->cl_addr, client->cl_addrlen); ctx->nfs_server.addrlen = client->cl_addrlen;
fs/nfs/super.c +0 -4
@@ -1310,10 +1310,6 @@ int nfs_get_tree_common(struct fs_context *fc)if (server->flags &NFS_MOUNT_NOAC ) fc->sb_flags |=SB_SYNCHRONOUS ; -if (ctx->clone_data.sb) -if (ctx->clone_data.sb->s_flags &SB_SYNCHRONOUS ) - fc->sb_flags |=SB_SYNCHRONOUS ; -/* Get a superblock - note that we may end up sharing one that already exists */ fc->s_fs_info = server; s =sget_fc (fc, compare_super, nfs_set_super);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 313/354 Expand the type of nfs_fattr->valid
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit ce60ab3964782df9ba34f0a64c0bc766dd508bde ]
We need to be able to track more than 32 attributes per inode.
Stable-dep-of: 2b092175f5e3 ("NFS: Fix inheritance of the block sizes when automounting")
--- fs/nfs/inode.c | 2 +- include/linux/nfs_fs_sb.h | 2 +- include/linux/nfs_xdr.h | 54 +++++++++++++++++++-------------------- 3 files changed, 29 insertions(+), 29 deletions(-)
fs/nfs/inode.c +1 -1
@@ -2214,7 +2214,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)bool attr_changed = false;bool have_delegation; -dfprintk (VFS ,"NFS: %s(%s/%lu fh_crc=0x%08x ct=%d info=0x%x)\n" , +dfprintk (VFS ,"NFS: %s(%s/%lu fh_crc=0x%08x ct=%d info=0x%llx)\n" , __func__, inode->i_sb->s_id, inode->i_ino,nfs_display_fhandle_hash (NFS_FH (inode)),atomic_read (&inode->i_count), fattr->valid);
include/linux/nfs_fs_sb.h +1 -1
@@ -169,8 +169,8 @@ struct nfs_server {#define NFS_MOUNT_SHUTDOWN 0x08000000#define NFS_MOUNT_NO_ALIGNWRITE 0x10000000 -unsigned int fattr_valid;/* Valid attributes */ unsigned int caps;/* server capabilities */ +__u64 fattr_valid;/* Valid attributes */ unsigned int rsize;/* read size */ unsigned int rpages;/* read size (in pages) */ unsigned int wsize;/* write size */
include/linux/nfs_xdr.h +27 -27
66 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 314/354 NFS: Fix inheritance of the block sizes when automounting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 2b092175f5e301cdaa935093edfef2be9defb6df ]
Only inherit the block sizes that were actually specified as mount parameters for the parent mount.
--- fs/nfs/client.c | 21 +++++++++++++++++---- fs/nfs/internal.h | 1 - fs/nfs/namespace.c | 5 ++++- fs/nfs/nfs4client.c | 18 ++++++++++++++---- fs/nfs/super.c | 10 +++------- include/linux/nfs_fs_sb.h | 5 +++++ 6 files changed, 43 insertions(+), 17 deletions(-)
fs/nfs/client.c +17 -4
@@ -767,10 +767,18 @@ static int nfs_init_server(struct nfs_server *server, server->fattr_valid =NFS_ATTR_FATTR_V4 ; } -if (ctx->rsize) +if (ctx->bsize) { + server->bsize = ctx->bsize; + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_BSIZE ; + } +if (ctx->rsize) { server->rsize =nfs_io_size (ctx->rsize, clp->cl_proto); -if (ctx->wsize) + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_RSIZE ; + } +if (ctx->wsize) { server->wsize =nfs_io_size (ctx->wsize, clp->cl_proto); + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_WSIZE ; + } server->acregmin = ctx->acregmin *HZ ; server->acregmax = ctx->acregmax *HZ ;
@@ -962,8 +970,13 @@ EXPORT_SYMBOL_GPL(nfs_probe_server);void nfs_server_copy_userdata (struct nfs_server *target,struct nfs_server *source) { target->flags = source->flags; - target->rsize = source->rsize; - target->wsize = source->wsize; + target->automount_inherit = source->automount_inherit; +if (source->automount_inherit &NFS_AUTOMOUNT_INHERIT_BSIZE ) + target->bsize = source->bsize; +if (source->automount_inherit &NFS_AUTOMOUNT_INHERIT_RSIZE ) + target->rsize = source->rsize; +if (source->automount_inherit &NFS_AUTOMOUNT_INHERIT_WSIZE ) + target->wsize = source->wsize; target->acregmin = source->acregmin; target->acregmax = source->acregmax; target->acdirmin = source->acdirmin;
fs/nfs/internal.h +0 -1
@@ -152,7 +152,6 @@ struct nfs_fs_context {struct super_block *sb;struct dentry *dentry;struct nfs_fattr *fattr; -unsigned int inherited_bsize; } clone_data; };
fs/nfs/namespace.c +4 -1
@@ -190,6 +190,10 @@ struct vfsmount *nfs_d_automount(struct path *path) ctx->nfs_mod = client->cl_nfs_mod;__module_get (ctx->nfs_mod->owner); +/* Inherit block sizes if they were specified as mount parameters */ +if (server->automount_inherit &NFS_AUTOMOUNT_INHERIT_BSIZE ) + ctx->bsize = server->bsize; + ret = client->rpc_ops->submount (fc, server);if (ret <0 ) { mnt =ERR_PTR (ret);
@@ -290,7 +294,6 @@ int nfs_do_submount(struct fs_context *fc)return -ENOMEM ; ctx->internal = true; - ctx->clone_data.inherited_bsize = ctx->clone_data.sb->s_blocksize_bits; p =nfs_devname (dentry, buffer,4096 );if (IS_ERR (p)) {
fs/nfs/nfs4client.c +14 -4
@@ -1176,10 +1176,20 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)if (error <0 )return error; -if (ctx->rsize) - server->rsize =nfs_io_size (ctx->rsize, server->nfs_client->cl_proto); -if (ctx->wsize) - server->wsize =nfs_io_size (ctx->wsize, server->nfs_client->cl_proto); +if (ctx->bsize) { + server->bsize = ctx->bsize; + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_BSIZE ; + } +if (ctx->rsize) { + server->rsize = +nfs_io_size (ctx->rsize, server->nfs_client->cl_proto); + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_RSIZE ; + } +if (ctx->wsize) { + server->wsize = +nfs_io_size (ctx->wsize, server->nfs_client->cl_proto); + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_WSIZE ; + } server->acregmin = ctx->acregmin *HZ ; server->acregmax = ctx->acregmax *HZ ;
fs/nfs/super.c +3 -7
@@ -1086,8 +1086,9 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx) sb->s_blocksize =0 ; sb->s_xattr = server->nfs_client->cl_nfs_mod->xattr; sb->s_op = server->nfs_client->cl_nfs_mod->sops; -if (ctx->bsize) - sb->s_blocksize =nfs_block_size (ctx->bsize, &sb->s_blocksize_bits); +if (server->bsize) + sb->s_blocksize = +nfs_block_size (server->bsize, &sb->s_blocksize_bits);switch (server->nfs_client->rpc_ops->version) {case 2 :
@@ -1333,13 +1334,8 @@ int nfs_get_tree_common(struct fs_context *fc) }if (!s->s_root) { -unsigned bsize = ctx->clone_data.inherited_bsize;/* initial superblock/root creation */ nfs_fill_super (s, ctx); -if (bsize) { - s->s_blocksize_bits = bsize; - s->s_blocksize =1U << bsize; - } error =nfs_get_cache_cookie (s, ctx);if (error <0 ) goto error_splat_super;
include/linux/nfs_fs_sb.h +5 -0
@@ -169,6 +169,11 @@ struct nfs_server {#define NFS_MOUNT_SHUTDOWN 0x08000000#define NFS_MOUNT_NO_ALIGNWRITE 0x10000000 +unsigned int automount_inherit;/* Properties inherited by automount */ +#define NFS_AUTOMOUNT_INHERIT_BSIZE 0x0001 +#define NFS_AUTOMOUNT_INHERIT_RSIZE 0x0002 +#define NFS_AUTOMOUNT_INHERIT_WSIZE 0x0004 +unsigned int caps;/* server capabilities */ __u64 fattr_valid;/* Valid attributes */ unsigned int rsize;/* read size */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 315/354 fs/nls: Fix inconsistency between utf8_to_utf32() and utf32_to_utf8()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit c36f9d7b2869a003a2f7d6ff2c6bac9e62fd7d68 ]
After commit 25524b619029 ("fs/nls: Fix utf16 to utf8 conversion"), the return values of utf8_to_utf32() and utf32_to_utf8() are inconsistent when encountering an error: utf8_to_utf32() returns -1, while utf32_to_utf8() returns errno codes. Fix this inconsistency by modifying utf8_to_utf32() to return errno codes as well.
--- fs/nls/nls_base.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
fs/nls/nls_base.c +7 -4
@@ -67,19 +67,22 @@ int utf8_to_utf32(const u8 *s, int inlen, unicode_t *pu) l &= t->lmask;if (l < t->lval || l >UNICODE_MAX || (l &SURROGATE_MASK ) ==SURROGATE_PAIR ) -return -1 ; +return -EILSEQ ; + *pu = (unicode_t ) l;return nc; }if (inlen <= nc) -return -1 ; +return -EOVERFLOW ; + s++; c = (*s ^0x80 ) &0xFF ;if (c &0xC0 ) -return -1 ; +return -EILSEQ ; + l = (l <<6 ) | c; } -return -1 ; +return -EILSEQ ; }EXPORT_SYMBOL (utf8_to_utf32);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 316/354 platform/x86: asus-wmi: use brightness_set_blocking() for kbd led
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Khirnov <[email protected]>
[ Upstream commit ccb61a328321ba3f8567e350664c9ca7a42b6c70 ]
kbd_led_set() can sleep, and so may not be used as the brightness_set() callback.
Otherwise using this led with a trigger leads to system hangs accompanied by:
BUG: scheduling while atomic: acpi_fakekeyd/2588/0x00000003 CPU: 4 UID: 0 PID: 2588 Comm: acpi_fakekeyd Not tainted 6.17.9+deb14-amd64 #1 PREEMPT(lazy) Debian 6.17.9-1 Hardware name: ASUSTeK COMPUTER INC. ASUS EXPERTBOOK B9403CVAR/B9403CVAR, BIOS B9403CVAR.311 12/24/2024 Call Trace: <TASK> [...] schedule_timeout+0xbd/0x100 __down_common+0x175/0x290 down_timeout+0x67/0x70 acpi_os_wait_semaphore+0x57/0x90 [...] asus_wmi_evaluate_method3+0x87/0x190 [asus_wmi] led_trigger_event+0x3f/0x60 [...]
--- drivers/platform/x86/asus-wmi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/platform/x86/asus-wmi.c +4 -4
@@ -1577,14 +1577,14 @@ static void do_kbd_led_set(struct led_classdev *led_cdev, int value)kbd_led_update (asus); } -static void kbd_led_set (struct led_classdev *led_cdev, -enum led_brightness value) +static int kbd_led_set (struct led_classdev *led_cdev,enum led_brightness value) {/* Prevent disabling keyboard backlight on module unregister */ if (led_cdev->flags &LED_UNREGISTERING ) -return ; +return 0 ;do_kbd_led_set (led_cdev, value); +return 0 ; }static void kbd_led_set_by_kbd (struct asus_wmi *asus,enum led_brightness value)
@@ -1760,7 +1760,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus) asus->kbd_led_wk = led_val; asus->kbd_led.name ="asus::kbd_backlight" ; asus->kbd_led.flags =LED_BRIGHT_HW_CHANGED ; - asus->kbd_led.brightness_set = kbd_led_set; + asus->kbd_led.brightness_set_blocking = kbd_led_set; asus->kbd_led.brightness_get = kbd_led_get; asus->kbd_led.max_brightness =3 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 317/354 ASoC: bcm: bcm63xx-pcm-whistler: Check return value of of_dma_configure()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit 0ebbd45c33d0049ebf5a22c1434567f0c420b333 ]
bcm63xx_soc_pcm_new() does not check the return value of of_dma_configure(), which may fail with -EPROBE_DEFER or other errors, allowing PCM setup to continue with incomplete DMA configuration.
Add error checking for of_dma_configure() and return on failure.
--- sound/soc/bcm/bcm63xx-pcm-whistler.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/soc/bcm/bcm63xx-pcm-whistler.c +3 -1
@@ -354,7 +354,9 @@ static int bcm63xx_soc_pcm_new(struct snd_soc_component *component, i2s_priv =dev_get_drvdata (snd_soc_rtd_to_cpu (rtd,0 )->dev); -of_dma_configure (pcm->card->dev, pcm->card->dev->of_node,1 ); + ret =of_dma_configure (pcm->card->dev, pcm->card->dev->of_node,1 ); +if (ret) +return ret; ret =dma_coerce_mask_and_coherent (pcm->card->dev,DMA_BIT_MASK (32 ));if (ret)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 318/354 ASoC: ak4458: Disable regulator when error happens
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit ae585fabb9713a43e358cf606451386757225c95 ]
Disable regulator in runtime resume when error happens to balance the reference count of regulator.
--- sound/soc/codecs/ak4458.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/soc/codecs/ak4458.c +9 -1
@@ -676,7 +676,15 @@ static int __maybe_unused ak4458_runtime_resume(struct device *dev)regcache_cache_only (ak4458->regmap, false);regcache_mark_dirty (ak4458->regmap); - return regcache_sync(ak4458->regmap); + ret =regcache_sync (ak4458->regmap); +if (ret) + goto err; + +return 0 ; +err: +regcache_cache_only (ak4458->regmap, true); +regulator_bulk_disable (ARRAY_SIZE (ak4458->supplies), ak4458->supplies); + return ret; }#endif /* CONFIG_PM */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 319/354 ASoC: ak5558: Disable regulator when error happens
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 1f8f726a2a29c28f65b30880335a1610c5e63594 ]
Disable regulator in runtime resume when error happens to balance the reference count of regulator.
--- sound/soc/codecs/ak5558.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/soc/codecs/ak5558.c +9 -1
@@ -372,7 +372,15 @@ static int __maybe_unused ak5558_runtime_resume(struct device *dev)regcache_cache_only (ak5558->regmap, false);regcache_mark_dirty (ak5558->regmap); -return regcache_sync (ak5558->regmap); + ret =regcache_sync (ak5558->regmap); +if (ret) + goto err; + +return 0 ; +err: +regcache_cache_only (ak5558->regmap, true); +regulator_bulk_disable (ARRAY_SIZE (ak5558->supplies), ak5558->supplies); +return ret; }static const struct dev_pm_ops ak5558_pm = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 320/354 blk-mq: Abort suspend when wakeup events are pending
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Zhang <[email protected]>
[ Upstream commit c196bf43d706592d8801a7513603765080e495fb ]
During system suspend, wakeup capable IRQs for block device can be delayed, which can cause blk_mq_hctx_notify_offline() to hang indefinitely while waiting for pending request to complete. Skip the request waiting loop and abort suspend when wakeup events are pending to prevent the deadlock.
--- block/blk-mq.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
block/blk-mq.c +16 -2
@@ -23,6 +23,7 @@#include <linux/cache.h> #include <linux/sched/topology.h> #include <linux/sched/signal.h> +#include <linux/suspend.h> #include <linux/delay.h> #include <linux/crash_dump.h> #include <linux/prefetch.h>
@@ -3655,6 +3656,7 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node) {struct blk_mq_hw_ctx *hctx =hlist_entry_safe (node, struct blk_mq_hw_ctx, cpuhp_online); +int ret =0 ;if (blk_mq_hctx_has_online_cpu (hctx, cpu))return 0 ;
@@ -3675,12 +3677,24 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node)* frozen and there are no requests. */ if (percpu_ref_tryget (&hctx->queue->q_usage_counter)) { -while (blk_mq_hctx_has_requests (hctx)) +while (blk_mq_hctx_has_requests (hctx)) { +/* +* The wakeup capable IRQ handler of block device is +* not called during suspend. Skip the loop by checking +* pm_wakeup_pending to prevent the deadlock and improve +* suspend latency. +*/ +if (pm_wakeup_pending ()) { +clear_bit (BLK_MQ_S_INACTIVE , &hctx->state); + ret = -EBUSY ; +break ; + }msleep (5 ); + }percpu_ref_put (&hctx->queue->q_usage_counter); } -return 0 ; +return ret; }/*
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 321/354 block: fix comment for op_is_zone_mgmt() to include RESET_ALL
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: shechenglong <[email protected]>
[ Upstream commit 8a32282175c964eb15638e8dfe199fc13c060f67 ]
REQ_OP_ZONE_RESET_ALL is a zone management request, and op_is_zone_mgmt() has returned true for it.
Update the comment to remove the misleading exception note so the documentation matches the implementation.
--- include/linux/blk_types.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
include/linux/blk_types.h +1 -4
@@ -464,10 +464,7 @@ static inline bool op_is_discard(blk_opf_t op) }/* -* Check if a bio or request operation is a zone management operation, with -* the exception of REQ_OP_ZONE_RESET_ALL which is treated as a special case -* due to its different handling in the block layer and device response in -* case of command failure. +* Check if a bio or request operation is a zone management operation. */ static inline bool op_is_zone_mgmt (enum req_op op) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 322/354 block: fix memory leak in __blkdev_issue_zero_pages
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shaurya Rane <[email protected]>
[ Upstream commit f7e3f852a42d7cd8f1af2c330d9d153e30c8adcf ]
Move the fatal signal check before bio_alloc() to prevent a memory leak when BLKDEV_ZERO_KILLABLE is set and a fatal signal is pending.
Previously, the bio was allocated before checking for a fatal signal. If a signal was pending, the code would break out of the loop without freeing or chaining the just-allocated bio, causing a memory leak.
This matches the pattern already used in __blkdev_issue_write_zeroes() where the signal check precedes the allocation.
--- block/blk-lib.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
block/blk-lib.c +3 -3
@@ -200,13 +200,13 @@ static void __blkdev_issue_zero_pages(struct block_device *bdev,unsigned int nr_vecs =__blkdev_sectors_to_bio_pages (nr_sects);struct bio *bio; - bio =bio_alloc (bdev, nr_vecs,REQ_OP_WRITE , gfp_mask); - bio->bi_iter.bi_sector = sector; -if ((flags &BLKDEV_ZERO_KILLABLE ) &&fatal_signal_pending (current))break ; + bio =bio_alloc (bdev, nr_vecs,REQ_OP_WRITE , gfp_mask); + bio->bi_iter.bi_sector = sector; + do { unsigned int len, added;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 323/354 nvme-auth: use kvfree() for memory allocated with kvcalloc()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Israel Rukshin <[email protected]>
[ Upstream commit bb9f4cca7c031de6f0e85f7ba24abf0172829f85 ]
Memory allocated by kvcalloc() may come from vmalloc or kmalloc, so use kvfree() instead of kfree() for proper deallocation.
--- drivers/nvme/host/auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/auth.c +1 -1
@@ -994,7 +994,7 @@ void nvme_auth_free(struct nvme_ctrl *ctrl)if (ctrl->dhchap_ctxs) {for (i =0 ; i <ctrl_max_dhchaps (ctrl); i++)nvme_auth_free_dhchap (&ctrl->dhchap_ctxs[i]); -kfree (ctrl->dhchap_ctxs); +kvfree (ctrl->dhchap_ctxs); }if (ctrl->host_key) {nvme_auth_free_key (ctrl->host_key);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 324/354 drm/plane: Fix IS_ERR() vs NULL check in drm_plane_create_hotspot_properties()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 479acb9db3199cdb70e5478a6f633b5f20c7d8df ]
The drm_property_create_signed_range() function doesn't return error pointers it returns NULL on error. Fix the error checking to match.
--- drivers/gpu/drm/drm_plane.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/drm_plane.c +4 -4
@@ -328,14 +328,14 @@ static int drm_plane_create_hotspot_properties(struct drm_plane *plane) prop_x =drm_property_create_signed_range (plane->dev,0 ,"HOTSPOT_X" ,INT_MIN ,INT_MAX ); -if (IS_ERR (prop_x)) -return PTR_ERR (prop_x); +if (!prop_x) +return -ENOMEM ; prop_y =drm_property_create_signed_range (plane->dev,0 ,"HOTSPOT_Y" ,INT_MIN ,INT_MAX ); -if (IS_ERR (prop_y)) { +if (!prop_y) {drm_property_destroy (plane->dev, prop_x); -return PTR_ERR (prop_y); +return -ENOMEM ; }drm_object_attach_property (&plane->base, prop_x,0 );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 325/354 regulator: fixed: Rely on the core freeing the enable GPIO
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
[ Upstream commit 79a45ddcdbba330f5139c7c7ff7042d69cf147b2 ]
In order to simplify ownership rules for enable GPIOs supplied by drivers regulator_register() always takes ownership of them, even if it ends up failing for some other reason. We therefore should not free the GPIO if registration fails but just let the core worry about things.
--- drivers/regulator/fixed.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/regulator/fixed.c +4 -7
@@ -330,13 +330,10 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) drvdata->dev =devm_regulator_register (&pdev->dev, &drvdata->desc, &cfg); -if (IS_ERR (drvdata->dev)) { - ret =dev_err_probe (&pdev->dev,PTR_ERR (drvdata->dev), -"Failed to register regulator: %ld\n" , -PTR_ERR (drvdata->dev)); -gpiod_put (cfg.ena_gpiod); -return ret; - } +if (IS_ERR (drvdata->dev)) +return dev_err_probe (&pdev->dev,PTR_ERR (drvdata->dev), +"Failed to register regulator: %ld\n" , +PTR_ERR (drvdata->dev));platform_set_drvdata (pdev, drvdata);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 326/354 ALSA: firewire-motu: fix buffer overflow in hwdep read for DSP events
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 210d77cca3d0494ed30a5c628b20c1d95fa04fb1 ]
The DSP event handling code in hwdep_read() could write more bytes to the user buffer than requested, when a user provides a buffer smaller than the event header size (8 bytes).
Fix by using min_t() to clamp the copy size, This ensures we never copy more than the user requested.
--- sound/firewire/motu/motu-hwdep.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/firewire/motu/motu-hwdep.c +3 -2
@@ -83,10 +83,11 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, event.motu_register_dsp_change.type =SNDRV_FIREWIRE_EVENT_MOTU_REGISTER_DSP_CHANGE ; event.motu_register_dsp_change.count = (consumed -sizeof (event.motu_register_dsp_change)) /4 ; -if (copy_to_user (buf, &event,sizeof (event.motu_register_dsp_change))) +if (copy_to_user (buf, &event, +min_t (long, count,sizeof (event.motu_register_dsp_change))))return -EFAULT ; - count = consumed; + count =min_t (long, count, consumed); }else {spin_unlock_irq (&motu->lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 327/354 drm/nouveau: refactor deprecated strcpy
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Madhur Kumar <[email protected]>
[ Upstream commit 2bdc2c0e12fac56e41ec05fb771ead986ea6dac0 ]
strcpy() has been deprecated because it performs no bounds checking on the destination buffer, which can lead to buffer overflows. Use the safer strscpy() instead.
--- drivers/gpu/drm/nouveau/nouveau_fence.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/nouveau/nouveau_fence.c +3 -3
@@ -197,11 +197,11 @@ nouveau_fence_context_new(struct nouveau_channel *chan, struct nouveau_fence_cha fctx->context = drm->runl[chan->runlist].context_base + chan->chid;if (chan == drm->cechan) -strcpy (fctx->name,"copy engine channel" ); +strscpy (fctx->name,"copy engine channel" );else if (chan == drm->channel) -strcpy (fctx->name,"generic kernel channel" ); +strscpy (fctx->name,"generic kernel channel" );else -strcpy (fctx->name, cli->name); +strscpy (fctx->name, cli->name);kref_init (&fctx->fence_ref);if (!priv->uevent)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 328/354 cifs: Fix handling of a beyond-EOF DIO/unbuffered read over SMB2
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 4ae4dde6f34a4124c65468ae4fa1f915fb40f900 ]
If a DIO read or an unbuffered read request extends beyond the EOF, the server will return a short read and a status code indicating that EOF was hit, which gets translated to -ENODATA. Note that the client does not cap the request at i_size, but asks for the amount requested in case there's a race on the server with a third party.
Now, on the client side, the request will get split into multiple subrequests if rsize is smaller than the full request size. A subrequest that starts before or at the EOF and returns short data up to the EOF will be correctly handled, with the NETFS_SREQ_HIT_EOF flag being set, indicating to netfslib that we can't read more.
If a subrequest, however, starts after the EOF and not at it, HIT_EOF will not be flagged, its error will be set to -ENODATA and it will be abandoned. This will cause the request as a whole to fail with -ENODATA.
Fix this by setting NETFS_SREQ_HIT_EOF on any subrequest that lies beyond the EOF marker.
--- fs/smb/client/smb2pdu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/smb2pdu.c +1 -1
@@ -4634,7 +4634,7 @@ smb2_readv_callback(struct mid_q_entry *mid) }else {size_t trans = rdata->subreq.transferred + rdata->got_bytes;if (trans < rdata->subreq.len && - rdata->subreq.start + trans == ictx->remote_i_size) { + rdata->subreq.start + trans >= ictx->remote_i_size) {__set_bit (NETFS_SREQ_HIT_EOF , &rdata->subreq.flags); rdata->result =0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 329/354 docs: hwmon: fix link to g762 devicetree binding
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kathara Sasikumar <[email protected]>
[ Upstream commit 08bfcf4ff9d39228150a757803fc02dffce84ab0 ]
The devicetree binding for g762 was converted to YAML to match vendor prefix conventions. Update the reference accordingly.
--- Documentation/hwmon/g762.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/hwmon/g762.rst +1 -1
@@ -17,7 +17,7 @@ done via a userland daemon like fancontrol. Note that those entries do not provide ways to setup the specific hardware characteristics of the system (reference clock, pulses per fan revolution, ...); Those can be modified via devicetree bindings -documented in Documentation/devicetree/bindings/hwmon/g762.txt or +documented in Documentation/devicetree/bindings/hwmon/gmt,g762.yaml or using a specific platform_data structure in board initialization file (see include/linux/platform_data/g762.h).
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 330/354 dma/pool: eliminate alloc_pages warning in atomic_pool_expand
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Kleikamp <[email protected]>
[ Upstream commit 463d439becb81383f3a5a5d840800131f265a09c ]
atomic_pool_expand iteratively tries the allocation while decrementing the page order. There is no need to issue a warning if an attempted allocation fails.
--- kernel/dma/pool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/dma/pool.c +1 -1
@@ -93,7 +93,7 @@ static int atomic_pool_expand(struct gen_pool *pool, size_t pool_size, page =dma_alloc_from_contiguous (NULL ,1 << order, order, false);if (!page) - page =alloc_pages (gfp, order); + page =alloc_pages (gfp | __GFP_NOWARN, order); }while (!page && order-- >0 );if (!page) goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 331/354 ALSA: uapi: Fix typo in asound.h comment
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andres J Rosa <[email protected]>
[ Upstream commit 9a97857db0c5655b8932f86b5d18bb959079b0ee ]
Fix 'level-shit' to 'level-shift' in struct snd_cea_861_aud_if comment.
--- include/uapi/sound/asound.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/sound/asound.h +1 -1
@@ -60,7 +60,7 @@ struct snd_cea_861_aud_if {unsigned char db2_sf_ss;/* sample frequency and size */ unsigned char db3;/* not used, all zeros */ unsigned char db4_ca;/* channel allocation code */ -unsigned char db5_dminh_lsv;/* downmix inhibit & level-shit values */ +unsigned char db5_dminh_lsv;/* downmix inhibit & level-shift values */ };/****************************************************************************
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 332/354 drm/amdkfd: Use huge page size to check split svm range alignment
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaogang Chen <[email protected]>
[ Upstream commit bf2084a7b1d75d093b6a79df4c10142d49fbaa0e ]
When split svm ranges that have been mapped using huge page should use huge page size(2MB) to check split range alignment, not prange->granularity that means migration granularity.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 46 +++++++++++++++++++--------- 1 file changed, 32 insertions(+), 14 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +32 -14
@@ -1143,30 +1143,48 @@ static int svm_range_split_tail(struct svm_range *prange, uint64_t new_last, struct list_head *insert_list, struct list_head *remap_list) { + unsigned long last_align_down = ALIGN_DOWN(prange->last, 512); +unsigned long start_align =ALIGN (prange->start,512 ); +bool huge_page_mapping = last_align_down > start_align;struct svm_range *tail =NULL ; -int r =svm_range_split (prange, prange->start, new_last, &tail); +int r; -if (!r) { -list_add (&tail->list, insert_list); -if (!IS_ALIGNED (new_last +1 ,1UL << prange->granularity)) -list_add (&tail->update_list, remap_list); - } -return r; + r =svm_range_split (prange, prange->start, new_last, &tail); + +if (r) +return r; + +list_add (&tail->list, insert_list); + +if (huge_page_mapping && tail->start > start_align && + tail->start < last_align_down && (!IS_ALIGNED (tail->start,512 ))) +list_add (&tail->update_list, remap_list); + +return 0 ; }static int svm_range_split_head (struct svm_range *prange,uint64_t new_start,struct list_head *insert_list,struct list_head *remap_list) { +unsigned long last_align_down =ALIGN_DOWN (prange->last,512 ); +unsigned long start_align =ALIGN (prange->start,512 ); +bool huge_page_mapping = last_align_down > start_align;struct svm_range *head =NULL ; -int r =svm_range_split (prange, new_start, prange->last, &head); +int r; -if (!r) { -list_add (&head->list, insert_list); -if (!IS_ALIGNED (new_start,1UL << prange->granularity)) -list_add (&head->update_list, remap_list); - } -return r; + r =svm_range_split (prange, new_start, prange->last, &head); + +if (r) +return r; + +list_add (&head->list, insert_list); + +if (huge_page_mapping && head->last +1 > start_align && + head->last +1 < last_align_down && (!IS_ALIGNED (head->last,512 ))) +list_add (&head->update_list, remap_list); + +return 0 ; } static void
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 333/354 rtc: gamecube: Check the return value of ioremap()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit d1220e47e4bd2be8b84bc158f4dea44f2f88b226 ]
The function ioremap() in gamecube_rtc_read_offset_from_sram() can fail and return NULL, which is dereferenced without checking, leading to a NULL pointer dereference.
Add a check for the return value of ioremap() and return -ENOMEM on failure.
--- drivers/rtc/rtc-gamecube.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/rtc/rtc-gamecube.c +4 -0
@@ -242,6 +242,10 @@ static int gamecube_rtc_read_offset_from_sram(struct priv *d) } hw_srnprot =ioremap (res.start,resource_size (&res)); +if (!hw_srnprot) { +pr_err ("failed to ioremap hw_srnprot\n" ); +return -ENOMEM ; + } old =ioread32be (hw_srnprot);/* TODO: figure out why we use this magic constant. I obtained it by
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 334/354 ALSA: firewire-motu: add bounds check in put_user loop for DSP events
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 298e753880b6ea99ac30df34959a7a03b0878eed ]
In the DSP event handling code, a put_user() loop copies event data. When the user buffer size is not aligned to 4 bytes, it could overwrite beyond the buffer boundary.
Fix by adding a bounds check before put_user().
--- sound/firewire/motu/motu-hwdep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/firewire/motu/motu-hwdep.c +1 -1
@@ -75,7 +75,7 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,while (consumed < count &&snd_motu_register_dsp_message_parser_copy_event (motu, &ev)) { ptr = (u32 __user *)(buf + consumed); -if (put_user (ev, ptr)) +if (consumed +sizeof (ev) > count ||put_user (ev, ptr))return -EFAULT ; consumed +=sizeof (ev); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 335/354 ARM: 9464/1: fix input-only operand modification in load_unaligned_zeropad()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liyuan Pang <[email protected]>
[ Upstream commit edb924a7211c9aa7a4a415e03caee4d875e46b8e ]
In the inline assembly inside load_unaligned_zeropad(), the "addr" is
constrained as input-only operand. The compiler assumes that on exit
from the asm statement these operands contain the same values as they
had before executing the statement, but when kernel page fault happened, the assembly fixup code "bic %2 %2, #0x3" modify the value of "addr", which may lead to an unexpected behavior.
Use a temporary variable "tmp" to handle it, instead of modifying the input-only operand, just like what arm64's load_unaligned_zeropad() does.
--- arch/arm/include/asm/word-at-a-time.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/include/asm/word-at-a-time.h +5 -5
@@ -67,7 +67,7 @@ static inline unsigned long find_zero(unsigned long mask)*/ static inline unsigned long load_unaligned_zeropad (const void *addr) { -unsigned long ret, offset; +unsigned long ret, tmp;/* Load word from unaligned pointer addr */ asm(
@@ -75,9 +75,9 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)"2:\n" " .pushsection .text.fixup,\"ax\"\n" " .align 2\n" -"3: and %1, %2, #0x3\n" -" bic %2, %2, #0x3\n" -" ldr %0, [%2]\n" +"3: bic %1, %2, #0x3\n" +" ldr %0, [%1]\n" +" and %1, %2, #0x3\n" " lsl %1, %1, #0x3\n" #ifndef __ARMEB__" lsr %0, %0, %1\n"
@@ -90,7 +90,7 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)" .align 3\n" " .long 1b, 3b\n" " .popsection" - : "=&r" (ret), "=&r" (offset) + : "=&r" (ret), "=&r" (tmp) : "r" (addr), "Qo" (*(unsigned long *)addr)); return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 336/354 block: Use RCU in blk_mq_[un]quiesce_tagset() instead of set->tag_list_lock
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohamed Khalfella <[email protected]>
[ Upstream commit 59e25ef2b413c72da6686d431e7759302cfccafa ]
blk_mq_{add,del}_queue_tag_set() functions add and remove queues from tagset, the functions make sure that tagset and queues are marked as shared when two or more queues are attached to the same tagset. Initially a tagset starts as unshared and when the number of added queues reaches two, blk_mq_add_queue_tag_set() marks it as shared along with all the queues attached to it. When the number of attached queues drops to 1 blk_mq_del_queue_tag_set() need to mark both the tagset and the remaining queues as unshared.
Both functions need to freeze current queues in tagset before setting on unsetting BLK_MQ_F_TAG_QUEUE_SHARED flag. While doing so, both functions hold set->tag_list_lock mutex, which makes sense as we do not want queues to be added or deleted in the process. This used to work fine until commit 98d81f0df70c ("nvme: use blk_mq_[un]quiesce_tagset") made the nvme driver quiesce tagset instead of quiscing individual queues. blk_mq_quiesce_tagset() does the job and quiesce the queues in set->tag_list while holding set->tag_list_lock also.
This results in deadlock between two threads with these stacktraces:
__schedule+0x47c/0xbb0 ? timerqueue_add+0x66/0xb0 schedule+0x1c/0xa0 schedule_preempt_disabled+0xa/0x10 __mutex_lock.constprop.0+0x271/0x600 blk_mq_quiesce_tagset+0x25/0xc0 nvme_dev_disable+0x9c/0x250 nvme_timeout+0x1fc/0x520 blk_mq_handle_expired+0x5c/0x90 bt_iter+0x7e/0x90 blk_mq_queue_tag_busy_iter+0x27e/0x550 ? __blk_mq_complete_request_remote+0x10/0x10 ? __blk_mq_complete_request_remote+0x10/0x10 ? __call_rcu_common.constprop.0+0x1c0/0x210 blk_mq_timeout_work+0x12d/0x170 process_one_work+0x12e/0x2d0 worker_thread+0x288/0x3a0 ? rescuer_thread+0x480/0x480 kthread+0xb8/0xe0 ? kthread_park+0x80/0x80 ret_from_fork+0x2d/0x50 ? kthread_park+0x80/0x80 ret_from_fork_asm+0x11/0x20 __schedule+0x47c/0xbb0 ? xas_find+0x161/0x1a0 schedule+0x1c/0xa0 blk_mq_freeze_queue_wait+0x3d/0x70 ? destroy_sched_domains_rcu+0x30/0x30 blk_mq_update_tag_set_shared+0x44/0x80 blk_mq_exit_queue+0x141/0x150 del_gendisk+0x25a/0x2d0 nvme_ns_remove+0xc9/0x170 nvme_remove_namespaces+0xc7/0x100 nvme_remove+0x62/0x150 pci_device_remove+0x23/0x60 device_release_driver_internal+0x159/0x200 unbind_store+0x99/0xa0 kernfs_fop_write_iter+0x112/0x1e0 vfs_write+0x2b1/0x3d0 ksys_write+0x4e/0xb0 do_syscall_64+0x5b/0x160 entry_SYSCALL_64_after_hwframe+0x4b/0x53
The top stacktrace is showing nvme_timeout() called to handle nvme command timeout. timeout handler is trying to disable the controller and as a first step, it needs to blk_mq_quiesce_tagset() to tell blk-mq not to call queue callback handlers. The thread is stuck waiting for set->tag_list_lock as it tries to walk the queues in set->tag_list.
The lock is held by the second thread in the bottom stack which is waiting for one of queues to be frozen. The queue usage counter will drop to zero after nvme_timeout() finishes, and this will not happen because the thread will wait for this mutex forever.
Given that [un]quiescing queue is an operation that does not need to sleep, update blk_mq_[un]quiesce_tagset() to use RCU instead of taking set->tag_list_lock, update blk_mq_{add,del}_queue_tag_set() to use RCU safe list operations. Also, delete INIT_LIST_HEAD(&q->tag_set_list) in blk_mq_del_queue_tag_set() because we can not re-initialize it while the list is being traversed under RCU. The deleted queue will not be added/deleted to/from a tagset and it will be freed in blk_free_queue() after the end of RCU grace period.
--- block/blk-mq.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
block/blk-mq.c +8 -9
@@ -364,12 +364,12 @@ void blk_mq_quiesce_tagset(struct blk_mq_tag_set *set) {struct request_queue *q; -mutex_lock (&set->tag_list_lock); -list_for_each_entry (q, &set->tag_list, tag_set_list) { +rcu_read_lock (); +list_for_each_entry_rcu (q, &set->tag_list, tag_set_list) {if (!blk_queue_skip_tagset_quiesce (q))blk_mq_quiesce_queue_nowait (q); } -mutex_unlock (&set->tag_list_lock); +rcu_read_unlock ();blk_mq_wait_quiesce_done (set); }
@@ -379,12 +379,12 @@ void blk_mq_unquiesce_tagset(struct blk_mq_tag_set *set) {struct request_queue *q; -mutex_lock (&set->tag_list_lock); -list_for_each_entry (q, &set->tag_list, tag_set_list) { +rcu_read_lock (); +list_for_each_entry_rcu (q, &set->tag_list, tag_set_list) {if (!blk_queue_skip_tagset_quiesce (q))blk_mq_unquiesce_queue (q); } -mutex_unlock (&set->tag_list_lock); +rcu_read_unlock (); }EXPORT_SYMBOL_GPL (blk_mq_unquiesce_tagset);
@@ -4255,7 +4255,7 @@ static void blk_mq_del_queue_tag_set(struct request_queue *q)struct blk_mq_tag_set *set = q->tag_set;mutex_lock (&set->tag_list_lock); -list_del (&q->tag_set_list); +list_del_rcu (&q->tag_set_list);if (list_is_singular (&set->tag_list)) {/* just transitioned to unshared */ set->flags &= ~BLK_MQ_F_TAG_QUEUE_SHARED ;
@@ -4263,7 +4263,6 @@ static void blk_mq_del_queue_tag_set(struct request_queue *q)blk_mq_update_tag_set_shared (set, false); }mutex_unlock (&set->tag_list_lock); -INIT_LIST_HEAD (&q->tag_set_list); } static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set,
@@ -4282,7 +4281,7 @@ static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set, }if (set->flags &BLK_MQ_F_TAG_QUEUE_SHARED )queue_set_hctx_shared (q, true); -list_add_tail (&q->tag_set_list, &set->tag_list); +list_add_tail_rcu (&q->tag_set_list, &set->tag_list);mutex_unlock (&set->tag_list_lock); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 337/354 block: return unsigned int from queue_dma_alignment
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit ed5db174cf39374215934f21b04639a7a1513023 ]
The underlying limit is defined as an unsigned int, so return that from queue_dma_alignment as well.
Stable-dep-of: 2c38ec934ddf ("block: fix cached zone reports on devices with native zone append")
--- include/linux/blkdev.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/blkdev.h +1 -1
@@ -1450,7 +1450,7 @@ static inline bool bdev_is_zone_start(struct block_device *bdev,int blk_zone_issue_zeroout (struct block_device *bdev,sector_t sector,sector_t nr_sects,gfp_t gfp_mask); -static inline int queue_dma_alignment (const struct request_queue *q) +static inline unsigned int queue_dma_alignment (const struct request_queue *q) {return q->limits.dma_alignment; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 338/354 dm-raid: fix possible NULL dereference with undefined raid type
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Simakov <[email protected]>
[ Upstream commit 2f6cfd6d7cb165a7af8877b838a9f6aab4159324 ]
rs->raid_type is assigned from get_raid_type_by_ll(), which may return NULL. This NULL value could be dereferenced later in the condition 'if (!(rs_is_raid10(rs) && rt_is_raid0(rs->raid_type)))'.
Add a fail-fast check to return early with an error if raid_type is NULL, similar to other uses of this function.
Found by Linux Verification Center (linuxtesting.org) with Svace.
--- drivers/md/dm-raid.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/md/dm-raid.c +2 -0
@@ -2291,6 +2291,8 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev) mddev->reshape_position =le64_to_cpu (sb->reshape_position); rs->raid_type =get_raid_type_by_ll (mddev->level, mddev->layout); +if (!rs->raid_type) +return -EINVAL ; } }else {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 339/354 dm log-writes: Add missing set_freezable() for freezable kthread
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit ab08f9c8b363297cafaf45475b08f78bf19b88ef ]
The log_writes_kthread() calls try_to_freeze() but lacks set_freezable(), rendering the freeze attempt ineffective since kernel threads are non-freezable by default. This prevents proper thread suspension during system suspend/hibernate.
Add set_freezable() to explicitly mark the thread as freezable.
--- drivers/md/dm-log-writes.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-log-writes.c +1 -0
@@ -432,6 +432,7 @@ static int log_writes_kthread(void *arg)struct log_writes_c *lc = arg;sector_t sector =0 ; +set_freezable ();while (!kthread_should_stop ()) {bool super = false;bool logging_enabled;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 340/354 efi/cper: Add a new helper function to print bitmasks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit a976d790f49499ccaa0f991788ad8ebf92e7fd5c ]
Add a helper function to print a string with names associated to each bit field.
A typical example is:
const char * const bits[] = {
"bit 3 name",
"bit 4 name",
"bit 5 name",
};
char str[120];
unsigned int bitmask = BIT(3) | BIT(5);
#define MASK GENMASK(5,3)
cper_bits_to_str(str, sizeof(str), FIELD_GET(MASK, bitmask),
bits, ARRAY_SIZE(bits));The above code fills string "str" with "bit 3 name|bit 5 name".
--- drivers/firmware/efi/cper.c | 60 +++++++++++++++++++++++++++++++++++++ include/linux/cper.h | 2 ++ 2 files changed, 62 insertions(+)
drivers/firmware/efi/cper.c +60 -0
@@ -12,6 +12,7 @@* Specification version 2.4. */ +#include <linux/bitmap.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/time.h>
@@ -106,6 +107,65 @@ void cper_print_bits(const char *pfx, unsigned int bits,printk ("%s\n" , buf); } +/** +* cper_bits_to_str - return a string for set bits +* @buf: buffer to store the output string +* @buf_size: size of the output string buffer +* @bits: bit mask +* @strs: string array, indexed by bit position +* @strs_size: size of the string array: @strs +* +* Add to @buf the bitmask in hexadecimal. Then, for each set bit in @bits, +* add the corresponding string describing the bit in @strs to @buf. +* +* A typical example is:: +* +* const char * const bits[] = { +* "bit 3 name", +* "bit 4 name", +* "bit 5 name", +* }; +* char str[120]; +* unsigned int bitmask = BIT(3) | BIT(5); +* #define MASK GENMASK(5,3) +* +* cper_bits_to_str(str, sizeof(str), FIELD_GET(MASK, bitmask), +* bits, ARRAY_SIZE(bits)); +* +* The above code fills the string ``str`` with ``bit 3 name|bit 5 name``. +* +* Return: number of bytes stored or an error code if lower than zero. +*/ +int cper_bits_to_str (char *buf,int buf_size,unsigned long bits, +const char *const strs[],unsigned int strs_size) +{ +int len = buf_size; +char *str = buf; +int i, size; + + *buf ='\0' ; + +for_each_set_bit (i, &bits, strs_size) { +if (!(bits &BIT_ULL (i))) +continue ; + +if (*buf && len >0 ) { + *str ='|' ; + len--; + str++; + } + + size =strscpy (str, strs[i], len); +if (size <0 ) +return size; + + len -= size; + str += size; + } +return len - buf_size; +} +EXPORT_SYMBOL_GPL (cper_bits_to_str); +static const char *const proc_type_strs[] = {"IA32/X64" ,"IA64" ,
include/linux/cper.h +2 -0
@@ -584,6 +584,8 @@ const char *cper_mem_err_type_str(unsigned int);const char *cper_mem_err_status_str (u64 status);void cper_print_bits (const char *prefix,unsigned int bits,const char *const strs[],unsigned int strs_size); +int cper_bits_to_str (char *buf,int buf_size,unsigned long bits, +const char *const strs[],unsigned int strs_size);void cper_mem_err_pack (const struct cper_sec_mem_err *,struct cper_mem_err_compact *); const char *cper_mem_err_unpack(struct trace_seq *,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 341/354 efi/cper: Adjust infopfx size to accept an extra space
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 8ad2c72e21efb3dc76c5b14089fa7984cdd87898 ]
Compiling with W=1 with werror enabled produces an error:
drivers/firmware/efi/cper-arm.c: In function ‘cper_print_proc_arm’:drivers/firmware/efi/cper-arm.c:298:64: error: ‘snprintf’ output may be truncated before the last format character [-Werror=format-truncation=]
298 | snprintf(infopfx, sizeof(infopfx), "%s ", newpfx);
| ^drivers/firmware/efi/cper-arm.c:298:25: note: ‘snprintf’ output between 2 and 65 bytes into a destination of size 64
298 | snprintf(infopfx, sizeof(infopfx), "%s ", newpfx);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~As the logic there adds an space at the end of infopx buffer. Add an extra space to avoid such warning.
--- drivers/firmware/efi/cper-arm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firmware/efi/cper-arm.c +1 -1
@@ -240,7 +240,7 @@ void cper_print_proc_arm(const char *pfx,int i, len, max_ctx_type;struct cper_arm_err_info *err_info;struct cper_arm_ctx_info *ctx_info; -char newpfx[64 ], infopfx[64 ]; +char newpfx[64 ], infopfx[ARRAY_SIZE (newpfx) +1 ];printk ("%sMIDR: 0x%016llx\n" , pfx, proc->midr);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 342/354 efi/cper: align ARM CPER type with UEFI 2.9A/2.10 specs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 96b010536ee020e716d28d9b359a4bcd18800aeb ]
Up to UEFI spec 2.9, the type byte of CPER struct for ARM processor was defined simply as:
Type at byte offset 4:
- Cache error
- TLB Error
- Bus Error
- Micro-architectural Error
All other values are reserved
Yet, there was no information about how this would be encoded.
Spec 2.9A errata corrected it by defining:
- Bit 1 - Cache Error
- Bit 2 - TLB Error
- Bit 3 - Bus Error
- Bit 4 - Micro-architectural Error
All other values are reserved
That actually aligns with the values already defined on older versions at N.2.4.1. Generic Processor Error Section.
Spec 2.10 also preserve the same encoding as 2.9A.
Adjust CPER and GHES handling code for both generic and ARM processors to properly handle UEFI 2.9A and 2.10 encoding.
--- drivers/acpi/apei/ghes.c | 16 +++++++---- drivers/firmware/efi/cper-arm.c | 50 ++++++++++++++++----------------- include/linux/cper.h | 10 +++---- 3 files changed, 39 insertions(+), 37 deletions(-)
drivers/acpi/apei/ghes.c +10 -6
@@ -22,6 +22,7 @@#include <linux/moduleparam.h> #include <linux/init.h> #include <linux/acpi.h> +#include <linux/bitfield.h> #include <linux/io.h> #include <linux/interrupt.h> #include <linux/timer.h>
@@ -531,6 +532,7 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, {struct cper_sec_proc_arm *err =acpi_hest_get_payload (gdata);int flags = sync ?MF_ACTION_REQUIRED :0 ; +char error_type[120 ];bool queued = false;int sec_sev, i;char *p;
@@ -543,9 +545,8 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, p = (char *)(err +1 );for (i =0 ; i < err->err_info_num; i++) {struct cper_arm_err_info *err_info = (struct cper_arm_err_info *)p; -bool is_cache = (err_info->type ==CPER_ARM_CACHE_ERROR ); +bool is_cache = err_info->type &CPER_ARM_CACHE_ERROR ;bool has_pa = (err_info->validation_bits &CPER_ARM_INFO_VALID_PHYSICAL_ADDR ); -const char *error_type ="unknown error" ;/* * The field (err_info->error_info & BIT(26)) is fixed to set to
@@ -559,12 +560,15 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,continue ; } -if (err_info->type <ARRAY_SIZE (cper_proc_error_type_strs)) - error_type = cper_proc_error_type_strs[err_info->type]; +cper_bits_to_str (error_type,sizeof (error_type), +FIELD_GET (CPER_ARM_ERR_TYPE_MASK , err_info->type), + cper_proc_error_type_strs, +ARRAY_SIZE (cper_proc_error_type_strs)); pr_warn_ratelimited(FW_WARN GHES_PFX -"Unhandled processor error type: %s\n" , - error_type); +"Unhandled processor error type 0x%02x: %s%s\n" , + err_info->type, error_type, + (err_info->type & ~CPER_ARM_ERR_TYPE_MASK) ? " with reserved bit(s)" : ""); p += err_info->length; }
drivers/firmware/efi/cper-arm.c +24 -26
97 lines not on this page · raw message
include/linux/cper.h +5 -5
@@ -293,11 +293,11 @@ enum {#define CPER_ARM_INFO_FLAGS_PROPAGATED BIT(2)#define CPER_ARM_INFO_FLAGS_OVERFLOW BIT(3) -#define CPER_ARM_CACHE_ERROR 0 -#define CPER_ARM_TLB_ERROR 1 -#define CPER_ARM_BUS_ERROR 2 -#define CPER_ARM_VENDOR_ERROR 3 -#define CPER_ARM_MAX_TYPE CPER_ARM_VENDOR_ERROR +#define CPER_ARM_ERR_TYPE_MASK GENMASK(4,1) +#define CPER_ARM_CACHE_ERROR BIT(1) +#define CPER_ARM_TLB_ERROR BIT(2) +#define CPER_ARM_BUS_ERROR BIT(3) +#define CPER_ARM_VENDOR_ERROR BIT(4)#define CPER_ARM_ERR_VALID_TRANSACTION_TYPE BIT(0)#define CPER_ARM_ERR_VALID_OPERATION_TYPE BIT(1)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 343/354 scsi: imm: Fix use-after-free bug caused by unfinished delayed work
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
[ Upstream commit ab58153ec64fa3fc9aea09ca09dc9322e0b54a7c ]
The delayed work item 'imm_tq' is initialized in imm_attach() and scheduled via imm_queuecommand() for processing SCSI commands. When the IMM parallel port SCSI host adapter is detached through imm_detach(), the imm_struct device instance is deallocated.
However, the delayed work might still be pending or executing when imm_detach() is called, leading to use-after-free bugs when the work function imm_interrupt() accesses the already freed imm_struct memory.
The race condition can occur as follows:
CPU 0(detach thread) | CPU 1
| imm_queuecommand()
| imm_queuecommand_lck()
imm_detach() | schedule_delayed_work()
kfree(dev) //FREE | imm_interrupt()
| dev = container_of(...) //USE
dev-> //USEAdd disable_delayed_work_sync() in imm_detach() to guarantee proper cancellation of the delayed work item before imm_struct is deallocated.
--- drivers/scsi/imm.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/imm.c +1 -0
@@ -1261,6 +1261,7 @@ static void imm_detach(struct parport *pb)imm_struct *dev;list_for_each_entry (dev, &imm_hosts, list) {if (dev->dev->port == pb) { +disable_delayed_work_sync (&dev->imm_tq);list_del_init (&dev->list);scsi_remove_host (dev->host);scsi_host_put (dev->host);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 344/354 irqchip/mchp-eic: Fix error code in mchp_eic_domain_alloc()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 7dbc0d40d8347bd9de55c904f59ea44bcc8dedb7 ]
If irq_domain_translate_twocell() sets "hwirq" to >= MCHP_EIC_NIRQ (2) then it results in an out of bounds access.
The code checks for invalid values, but doesn't set the error code. Return -EINVAL in that case, instead of returning success.
--- drivers/irqchip/irq-mchp-eic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-mchp-eic.c +1 -1
@@ -166,7 +166,7 @@ static int mchp_eic_domain_alloc(struct irq_domain *domain, unsigned int virq, ret =irq_domain_translate_twocell (domain, fwspec, &hwirq, &type);if (ret || hwirq >=MCHP_EIC_NIRQ ) -return ret; +return ret ?: -EINVAL ;switch (type) {case IRQ_TYPE_EDGE_RISING :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 345/354 ocfs2: fix memory leak in ocfs2_merge_rec_left()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit 2214ec4bf89d0fd27717322d3983a2f3b469c7f3 ]
In 'ocfs2_merge_rec_left()', do not reset 'left_path' to NULL after move, thus allowing 'ocfs2_free_path()' to free it before return.
--- fs/ocfs2/alloc.c | 1 - 1 file changed, 1 deletion(-)
fs/ocfs2/alloc.c +0 -1
@@ -3654,7 +3654,6 @@ static int ocfs2_merge_rec_left(struct ocfs2_path *right_path,* So we use the new rightmost path. */ ocfs2_mv_path (right_path, left_path); - left_path =NULL ; }else ocfs2_complete_edge_insert (handle, left_path, right_path, subtree_index);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 346/354 LoongArch: Add machine_kexec_mask_interrupts() implementation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
Commit 863a320dc6fd7c855f47da4b ("LoongArch: Mask all interrupts during kexec/kdump") is backported to LTS branches, but they lack a generic machine_kexec_mask_interrupts() implementation, so add an arch-specific one.
--- arch/loongarch/kernel/machine_kexec.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
arch/loongarch/kernel/machine_kexec.c +22 -0
@@ -136,6 +136,28 @@ void kexec_reboot(void)BUG (); } +static void machine_kexec_mask_interrupts (void ) +{ +unsigned int i; +struct irq_desc *desc; + +for_each_irq_desc (i, desc) { +struct irq_chip *chip; + + chip =irq_desc_get_chip (desc); +if (!chip) +continue ; + +if (chip->irq_eoi &&irqd_irq_inprogress (&desc->irq_data)) + chip->irq_eoi (&desc->irq_data); + +if (chip->irq_mask) + chip->irq_mask (&desc->irq_data); + +if (chip->irq_disable && !irqd_irq_disabled (&desc->irq_data)) + chip->irq_disable (&desc->irq_data); + } +}#ifdef CONFIG_SMP static void kexec_shutdown_secondary (void *regs)
Greg Kroah-Hartman
maintainerPATCH 347/354 net: lan743x: Allocate rings outside ZONE_DMA
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thangaraj Samynathan <[email protected]>
commit 8a8f3f4991761a70834fe6719d09e9fd338a766e upstream.
The driver allocates ring elements using GFP_DMA flags. There is no dependency from LAN743x hardware on memory allocation should be in DMA_ZONE. Hence modifying the flags to use only GFP_ATOMIC. This is consistent with other callers of lan743x_rx_init_ring_element().
--- drivers/net/ethernet/microchip/lan743x_main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/microchip/lan743x_main.c +1 -2
@@ -2494,8 +2494,7 @@ static int lan743x_rx_process_buffer(str/* save existing skb, allocate new skb and map to dma */ skb = buffer_info->skb; -if (lan743x_rx_init_ring_element (rx, rx->last_head, -GFP_ATOMIC |GFP_DMA )) { +if (lan743x_rx_init_ring_element (rx, rx->last_head,GFP_ATOMIC )) {/* failed to allocate next skb. * Memory is very low. * Drop this packet and reuse buffer.
Greg Kroah-Hartman
maintainerPATCH 348/354 net: dst: introduce dst->dev_rcu
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit caedcc5b6df1b2e2b5f39079e3369c1d4d5c5f50 ]
Followup of commit 88fe14253e1818 ("net: dst: add four helpers to annotate data-races around dst->dev").
We want to gradually add explicit RCU protection to dst->dev, including lockdep support.
Add an union to alias dst->dev_rcu and dst->dev.
Add dst_dev_net_rcu() helper.
Stable-dep-of: 50c127a69cd62 ("Replace three dst_dev() with a lockdep enabled helper.")
--- include/net/dst.h | 16 +++++++++++----- net/core/dst.c | 2 +- net/ipv4/route.c | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-)
include/net/dst.h +11 -5
@@ -24,7 +24,10 @@struct sk_buff ;struct dst_entry { -struct net_device *dev; +union { +struct net_device *dev; +struct net_device __rcu *dev_rcu; + };struct dst_ops *ops;unsigned long _metrics;unsigned long expires;
@@ -568,9 +571,12 @@ static inline struct net_device *dst_devstatic inline struct net_device *dst_dev_rcu (const struct dst_entry *dst) { -/* In the future, use rcu_dereference(dst->dev) */ -WARN_ON_ONCE (!rcu_read_lock_held ()); -return READ_ONCE (dst->dev); +return rcu_dereference (dst->dev_rcu); +} + +static inline struct net *dst_dev_net_rcu (const struct dst_entry *dst) +{ +return dev_net_rcu (dst_dev_rcu (dst)); }static inline struct net_device *skb_dst_dev (const struct sk_buff *skb)
@@ -590,7 +596,7 @@ static inline struct net *skb_dst_dev_nestatic inline struct net *skb_dst_dev_net_rcu (const struct sk_buff *skb) { -return dev_net_rcu (skb_dst_dev (skb)); +return dev_net_rcu (skb_dst_dev_rcu (skb)); }struct dst_entry *dst_blackhole_check (struct dst_entry *dst,u32 cookie);
net/core/dst.c +1 -1
@@ -150,7 +150,7 @@ void dst_dev_put(struct dst_entry *dst) dst->ops->ifdown (dst, dev);WRITE_ONCE (dst->input, dst_discard);WRITE_ONCE (dst->output, dst_discard_out); -WRITE_ONCE (dst->dev, blackhole_netdev); +rcu_assign_pointer (dst->dev_rcu, blackhole_netdev);netdev_ref_replace (dev, blackhole_netdev, &dst->dev_tracker,GFP_ATOMIC ); }
net/ipv4/route.c +2 -2
@@ -1030,7 +1030,7 @@ static void __ip_rt_update_pmtu(struct rreturn ;rcu_read_lock (); - net =dev_net_rcu (dst_dev (dst)); + net =dst_dev_net_rcu (dst);if (mtu < net->ipv4.ip_rt_min_pmtu) { lock = true; mtu =min (old_mtu, net->ipv4.ip_rt_min_pmtu);
@@ -1328,7 +1328,7 @@ static unsigned int ipv4_default_advmss(struct net *net;rcu_read_lock (); - net =dev_net_rcu (dst_dev (dst)); + net =dst_dev_net_rcu (dst); advmss = max_t(unsigned int, ipv4_mtu(dst) - header_size, net->ipv4.ip_rt_min_advmss);rcu_read_unlock ();
Greg Kroah-Hartman
maintainerPATCH 349/354 tcp_metrics: use dst_dev_net_rcu()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 50c127a69cd6285300931853b352a1918cfa180f ]
Replace three dst_dev() with a lockdep enabled helper.
--- net/ipv4/tcp_metrics.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/ipv4/tcp_metrics.c +3 -3
@@ -170,7 +170,7 @@ static struct tcp_metrics_block *tcpm_nestruct net *net;spin_lock_bh (&tcp_metrics_lock); - net =dev_net_rcu (dst_dev (dst)); + net =dst_dev_net_rcu (dst);/* While waiting for the spin-lock the cache might have been populated * with this entry and so we have to check again.
@@ -273,7 +273,7 @@ static struct tcp_metrics_block *__tcp_greturn NULL ; } - net =dev_net_rcu (dst_dev (dst)); + net =dst_dev_net_rcu (dst); hash ^=net_hash_mix (net); hash =hash_32 (hash, tcp_metrics_hash_log);
@@ -318,7 +318,7 @@ static struct tcp_metrics_block *tcp_getelse return NULL ; - net =dev_net_rcu (dst_dev (dst)); + net =dst_dev_net_rcu (dst); hash ^=net_hash_mix (net); hash =hash_32 (hash, tcp_metrics_hash_log);
Greg Kroah-Hartman
maintainerPATCH 350/354 usb: gadget: tegra-xudc: Always reinitialize data toggle when clear halt
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotien Hsu <[email protected]>
commit 2585973c7f9ee31d21e5848c996fab2521fd383d upstream.
The driver previously skipped handling ClearFeature(ENDPOINT_HALT) when the endpoint was already not halted. This prevented the controller from resetting the data sequence number and reinitializing the endpoint state.
According to USB 3.2 specification Rev. 1.1, section 9.4.5, ClearFeature(ENDPOINT_HALT) must always reset the data sequence and set the stream state machine to Disabled, regardless of whether the endpoint was halted.
Remove the early return so that ClearFeature(ENDPOINT_HALT) always resets the endpoint sequence state as required by the specification.
--- drivers/usb/gadget/udc/tegra-xudc.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/usb/gadget/udc/tegra-xudc.c +0 -6
@@ -1554,12 +1554,6 @@ static int __tegra_xudc_ep_set_halt(strureturn -ENOTSUPP ; } -if (!!(xudc_readl (xudc,EP_HALT ) &BIT (ep->index)) == halt) { -dev_dbg (xudc->dev,"EP %u already %s\n" , ep->index, - halt ?"halted" :"not halted" ); -return 0 ; - } -if (halt) {ep_halt (xudc, ep->index); }else {
Greg Kroah-Hartman
maintainerPATCH 351/354 usb: phy: Initialize struct usb_phy list_head
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Diogo Ivo <[email protected]>
commit c69ff68b097b0f53333114f1b2c3dc128f389596 upstream.
As part of the registration of a new 'struct usb_phy' with the USB PHY core via either usb_add_phy(struct usb_phy *x, ...) or usb_add_phy_dev(struct usb_phy *x) these functions call list_add_tail(&x->head, phy_list) in order for the new instance x to be stored in phy_list, a static list kept internally by the core.
After 7d21114dc6a2 ("usb: phy: Introduce one extcon device into usb phy") when executing either of the registration functions above it is possible that usb_add_extcon() fails, leading to either function returning before the call to list_add_tail(), leaving x->head uninitialized.
Then, when a driver tries to undo the failed registration by calling usb_remove_phy(struct usb_phy *x) there will be an unconditional call to list_del(&x->head) acting on an uninitialized variable, and thus a possible NULL pointer dereference.
Fix this by initializing x->head before usb_add_extcon() has a chance to fail. Note that this was not needed before 7d21114dc6a2 since list_add_phy() was executed unconditionally and it guaranteed that x->head was initialized.
--- drivers/usb/phy/phy.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/phy/phy.c +4 -0
@@ -672,6 +672,8 @@ int usb_add_phy(struct usb_phy *x, enumreturn -EINVAL ; } +INIT_LIST_HEAD (&x->head); +usb_charger_init (x); ret =usb_add_extcon (x);if (ret)
@@ -722,6 +724,8 @@ int usb_add_phy_dev(struct usb_phy *x)return -EINVAL ; } +INIT_LIST_HEAD (&x->head); +usb_charger_init (x); ret =usb_add_extcon (x);if (ret)
Greg Kroah-Hartman
maintainerPATCH 352/354 usb: dwc3: dwc3_power_off_all_roothub_ports: Use ioremap_np when required
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Peter <[email protected]>
commit 5ed9cc71432a8adf3c42223c935f714aac29901b upstream.
On Apple Silicon machines we can't use ioremap() / Device-nGnRE to map most regions but must use ioremap_np() / Device-nGnRnE whenever IORESOURCE_MEM_NONPOSTED is set. Make sure this is also done inside dwc3_power_off_all_roothub_ports to prevent SErrors.
--- drivers/usb/dwc3/host.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/dwc3/host.c +4 -1
@@ -37,7 +37,10 @@ static void dwc3_power_off_all_roothub_p/* xhci regs is not mapped yet, do it temperary here */ if (dwc->xhci_resources[0 ].start) { - xhci_regs =ioremap (dwc->xhci_resources[0 ].start,DWC3_XHCI_REGS_END ); +if (dwc->xhci_resources[0 ].flags &IORESOURCE_MEM_NONPOSTED ) + xhci_regs =ioremap_np (dwc->xhci_resources[0 ].start,DWC3_XHCI_REGS_END ); +else + xhci_regs =ioremap (dwc->xhci_resources[0 ].start,DWC3_XHCI_REGS_END );if (!xhci_regs) {dev_err (dwc->dev,"Failed to ioremap xhci_regs\n" );return ;
Greg Kroah-Hartman
maintainerPATCH 353/354 ALSA: dice: fix buffer overflow in detect_stream_formats()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
commit 324f3e03e8a85931ce0880654e3c3eb38b0f0bba upstream.
The function detect_stream_formats() reads the stream_count value directly from a FireWire device without validating it. This can lead to out-of-bounds writes when a malicious device provides a stream_count value greater than MAX_STREAMS.
Fix by applying the same validation to both TX and RX stream counts in detect_stream_formats().
--- sound/firewire/dice/dice-extension.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/firewire/dice/dice-extension.c +2 -2
@@ -116,7 +116,7 @@ static int detect_stream_formats(structbreak ; base_offset +=EXT_APP_STREAM_ENTRIES ; - stream_count =be32_to_cpu (reg[0 ]); + stream_count = min_t(unsigned int, be32_to_cpu(reg[0]), MAX_STREAMS); err = read_stream_entries(dice, section_addr, base_offset, stream_count, mode, dice->tx_pcm_chs,
@@ -125,7 +125,7 @@ static int detect_stream_formats(structbreak ; base_offset += stream_count *EXT_APP_STREAM_ENTRY_SIZE ; - stream_count =be32_to_cpu (reg[1 ]); + stream_count = min_t(unsigned int, be32_to_cpu(reg[1]), MAX_STREAMS); err = read_stream_entries(dice, section_addr, base_offset, stream_count, mode, dice->rx_pcm_chs,
Greg Kroah-Hartman
maintainerPATCH 354/354 ALSA: wavefront: Fix integer overflow in sample size validation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
commit 0c4a13ba88594fd4a27292853e736c6b4349823d upstream.
The wavefront_send_sample() function has an integer overflow issue when validating sample size. The header->size field is u32 but gets cast to int for comparison with dev->freemem
Fix by using unsigned comparison to avoid integer overflow.
--- sound/isa/wavefront/wavefront_synth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/isa/wavefront/wavefront_synth.c +2 -2
@@ -950,9 +950,9 @@ wavefront_send_sample (snd_wavefront_t *if (header->size) { dev->freemem =wavefront_freemem (dev); -if (dev->freemem < (int )header->size) { +if (dev->freemem <0 || dev->freemem < header->size) {dev_err (dev->card->dev, -"insufficient memory to load %d byte sample.\n" , +"insufficient memory to load %u byte sample.\n" , header->size);return -ENOMEM ; }
# Librecast Test Results
020/020 [ OK ] liblcrq
010/010 [ OK ] libmld
120/120 [ OK ] liblibrecast
CPU/kernel: Linux auntie 6.12.63-rc1-gf8100cfd690d #1 SMP PREEMPT_DYNAMIC Tue Dec 16 11:43:56 -00 2025 x86_64 AMD Ryzen 9 9950X 16-Core Processor AuthenticAMD GNU/Linux
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.63-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.12.y
Best regards,
Pavel
Signature · 2 lines
In cooperation with DENX Software Engineering GmbH, HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.63-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
hello
Compiled and booted 6.12.63-rc1+
No typical new regressions from dmesg.
As per dmidecode command.
Version: AMD Ryzen 3 3250U with Radeon Graphics
Processor Information
Socket Designation: FP5
Type: Central Processor
Family: Zen
Manufacturer: Advanced Micro Devices, Inc.
ID: 81 0F 81 00 FF FB 8B 17
Signature: Family 23, Model 24, Stepping 1
--
software engineer
rajagiri school of engineering and technology
cover 6.12.63-rc1 review
In reply to Greg Kroah-HartmanQuoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.63-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
1.
I'm seeing the following build failures on s390 due to,
## Build errors:arch/s390/include/asm/fpu-insn.h: In function 'fpu_vst':arch/s390/include/asm/fpu-insn.h:381:36: error: 'size' undeclared (first use in this function); did you mean 'ksize'?
381 | kmsan_unpoison_memory(vxr, size);
| ^~~~
| ksizeThe commit point to,
s390/fpu: Fix false-positive kmsan report in fpu_vstl() [ Upstream commit 14e4e4175b64dd9216b522f6ece8af6997d063b2 ]
2.
The clang-21 allyesconfig builds failed on on arm, arm64, riscv and x86_64 as it was reported on the 6.18.2-rc1 and 6.17.13-rc2.
## Build
* kernel: 6.12.63-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: f8100cfd690d4b1fd45bdba30428b0eab2980dc0
* git describe: v6.12.60-537-gf8100cfd690d
* test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.12.y/build/v6.12.60-537-gf8100cfd690d
## Test Regressions (compared to v6.12.60-182-g4112049d7836)
* s390, build
- gcc-14-allmodconfig
- gcc-14-allnoconfig
- gcc-14-defconfig
- gcc-14-lkftconfig-hardening
- gcc-14-tinyconfig
- gcc-8-allnoconfig
- gcc-8-defconfig-fe40093d
- gcc-8-lkftconfig-hardening
- gcc-8-tinyconfig
* arm, arm64, riscv, x86_64, build
- clang-21-allmodconfig
- clang-21-allyesconfig
## Metric Regressions (compared to v6.12.60-182-g4112049d7836)
## Test Fixes (compared to v6.12.60-182-g4112049d7836)
## Metric Fixes (compared to v6.12.60-182-g4112049d7836)
## Test result summary
total: 84881, pass: 70888, fail: 3200, skip: 10584, xfail: 209
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 139 total, 137 passed, 2 failed
* arm64: 57 total, 51 passed, 6 failed
* i386: 18 total, 18 passed, 0 failed
* mips: 34 total, 33 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 40 total, 39 passed, 1 failed
* riscv: 25 total, 24 passed, 1 failed
* s390: 22 total, 12 passed, 10 failed
* sh: 5 total, 5 passed, 0 failed
* sparc: 4 total, 3 passed, 1 failed
* x86_64: 49 total, 46 passed, 3 failed
## Test suites summary
* boot
* commands
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-exec
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-kcmp
* kselftest-kvm
* kselftest-membarrier
* kselftest-memfd
* kselftest-mincore
* kselftest-mm
* kselftest-mqueue
* kselftest-net
* kselftest-net-mptcp
* kselftest-openat2
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-tc-testing
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user_events
* kselftest-vDSO
* kselftest-x86
* kunit
* kvm-unit-tests
* lava
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-build-clang
* log-parser-build-gcc
* log-parser-test
* ltp-capability
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-hugetlb
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* perf
* rcutorture
* rt-tests-cyclicdeadline
* rt-tests-pi-stress
* rt-tests-pmqtest
* rt-tests-rt-migrate-test
* rt-tests-signaltest
--
Linaro LKFT
https://lkft.linaro.org
Greg KH
maintainerQuoted 27 lines · Naresh Kamboju
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.63-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
1.
I'm seeing the following build failures on s390 due to,## Build errors:
arch/s390/include/asm/fpu-insn.h: In function 'fpu_vst':arch/s390/include/asm/fpu-insn.h:381:36: error: 'size' undeclared (first use in this function); did you mean 'ksize'?
Quoted 8 lines
381 | kmsan_unpoison_memory(vxr, size); | ^~~~ | ksizeThe commit point to,
s390/fpu: Fix false-positive kmsan report infpu_vstl()[ Upstream commit14e4e4175b64dd9216b522f6ece8af6997d063b2]
Thanks, will drop this one now.
greg k-h
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.63-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
Builds successfully. Boots and works on qemu and Dell XPS 15 9520 w/ Intel Core i7-12600H
Thanks,
Brett
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
No problems seen on x86_64 and aarch64 with our testing.
Thanks,
Harshit
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.63-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.12:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
120 tests: 120 pass, 0 failLinux version: 6.12.63-rc1-gf8100cfd690d
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra186-p3509-0000+p3636-0001, tegra194-p2972-0000,
tegra194-p3509-0000+p3668-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Am 16.12.2025 um 12:09 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Builds, boots and works on my 2-socket Ivy Bridge Xeon E5-2697 v2 server. No dmesg oddities or regressions found.
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines · On Tue, 16 Dec 2025 12:09:27 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.12.63 release. There are 354 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
Boot-tested under QEMU for Rust x86_64, arm64 and riscv64; built-tested for loongarch64:
Thanks!
Cheers,
Miguel