6.11.11-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 781/817 nvme-multipath: avoid hang on inaccessible namespaces
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannes Reinecke <[email protected]>
[ Upstream commit 3b97f5a05cfc55e7729ff3769f63eef64e2178bb ]
During repetitive namespace remapping operations on the target the namespace might have changed between the time the initial scan was performed, and partition scan was invoked by device_add_disk() in nvme_mpath_set_live(). We then end up with a stuck scanning process:
[<0>] folio_wait_bit_common+0x12a/0x310 [<0>] filemap_read_folio+0x97/0xd0 [<0>] do_read_cache_folio+0x108/0x390 [<0>] read_part_sector+0x31/0xa0 [<0>] read_lba+0xc5/0x160 [<0>] efi_partition+0xd9/0x8f0 [<0>] bdev_disk_changed+0x23d/0x6d0 [<0>] blkdev_get_whole+0x78/0xc0 [<0>] bdev_open+0x2c6/0x3b0 [<0>] bdev_file_open_by_dev+0xcb/0x120 [<0>] disk_scan_partitions+0x5d/0x100 [<0>] device_add_disk+0x402/0x420 [<0>] nvme_mpath_set_live+0x4f/0x1f0 [nvme_core] [<0>] nvme_mpath_add_disk+0x107/0x120 [nvme_core] [<0>] nvme_alloc_ns+0xac6/0xe60 [nvme_core] [<0>] nvme_scan_ns+0x2dd/0x3e0 [nvme_core] [<0>] nvme_scan_work+0x1a3/0x490 [nvme_core]
This happens when we have several paths, some of which are inaccessible, and the active paths are removed first. Then nvme_find_path() will requeue I/O in the ns_head (as paths are present), but the requeue list is never triggered as all remaining paths are inactive.
This patch checks for NVME_NSHEAD_DISK_LIVE in nvme_available_path(), and requeue I/O after NVME_NSHEAD_DISK_LIVE has been cleared once the last path has been removed to properly terminate pending I/O.
Stable-dep-of: 5dd18f09ce73 ("nvme/multipath: Fix RCU list traversal to use SRCU primitive")
--- drivers/nvme/host/multipath.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/nvme/host/multipath.c +10 -2
@@ -421,6 +421,9 @@ static bool nvme_available_path(struct nvme_ns_head *head) {struct nvme_ns *ns; +if (!test_bit (NVME_NSHEAD_DISK_LIVE , &head->flags)) +return NULL ; +list_for_each_entry_rcu (ns, &head->list, siblings) {if (test_bit (NVME_CTRL_FAILFAST_EXPIRED , &ns->ctrl->flags))continue ;
@@ -995,8 +998,7 @@ void nvme_mpath_shutdown_disk(struct nvme_ns_head *head) {if (!head->disk)return ; -kblockd_schedule_work (&head->requeue_work); -if (test_bit (NVME_NSHEAD_DISK_LIVE , &head->flags)) { +if (test_and_clear_bit (NVME_NSHEAD_DISK_LIVE , &head->flags)) {nvme_cdev_del (&head->cdev, &head->cdev_device);/* * requeue I/O after NVME_NSHEAD_DISK_LIVE has been cleared
@@ -1006,6 +1008,12 @@ void nvme_mpath_shutdown_disk(struct nvme_ns_head *head)kblockd_schedule_work (&head->requeue_work);del_gendisk (head->disk); } +/* +* requeue I/O after NVME_NSHEAD_DISK_LIVE has been cleared +* to allow multipath to fail all I/O. +*/ +synchronize_srcu (&head->srcu); +kblockd_schedule_work (&head->requeue_work); }void nvme_mpath_remove_disk (struct nvme_ns_head *head)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 782/817 nvme/multipath: Fix RCU list traversal to use SRCU primitive
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit 5dd18f09ce7399df6fffe80d1598add46c395ae9 ]
The code currently uses list_for_each_entry_rcu() while holding an SRCU lock, triggering false positive warnings with CONFIG_PROVE_RCU=y enabled:
drivers/nvme/host/multipath.c:168 RCU-list traversed in non-reader section!! drivers/nvme/host/multipath.c:227 RCU-list traversed in non-reader section!! drivers/nvme/host/multipath.c:260 RCU-list traversed in non-reader section!!
While the list is properly protected by SRCU lock, the code uses the wrong list traversal primitive. Replace list_for_each_entry_rcu() with list_for_each_entry_srcu() to correctly indicate SRCU-based protection and eliminate the false warning.
--- drivers/nvme/host/multipath.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
drivers/nvme/host/multipath.c +14 -7
@@ -165,7 +165,8 @@ void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl)int srcu_idx; srcu_idx =srcu_read_lock (&ctrl->srcu); -list_for_each_entry_rcu (ns, &ctrl->namespaces, list) { +list_for_each_entry_srcu (ns, &ctrl->namespaces, list, +srcu_read_lock_held (&ctrl->srcu)) {if (!ns->head->disk)continue ;kblockd_schedule_work (&ns->head->requeue_work);
@@ -209,7 +210,8 @@ void nvme_mpath_clear_ctrl_paths(struct nvme_ctrl *ctrl)int srcu_idx; srcu_idx =srcu_read_lock (&ctrl->srcu); -list_for_each_entry_rcu (ns, &ctrl->namespaces, list) { +list_for_each_entry_srcu (ns, &ctrl->namespaces, list, +srcu_read_lock_held (&ctrl->srcu)) {nvme_mpath_clear_current_path (ns);kblockd_schedule_work (&ns->head->requeue_work); }
@@ -224,7 +226,8 @@ void nvme_mpath_revalidate_paths(struct nvme_ns *ns)int srcu_idx; srcu_idx =srcu_read_lock (&head->srcu); -list_for_each_entry_rcu (ns, &head->list, siblings) { +list_for_each_entry_srcu (ns, &head->list, siblings, +srcu_read_lock_held (&head->srcu)) {if (capacity !=get_capacity (ns->disk))clear_bit (NVME_NS_READY , &ns->flags); }
@@ -257,7 +260,8 @@ static struct nvme_ns *__nvme_find_path(struct nvme_ns_head *head, int node)int found_distance =INT_MAX , fallback_distance =INT_MAX , distance;struct nvme_ns *found =NULL , *fallback =NULL , *ns; -list_for_each_entry_rcu (ns, &head->list, siblings) { +list_for_each_entry_srcu (ns, &head->list, siblings, +srcu_read_lock_held (&head->srcu)) {if (nvme_path_is_disabled (ns))continue ;
@@ -356,7 +360,8 @@ static struct nvme_ns *nvme_queue_depth_path(struct nvme_ns_head *head)unsigned int min_depth_opt =UINT_MAX , min_depth_nonopt =UINT_MAX ;unsigned int depth; -list_for_each_entry_rcu (ns, &head->list, siblings) { +list_for_each_entry_srcu (ns, &head->list, siblings, +srcu_read_lock_held (&head->srcu)) {if (nvme_path_is_disabled (ns))continue ;
@@ -424,7 +429,8 @@ static bool nvme_available_path(struct nvme_ns_head *head)if (!test_bit (NVME_NSHEAD_DISK_LIVE , &head->flags))return NULL ; -list_for_each_entry_rcu (ns, &head->list, siblings) { +list_for_each_entry_srcu (ns, &head->list, siblings, +srcu_read_lock_held (&head->srcu)) {if (test_bit (NVME_CTRL_FAILFAST_EXPIRED , &ns->ctrl->flags))continue ;switch (nvme_ctrl_state (ns->ctrl)) {
@@ -786,7 +792,8 @@ static int nvme_update_ana_state(struct nvme_ctrl *ctrl,return 0 ; srcu_idx =srcu_read_lock (&ctrl->srcu); -list_for_each_entry_rcu (ns, &ctrl->namespaces, list) { +list_for_each_entry_srcu (ns, &ctrl->namespaces, list, +srcu_read_lock_held (&ctrl->srcu)) {unsigned nsid; again: nsid =le32_to_cpu (desc->nsids[n]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 783/817 blk-mq: add non_owner variant of start_freeze/unfreeze queue APIs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 8acdd0e7bfadda6b5103f2960d293581954454ed ]
Add non_owner variant of start_freeze/unfreeze queue APIs, so that the caller knows that what they are doing, and we can skip lockdep support for non_owner variant in per-call level.
Prepare for supporting lockdep for freezing/unfreezing queue.
Stable-dep-of: 3802f73bd807 ("block: fix uaf for flush rq while iterating tags")
--- block/blk-mq.c | 20 ++++++++++++++++++++ include/linux/blk-mq.h | 2 ++ 2 files changed, 22 insertions(+)
block/blk-mq.c +20 -0
@@ -196,6 +196,26 @@ void blk_mq_unfreeze_queue(struct request_queue *q) }EXPORT_SYMBOL_GPL (blk_mq_unfreeze_queue); +/* +* non_owner variant of blk_freeze_queue_start +* +* Unlike blk_freeze_queue_start, the queue doesn't need to be unfrozen +* by the same task. This is fragile and should not be used if at all +* possible. +*/ +void blk_freeze_queue_start_non_owner (struct request_queue *q) +{ +blk_freeze_queue_start (q); +} +EXPORT_SYMBOL_GPL (blk_freeze_queue_start_non_owner); + +/* non_owner variant of blk_mq_unfreeze_queue */ +void blk_mq_unfreeze_queue_non_owner (struct request_queue *q) +{ +__blk_mq_unfreeze_queue (q, false); +} +EXPORT_SYMBOL_GPL (blk_mq_unfreeze_queue_non_owner); +/* * FIXME: replace the scsi_internal_device_*block_nowait() calls in the * mpt3sas driver such that this function can be removed.
include/linux/blk-mq.h +2 -0
@@ -928,6 +928,8 @@ void blk_freeze_queue_start(struct request_queue *q);void blk_mq_freeze_queue_wait (struct request_queue *q);int blk_mq_freeze_queue_wait_timeout (struct request_queue *q,unsigned long timeout); +void blk_mq_unfreeze_queue_non_owner (struct request_queue *q); +void blk_freeze_queue_start_non_owner (struct request_queue *q);void blk_mq_map_queues (struct blk_mq_queue_map *qmap);void blk_mq_update_nr_hw_queues (struct blk_mq_tag_set *set,int nr_hw_queues);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 784/817 block: model freeze & enter queue as lock for supporting lockdep
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit f1be1788a32e8fa63416ad4518bbd1a85a825c9d ]
Recently we got several deadlock report[1][2][3] caused by blk_mq_freeze_queue and blk_enter_queue().
Turns out the two are just like acquiring read/write lock, so model them as read/write lock for supporting lockdep:
1) model q->q_usage_counter as two locks(io and queue lock)
- queue lock covers sync with blk_enter_queue()
- io lock covers sync with bio_enter_queue()
2) make the lockdep class/key as per-queue:
- different subsystem has very different lock use pattern, shared lock class causes false positive easily
- freeze_queue degrades to no lock in case that disk state becomes DEAD because bio_enter_queue() won't be blocked any more
- freeze_queue degrades to no lock in case that request queue becomes dying because blk_enter_queue() won't be blocked any more
3) model blk_mq_freeze_queue() as acquire_exclusive & try_lock
- it is exclusive lock, so dependency with blk_enter_queue() is covered
- it is trylock because blk_mq_freeze_queue() are allowed to run concurrently
4) model blk_enter_queue() & bio_enter_queue() as acquire_read()
- nested blk_enter_queue() are allowed
- dependency with blk_mq_freeze_queue() is covered
- blk_queue_exit() is often called from other contexts(such as irq), and it can't be annotated as lock_release(), so simply do it in blk_enter_queue(), this way still covered cases as many as possible
With lockdep support, such kind of reports may be reported asap and needn't wait until the real deadlock is triggered.
For example, lockdep report can be triggered in the report[3] with this patch applied.
[1] occasional block layer hang when setting 'echo noop > /sys/block/sda/queue/scheduler'
https://bugzilla.kernel.org/show_bug.cgi?id=219166
[2] del_gendisk() vs blk_queue_enter() race condition
https://lore.kernel.org/linux-block/[email protected]/
[3] queue_freeze & queue_enter deadlock in scsi
https://lore.kernel.org/linux-block/ZxG38G9BuFdBpBHZ@fedora/T/#u
Stable-dep-of: 3802f73bd807 ("block: fix uaf for flush rq while iterating tags")
--- block/blk-core.c | 18 ++++++++++++++++-- block/blk-mq.c | 26 ++++++++++++++++++++++---- block/blk.h | 29 ++++++++++++++++++++++++++--- block/genhd.c | 15 +++++++++++---- include/linux/blkdev.h | 6 ++++++ 5 files changed, 81 insertions(+), 13 deletions(-)
block/blk-core.c +16 -2
@@ -261,6 +261,8 @@ static void blk_free_queue(struct request_queue *q)blk_mq_release (q);ida_free (&blk_queue_ida, q->id); +lockdep_unregister_key (&q->io_lock_cls_key); +lockdep_unregister_key (&q->q_lock_cls_key);call_rcu (&q->rcu_head, blk_free_queue_rcu); }
@@ -278,18 +280,20 @@ void blk_put_queue(struct request_queue *q) }EXPORT_SYMBOL (blk_put_queue); -void blk_queue_start_drain (struct request_queue *q) +bool blk_queue_start_drain (struct request_queue *q) {/* * When queue DYING flag is set, we need to block new req * entering queue, so we call blk_freeze_queue_start() to * prevent I/O from crossing blk_queue_enter(). */ -blk_freeze_queue_start (q); +bool freeze =__blk_freeze_queue_start (q);if (queue_is_mq (q))blk_mq_wake_waiters (q);/* Make blk_queue_enter() reexamine the DYING flag. */ wake_up_all (&q->mq_freeze_wq); + +return freeze; }/**
@@ -321,6 +325,8 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)return -ENODEV ; } +rwsem_acquire_read (&q->q_lockdep_map,0 ,0 , _RET_IP_); +rwsem_release (&q->q_lockdep_map, _RET_IP_);return 0 ; }
@@ -352,6 +358,8 @@ int __bio_queue_enter(struct request_queue *q, struct bio *bio) goto dead; } +rwsem_acquire_read (&q->io_lockdep_map,0 ,0 , _RET_IP_); +rwsem_release (&q->io_lockdep_map, _RET_IP_);return 0 ; dead:bio_io_error (bio);
@@ -441,6 +449,12 @@ struct request_queue *blk_alloc_queue(struct queue_limits *lim, int node_id) PERCPU_REF_INIT_ATOMIC, GFP_KERNEL);if (error) goto fail_stats; +lockdep_register_key (&q->io_lock_cls_key); +lockdep_register_key (&q->q_lock_cls_key); +lockdep_init_map (&q->io_lockdep_map,"&q->q_usage_counter(io)" , + &q->io_lock_cls_key,0 ); +lockdep_init_map (&q->q_lockdep_map,"&q->q_usage_counter(queue)" , + &q->q_lock_cls_key,0 ); q->nr_requests =BLKDEV_DEFAULT_RQ ;
block/blk-mq.c +22 -4
@@ -120,17 +120,29 @@ void blk_mq_in_flight_rw(struct request_queue *q, struct block_device *part, inflight[1 ] = mi.inflight[1 ]; } -void blk_freeze_queue_start (struct request_queue *q) +bool __blk_freeze_queue_start (struct request_queue *q) { +int freeze; +mutex_lock (&q->mq_freeze_lock);if (++q->mq_freeze_depth ==1 ) {percpu_ref_kill (&q->q_usage_counter);mutex_unlock (&q->mq_freeze_lock);if (queue_is_mq (q))blk_mq_run_hw_queues (q, false); + freeze = true; }else {mutex_unlock (&q->mq_freeze_lock); + freeze = false; } + +return freeze; +} + +void blk_freeze_queue_start (struct request_queue *q) +{ +if (__blk_freeze_queue_start (q)) +blk_freeze_acquire_lock (q, false, false); }EXPORT_SYMBOL_GPL (blk_freeze_queue_start);
@@ -176,8 +188,10 @@ void blk_mq_freeze_queue(struct request_queue *q) }EXPORT_SYMBOL_GPL (blk_mq_freeze_queue); -void __blk_mq_unfreeze_queue (struct request_queue *q,bool force_atomic) +bool __blk_mq_unfreeze_queue (struct request_queue *q,bool force_atomic) { +int unfreeze = false; +mutex_lock (&q->mq_freeze_lock);if (force_atomic) q->q_usage_counter.data->force_atomic = true;
@@ -186,13 +200,17 @@ void __blk_mq_unfreeze_queue(struct request_queue *q, bool force_atomic)if (!q->mq_freeze_depth) {percpu_ref_resurrect (&q->q_usage_counter);wake_up_all (&q->mq_freeze_wq); + unfreeze = true; }mutex_unlock (&q->mq_freeze_lock); + +return unfreeze; }void blk_mq_unfreeze_queue (struct request_queue *q) { -__blk_mq_unfreeze_queue (q, false); +if (__blk_mq_unfreeze_queue (q, false)) +blk_unfreeze_release_lock (q, false, false); }EXPORT_SYMBOL_GPL (blk_mq_unfreeze_queue);
@@ -205,7 +223,7 @@ EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);*/ void blk_freeze_queue_start_non_owner (struct request_queue *q) { -blk_freeze_queue_start (q); +__blk_freeze_queue_start (q); }EXPORT_SYMBOL_GPL (blk_freeze_queue_start_non_owner);
block/blk.h +26 -3
@@ -4,6 +4,7 @@#include <linux/bio-integrity.h> #include <linux/blk-crypto.h> +#include <linux/lockdep.h> #include <linux/memblock.h> /* for max_pfn/max_low_pfn */ #include <linux/sched/sysctl.h> #include <linux/timekeeping.h>
@@ -35,8 +36,9 @@ struct blk_flush_queue *blk_alloc_flush_queue(int node, int cmd_size,void blk_free_flush_queue (struct blk_flush_queue *q);void blk_freeze_queue (struct request_queue *q); -void __blk_mq_unfreeze_queue (struct request_queue *q,bool force_atomic); -void blk_queue_start_drain (struct request_queue *q); +bool __blk_mq_unfreeze_queue (struct request_queue *q,bool force_atomic); +bool blk_queue_start_drain (struct request_queue *q); +bool __blk_freeze_queue_start (struct request_queue *q);int __bio_queue_enter (struct request_queue *q,struct bio *bio);void submit_bio_noacct_nocheck (struct bio *bio);void bio_await_chain (struct bio *bio);
@@ -69,8 +71,11 @@ static inline int bio_queue_enter(struct bio *bio) {struct request_queue *q =bdev_get_queue (bio->bi_bdev); -if (blk_try_enter_queue (q, false)) +if (blk_try_enter_queue (q, false)) { +rwsem_acquire_read (&q->io_lockdep_map,0 ,0 , _RET_IP_); +rwsem_release (&q->io_lockdep_map, _RET_IP_);return 0 ; + }return __bio_queue_enter (q, bio); }
@@ -724,4 +729,22 @@ void blk_integrity_verify(struct bio *bio);void blk_integrity_prepare (struct request *rq);void blk_integrity_complete (struct request *rq,unsigned int nr_bytes); +static inline void blk_freeze_acquire_lock (struct request_queue *q,bool + disk_dead,bool queue_dying) +{ +if (!disk_dead) +rwsem_acquire (&q->io_lockdep_map,0 ,1 , _RET_IP_); +if (!queue_dying) +rwsem_acquire (&q->q_lockdep_map,0 ,1 , _RET_IP_); +} + +static inline void blk_unfreeze_release_lock (struct request_queue *q,bool + disk_dead,bool queue_dying) +{ +if (!queue_dying) +rwsem_release (&q->q_lockdep_map, _RET_IP_); +if (!disk_dead) +rwsem_release (&q->io_lockdep_map, _RET_IP_); +} +#endif /* BLK_INTERNAL_H */
block/genhd.c +11 -4
@@ -581,13 +581,13 @@ static void blk_report_disk_dead(struct gendisk *disk, bool surprise)rcu_read_unlock (); } -static void __blk_mark_disk_dead (struct gendisk *disk) +static bool __blk_mark_disk_dead (struct gendisk *disk) {/* * Fail any new I/O. */ if (test_and_set_bit (GD_DEAD , &disk->state)) -return ; +return false;if (test_bit (GD_OWNS_QUEUE , &disk->state))blk_queue_flag_set (QUEUE_FLAG_DYING , disk->queue);
@@ -600,7 +600,7 @@ static void __blk_mark_disk_dead(struct gendisk *disk)/* * Prevent new I/O from crossing bio_queue_enter(). */ -blk_queue_start_drain (disk->queue); +return blk_queue_start_drain (disk->queue); }/**
@@ -641,6 +641,7 @@ void del_gendisk(struct gendisk *disk)struct request_queue *q = disk->queue;struct block_device *part;unsigned long idx; +bool start_drain, queue_dying;might_sleep ();
@@ -668,7 +669,10 @@ void del_gendisk(struct gendisk *disk)* Drop all partitions now that the disk is marked dead. */ mutex_lock (&disk->open_mutex); -__blk_mark_disk_dead (disk); + start_drain =__blk_mark_disk_dead (disk); + queue_dying =blk_queue_dying (q); +if (start_drain) +blk_freeze_acquire_lock (q, true, queue_dying);xa_for_each_start (&disk->part_tbl, idx, part,1 )drop_partition (part);mutex_unlock (&disk->open_mutex);
@@ -725,6 +729,9 @@ void del_gendisk(struct gendisk *disk)if (queue_is_mq (q))blk_mq_exit_queue (q); } + +if (start_drain) +blk_unfreeze_release_lock (q, true, queue_dying); }EXPORT_SYMBOL (del_gendisk);
include/linux/blkdev.h +6 -0
@@ -25,6 +25,7 @@#include <linux/uuid.h> #include <linux/xarray.h> #include <linux/file.h> +#include <linux/lockdep.h> struct module ;struct request_queue ;
@@ -471,6 +472,11 @@ struct request_queue {struct xarray hctx_table;struct percpu_ref q_usage_counter; +struct lock_class_key io_lock_cls_key; +struct lockdep_map io_lockdep_map; + +struct lock_class_key q_lock_cls_key; +struct lockdep_map q_lockdep_map;struct request *last_merge;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 785/817 block: fix uaf for flush rq while iterating tags
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Kuai <[email protected]>
[ Upstream commit 3802f73bd80766d70f319658f334754164075bc3 ]
blk_mq_clear_flush_rq_mapping() is not called during scsi probe, by checking blk_queue_init_done(). However, QUEUE_FLAG_INIT_DONE is cleared in del_gendisk by commit aec89dc5d421 ("block: keep q_usage_counter in atomic mode after del_gendisk"), hence for disk like scsi, following blk_mq_destroy_queue() will not clear flush rq from tags->rqs[] as well, cause following uaf that is found by our syzkaller for v6.6:
==================================================================
BUG: KASAN: slab-use-after-free in blk_mq_find_and_get_req+0x16e/0x1a0 block/blk-mq-tag.c:261 Read of size 4 at addr ffff88811c969c20 by task kworker/1:2H/224909 CPU: 1 PID: 224909 Comm: kworker/1:2H Not tainted 6.6.0-ga836a5060850 #32 Workqueue: kblockd blk_mq_timeout_work Call Trace: __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x91/0xf0 lib/dump_stack.c:106 print_address_description.constprop.0+0x66/0x300 mm/kasan/report.c:364 print_report+0x3e/0x70 mm/kasan/report.c:475 kasan_report+0xb8/0xf0 mm/kasan/report.c:588 blk_mq_find_and_get_req+0x16e/0x1a0 block/blk-mq-tag.c:261 bt_iter block/blk-mq-tag.c:288 [inline] __sbitmap_for_each_set include/linux/sbitmap.h:295 [inline] sbitmap_for_each_set include/linux/sbitmap.h:316 [inline] bt_for_each+0x455/0x790 block/blk-mq-tag.c:325 blk_mq_queue_tag_busy_iter+0x320/0x740 block/blk-mq-tag.c:534 blk_mq_timeout_work+0x1a3/0x7b0 block/blk-mq.c:1673 process_one_work+0x7c4/0x1450 kernel/workqueue.c:2631 process_scheduled_works kernel/workqueue.c:2704 [inline] worker_thread+0x804/0xe40 kernel/workqueue.c:2785 kthread+0x346/0x450 kernel/kthread.c:388 ret_from_fork+0x4d/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1b/0x30 arch/x86/entry/entry_64.S:293 Allocated by task 942: kasan_save_stack+0x22/0x50 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 ____kasan_kmalloc mm/kasan/common.c:374 [inline] __kasan_kmalloc mm/kasan/common.c:383 [inline] __kasan_kmalloc+0xaa/0xb0 mm/kasan/common.c:380 kasan_kmalloc include/linux/kasan.h:198 [inline] __do_kmalloc_node mm/slab_common.c:1007 [inline] __kmalloc_node+0x69/0x170 mm/slab_common.c:1014 kmalloc_node include/linux/slab.h:620 [inline] kzalloc_node include/linux/slab.h:732 [inline] blk_alloc_flush_queue+0x144/0x2f0 block/blk-flush.c:499 blk_mq_alloc_hctx+0x601/0x940 block/blk-mq.c:3788 blk_mq_alloc_and_init_hctx+0x27f/0x330 block/blk-mq.c:4261 blk_mq_realloc_hw_ctxs+0x488/0x5e0 block/blk-mq.c:4294 blk_mq_init_allocated_queue+0x188/0x860 block/blk-mq.c:4350 blk_mq_init_queue_data block/blk-mq.c:4166 [inline] blk_mq_init_queue+0x8d/0x100 block/blk-mq.c:4176 scsi_alloc_sdev+0x843/0xd50 drivers/scsi/scsi_scan.c:335 scsi_probe_and_add_lun+0x77c/0xde0 drivers/scsi/scsi_scan.c:1189 __scsi_scan_target+0x1fc/0x5a0 drivers/scsi/scsi_scan.c:1727 scsi_scan_channel drivers/scsi/scsi_scan.c:1815 [inline] scsi_scan_channel+0x14b/0x1e0 drivers/scsi/scsi_scan.c:1791 scsi_scan_host_selected+0x2fe/0x400 drivers/scsi/scsi_scan.c:1844 scsi_scan+0x3a0/0x3f0 drivers/scsi/scsi_sysfs.c:151 store_scan+0x2a/0x60 drivers/scsi/scsi_sysfs.c:191 dev_attr_store+0x5c/0x90 drivers/base/core.c:2388 sysfs_kf_write+0x11c/0x170 fs/sysfs/file.c:136 kernfs_fop_write_iter+0x3fc/0x610 fs/kernfs/file.c:338 call_write_iter include/linux/fs.h:2083 [inline] new_sync_write+0x1b4/0x2d0 fs/read_write.c:493 vfs_write+0x76c/0xb00 fs/read_write.c:586 ksys_write+0x127/0x250 fs/read_write.c:639 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x70/0x120 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x78/0xe2 Freed by task 244687: kasan_save_stack+0x22/0x50 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 kasan_save_free_info+0x2b/0x50 mm/kasan/generic.c:522 ____kasan_slab_free mm/kasan/common.c:236 [inline] __kasan_slab_free+0x12a/0x1b0 mm/kasan/common.c:244 kasan_slab_free include/linux/kasan.h:164 [inline] slab_free_hook mm/slub.c:1815 [inline] slab_free_freelist_hook mm/slub.c:1841 [inline] slab_free mm/slub.c:3807 [inline] __kmem_cache_free+0xe4/0x520 mm/slub.c:3820 blk_free_flush_queue+0x40/0x60 block/blk-flush.c:520 blk_mq_hw_sysfs_release+0x4a/0x170 block/blk-mq-sysfs.c:37 kobject_cleanup+0x136/0x410 lib/kobject.c:689 kobject_release lib/kobject.c:720 [inline] kref_put include/linux/kref.h:65 [inline] kobject_put+0x119/0x140 lib/kobject.c:737 blk_mq_release+0x24f/0x3f0 block/blk-mq.c:4144 blk_free_queue block/blk-core.c:298 [inline] blk_put_queue+0xe2/0x180 block/blk-core.c:314 blkg_free_workfn+0x376/0x6e0 block/blk-cgroup.c:144 process_one_work+0x7c4/0x1450 kernel/workqueue.c:2631 process_scheduled_works kernel/workqueue.c:2704 [inline] worker_thread+0x804/0xe40 kernel/workqueue.c:2785 kthread+0x346/0x450 kernel/kthread.c:388 ret_from_fork+0x4d/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1b/0x30 arch/x86/entry/entry_64.S:293
Other than blk_mq_clear_flush_rq_mapping(), the flag is only used in blk_register_queue() from initialization path, hence it's safe not to clear the flag in del_gendisk. And since QUEUE_FLAG_REGISTERED already make sure that queue should only be registered once, there is no need to test the flag as well.
Depends-on: commit aec89dc5d421 ("block: keep q_usage_counter in atomic mode after del_gendisk")
--- block/blk-sysfs.c | 6 ++---- block/genhd.c | 9 +++------ 2 files changed, 5 insertions(+), 10 deletions(-)
block/blk-sysfs.c +2 -4
@@ -794,10 +794,8 @@ int blk_register_queue(struct gendisk *disk)* faster to shut down and is made fully functional here as * request_queues for non-existent devices never get registered. */ -if (!blk_queue_init_done (q)) { -blk_queue_flag_set (QUEUE_FLAG_INIT_DONE , q); -percpu_ref_switch_to_percpu (&q->q_usage_counter); - } +blk_queue_flag_set (QUEUE_FLAG_INIT_DONE , q); +percpu_ref_switch_to_percpu (&q->q_usage_counter);return ret;
block/genhd.c +3 -6
@@ -722,13 +722,10 @@ void del_gendisk(struct gendisk *disk)* If the disk does not own the queue, allow using passthrough requests * again. Else leave the queue frozen to fail all I/O. */ -if (!test_bit (GD_OWNS_QUEUE , &disk->state)) { -blk_queue_flag_clear (QUEUE_FLAG_INIT_DONE , q); +if (!test_bit (GD_OWNS_QUEUE , &disk->state))__blk_mq_unfreeze_queue (q, true); - }else { -if (queue_is_mq (q)) -blk_mq_exit_queue (q); - } +else if (queue_is_mq (q)) +blk_mq_exit_queue (q);if (start_drain)blk_unfreeze_release_lock (q, true, queue_dying);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 786/817 block: return unsigned int from bdev_io_min
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit 46fd48ab3ea3eb3bb215684bd66ea3d260b091a9 ]
The underlying limit is defined as an unsigned int, so return that from bdev_io_min as well.
--- include/linux/blkdev.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/blkdev.h +1 -1
@@ -1255,7 +1255,7 @@ static inline unsigned int queue_io_min(const struct request_queue *q)return q->limits.io_min; } -static inline int bdev_io_min (struct block_device *bdev) +static inline unsigned int bdev_io_min (struct block_device *bdev) {return queue_io_min (bdev_get_queue (bdev)); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 787/817 nvme-fabrics: fix kernel crash while shutting down controller
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nilay Shroff <[email protected]>
[ Upstream commit e9869c85c81168a1275f909d5972a3fc435304be ]
The nvme keep-alive operation, which executes at a periodic interval, could potentially sneak in while shutting down a fabric controller. This may lead to a race between the fabric controller admin queue destroy code path (invoked while shutting down controller) and hw/hctx queue dispatcher called from the nvme keep-alive async request queuing operation. This race could lead to the kernel crash shown below:
Call Trace:
autoremove_wake_function+0x0/0xbc (unreliable)
__blk_mq_sched_dispatch_requests+0x114/0x24c
blk_mq_sched_dispatch_requests+0x44/0x84
blk_mq_run_hw_queue+0x140/0x220
nvme_keep_alive_work+0xc8/0x19c [nvme_core]
process_one_work+0x200/0x4e0
worker_thread+0x340/0x504
kthread+0x138/0x140
start_kernel_thread+0x14/0x18While shutting down fabric controller, if nvme keep-alive request sneaks in then it would be flushed off. The nvme_keep_alive_end_io function is then invoked to handle the end of the keep-alive operation which decrements the admin->q_usage_counter and assuming this is the last/only request in the admin queue then the admin->q_usage_counter becomes zero. If that happens then blk-mq destroy queue operation (blk_mq_destroy_ queue()) which could be potentially running simultaneously on another cpu (as this is the controller shutdown code path) would forward progress and deletes the admin queue. So, now from this point onward we are not supposed to access the admin queue resources. However the issue here's that the nvme keep-alive thread running hw/hctx queue dispatch operation hasn't yet finished its work and so it could still potentially access the admin queue resource while the admin queue had been already deleted and that causes the above crash.
The above kernel crash is regression caused due to changes implemented in commit a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()"). Ideally we should stop keep-alive before destroyin g the admin queue and freeing the admin tagset so that it wouldn't sneak in during the shutdown operation. However we removed the keep alive stop operation from the beginning of the controller shutdown code path in commit a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()") and added it under nvme_uninit_ctrl() which executes very late in the shutdown code path after the admin queue is destroyed and its tagset is removed. So this change created the possibility of keep-alive sneaking in and interfering with the shutdown operation and causing observed kernel crash.
To fix the observed crash, we decided to move nvme_stop_keep_alive() from nvme_uninit_ctrl() to nvme_remove_admin_tag_set(). This change would ensure that we don't forward progress and delete the admin queue until the keep- alive operation is finished (if it's in-flight) or cancelled and that would help contain the race condition explained above and hence avoid the crash.
Moving nvme_stop_keep_alive() to nvme_remove_admin_tag_set() instead of adding nvme_stop_keep_alive() to the beginning of the controller shutdown code path in nvme_stop_ctrl(), as was the case earlier before commit a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()"), would help save one callsite of nvme_stop_keep_alive().
--- drivers/nvme/host/core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/nvme/host/core.c +5 -0
@@ -4551,6 +4551,11 @@ EXPORT_SYMBOL_GPL(nvme_alloc_admin_tag_set);void nvme_remove_admin_tag_set (struct nvme_ctrl *ctrl) { +/* +* As we're about to destroy the queue and free tagset +* we can not have keep-alive work running. +*/ +nvme_stop_keep_alive (ctrl);blk_mq_destroy_queue (ctrl->admin_q);blk_put_queue (ctrl->admin_q);if (ctrl->ops->flags &NVME_F_FABRICS ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 788/817 9p/xen: fix init sequence
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Zenla <[email protected]>
[ Upstream commit 7ef3ae82a6ebbf4750967d1ce43bcdb7e44ff74b ]
Large amount of mount hangs observed during hotplugging of 9pfs devices. The 9pfs Xen driver attempts to initialize itself more than once, causing the frontend and backend to disagree: the backend listens on a channel that the frontend does not send on, resulting in stalled processing.
Only allow initialization of 9p frontend once.
Message-ID: <[email protected]>
--- net/9p/trans_xen.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/9p/trans_xen.c +5 -2
@@ -465,6 +465,7 @@ static int xen_9pfs_front_init(struct xenbus_device *dev) goto error; } +xenbus_switch_state (dev, XenbusStateInitialised);return 0 ; error_xenbus:
@@ -512,8 +513,10 @@ static void xen_9pfs_front_changed(struct xenbus_device *dev,break ;case XenbusStateInitWait: -if (!xen_9pfs_front_init (dev)) -xenbus_switch_state (dev, XenbusStateInitialised); +if (dev->state != XenbusStateInitialising) +break ; + +xen_9pfs_front_init (dev);break ;case XenbusStateConnected:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 789/817 9p/xen: fix release of IRQ
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Zenla <[email protected]>
[ Upstream commit e43c608f40c065b30964f0a806348062991b802d ]
Kernel logs indicate an IRQ was double-freed.
Pass correct device ID during IRQ release.
Message-ID: <[email protected]>
--- net/9p/trans_xen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/9p/trans_xen.c +1 -1
@@ -286,7 +286,7 @@ static void xen_9pfs_front_free(struct xen_9pfs_front_priv *priv)if (!priv->rings[i].intf)break ;if (priv->rings[i].irq >0 ) -unbind_from_irqhandler (priv->rings[i].irq, priv->dev); +unbind_from_irqhandler (priv->rings[i].irq, ring);if (priv->rings[i].data.in) { for (j = 0; j < (1 << priv->rings[i].intf->ring_order);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 790/817 perf/arm-smmuv3: Fix lockdep assert in ->event_init()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chun-Tse Shao <[email protected]>
[ Upstream commit 02a55f2743012a8089f09f6867220c3d57f16564 ]
Same as
https://lore.kernel.org/all/[email protected]/,
we should skip for_each_sibling_event() for group leader since it doesn't have the ctx yet.
--- drivers/perf/arm_smmuv3_pmu.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/perf/arm_smmuv3_pmu.c +11 -8
@@ -431,6 +431,17 @@ static int smmu_pmu_event_init(struct perf_event *event)return -EINVAL ; } +/* +* Ensure all events are on the same cpu so all events are in the +* same cpu context, to avoid races on pmu_enable etc. +*/ + event->cpu = smmu_pmu->on_cpu; + + hwc->idx =-1 ; + +if (event->group_leader == event) +return 0 ; +for_each_sibling_event (sibling, event->group_leader) {if (is_software_event (sibling))continue ;
@@ -442,14 +453,6 @@ static int smmu_pmu_event_init(struct perf_event *event)return -EINVAL ; } - hwc->idx =-1 ; - -/* -* Ensure all events are on the same cpu so all events are in the -* same cpu context, to avoid races on pmu_enable etc. -*/ - event->cpu = smmu_pmu->on_cpu; -return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 791/817 perf/arm-cmn: Ensure port and device id bits are set properly
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit dfdf714fed559c09021df1d2a4bb64c0ad5f53bc ]
The portid_bits and deviceid_bits were set only for XP type nodes in the arm_cmn_discover() and it confused other nodes to find XP nodes. Copy the both bits from the XP nodes directly when it sets up a new node.
--- drivers/perf/arm-cmn.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/perf/arm-cmn.c +2 -2
@@ -2147,8 +2147,6 @@ static int arm_cmn_init_dtcs(struct arm_cmn *cmn)continue ; xp =arm_cmn_node_to_xp (cmn, dn); - dn->portid_bits = xp->portid_bits; - dn->deviceid_bits = xp->deviceid_bits; dn->dtc = xp->dtc; dn->dtm = xp->dtm;if (cmn->multi_dtm)
@@ -2379,6 +2377,8 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset) }arm_cmn_init_node_info (cmn, reg &CMN_CHILD_NODE_ADDR , dn); + dn->portid_bits = xp->portid_bits; + dn->deviceid_bits = xp->deviceid_bits;switch (dn->type) {case CMN_TYPE_DTC :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 792/817 smb: client: disable directory caching when dir_cache_timeout is zero
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Henrique Carvalho <[email protected]>
[ Upstream commit ceaf1451990e3ea7fb50aebb5a149f57945f6e9f ]
Setting dir_cache_timeout to zero should disable the caching of directory contents. Currently, even when dir_cache_timeout is zero, some caching related functions are still invoked, which is unintended behavior.
Fix the issue by setting tcon->nohandlecache to true when dir_cache_timeout is zero, ensuring that directory handle caching is properly disabled.
--- fs/smb/client/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/connect.c +1 -1
@@ -2601,7 +2601,7 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)if (ses->server->dialect >=SMB20_PROT_ID && (ses->server->capabilities &SMB2_GLOBAL_CAP_DIRECTORY_LEASING )) - nohandlecache = ctx->nohandlecache; + nohandlecache = ctx->nohandlecache || !dir_cache_timeout;else nohandlecache = true; tcon =tcon_info_alloc (!nohandlecache, netfs_trace_tcon_ref_new);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 793/817 x86/Documentation: Update algo in init_size description of boot protocol
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit be4ca6c53e66cb275cf0d71f32dac0c4606b9dc0 ]
The init_size description of boot protocol has an example of the runtime start address for the compressed bzImage. For non-relocatable kernel it relies on the pref_address value (if not 0), but for relocatable case only pays respect to the load_addres and kernel_alignment, and it is inaccurate for the latter. Boot loader must consider the pref_address as the Linux kernel relocates to it before being decompressed as nicely described in this commit message a year ago:
43b1d3e68ee7 ("kexec: Allocate kernel above bzImage's pref_address")
Due to this documentation inaccuracy some of the bootloaders (*) made a mistake in the calculations and if kernel image is big enough, this may lead to unbootable configurations.
*)
In particular, kexec-tools missed that and resently got a couple of changes which will be part of v2.0.30 release. For the record, commit 43b1d3e68ee7 only fixed the kernel kexec implementation and also missed to update the init_size description.
While at it, make an example C-like looking as it's done elsewhere in the document and fix indentation as presribed by the reStructuredText specifications, so the syntax highliting will work properly.
--- Documentation/arch/x86/boot.rst | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
Documentation/arch/x86/boot.rst +13 -4
@@ -896,10 +896,19 @@ Offset/size: 0x260/4 The kernel runtime start address is determined by the following algorithm:: - if (relocatable_kernel) - runtime_start = align_up(load_address, kernel_alignment) - else - runtime_start = pref_address + if (relocatable_kernel) { + if (load_address < pref_address) + load_address = pref_address; + runtime_start = align_up(load_address, kernel_alignment); + } else { + runtime_start = pref_address; + } + +Hence the necessary memory window location and size can be estimated by +a boot loader as:: + + memory_window_start = runtime_start; + memory_window_size = init_size; ============ =============== Field name: handover_offset
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 794/817 cifs: Fix parsing native symlinks relative to the export
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pali Rohár <[email protected]>
[ Upstream commit 723f4ef90452aa629f3d923e92e0449d69362b1d ]
SMB symlink which has SYMLINK_FLAG_RELATIVE set is relative (as opposite of the absolute) and it can be relative either to the current directory (where is the symlink stored) or relative to the top level export path. To what it is relative depends on the first character of the symlink target path.
If the first character is path separator then symlink is relative to the export, otherwise to the current directory. Linux (and generally POSIX systems) supports only symlink paths relative to the current directory where is symlink stored.
Currently if Linux SMB client reads relative SMB symlink with first character as path separator (slash), it let as is. Which means that Linux interpret it as absolute symlink pointing from the root (/). But this location is different than the top level directory of SMB export (unless SMB export was mounted to the root) and thefore SMB symlinks relative to the export are interpreted wrongly by Linux SMB client.
Fix this problem. As Linux does not have equivalent of the path relative to the top of the mount point, convert such symlink target path relative to the current directory. Do this by prepending "../" pattern N times before the SMB target path, where N is the number of path separators found in SMB symlink path.
So for example, if SMB share is mounted to Linux path /mnt/share/, symlink is stored in file /mnt/share/test/folder1/symlink (so SMB symlink path is test\folder1\symlink) and SMB symlink target points to \test\folder2\file, then convert symlink target path to Linux path ../../test/folder2/file.
Deduplicate code for parsing SMB symlinks in native form from functions smb2_parse_symlink_response() and parse_reparse_native_symlink() into new function smb2_parse_native_symlink() and pass into this new function a new full_path parameter from callers, which specify SMB full path where is symlink stored.
This change fixes resolving of the native Windows symlinks relative to the top level directory of the SMB share.
Stable-dep-of: f4ca4f5a36ea ("cifs: Fix parsing reparse point with native symlink in SMB1 non-UNICODE session")
--- fs/smb/client/cifsglob.h | 1 + fs/smb/client/cifsproto.h | 1 + fs/smb/client/inode.c | 1 + fs/smb/client/reparse.c | 90 +++++++++++++++++++++++++++++++++------ fs/smb/client/reparse.h | 4 +- fs/smb/client/smb1ops.c | 3 +- fs/smb/client/smb2file.c | 21 +++++---- fs/smb/client/smb2inode.c | 6 ++- fs/smb/client/smb2proto.h | 9 +++- 9 files changed, 108 insertions(+), 28 deletions(-)
fs/smb/client/cifsglob.h +1 -0
@@ -589,6 +589,7 @@ struct smb_version_operations {/* Check for STATUS_NETWORK_NAME_DELETED */ bool (*is_network_name_deleted)(char *buf,struct TCP_Server_Info *srv);int (*parse_reparse_point)(struct cifs_sb_info *cifs_sb, +const char *full_path,struct kvec *rsp_iov,struct cifs_open_info_data *data); int (*create_reparse_symlink)(const unsigned int xid,
fs/smb/client/cifsproto.h +1 -0
@@ -675,6 +675,7 @@ char *extract_hostname(const char *unc);char *extract_sharename (const char *unc);int parse_reparse_point (struct reparse_data_buffer *buf,u32 plen,struct cifs_sb_info *cifs_sb, +const char *full_path,bool unicode,struct cifs_open_info_data *data); int cifs_sfu_make_node(unsigned int xid, struct inode *inode, struct dentry *dentry, struct cifs_tcon *tcon,
fs/smb/client/inode.c +1 -0
@@ -1075,6 +1075,7 @@ static int reparse_info_to_fattr(struct cifs_open_info_data *data, rc =0 ; }else if (iov && server->ops->parse_reparse_point) { rc = server->ops->parse_reparse_point (cifs_sb, + full_path, iov, data); }break ;
fs/smb/client/reparse.c +78 -12
127 lines not on this page · raw message
fs/smb/client/reparse.h +3 -1
@@ -117,7 +117,9 @@ int smb2_create_reparse_symlink(const unsigned int xid, struct inode *inode,int smb2_mknod_reparse (unsigned int xid,struct inode *inode,struct dentry *dentry,struct cifs_tcon *tcon,const char *full_path,umode_t mode,dev_t dev); -int smb2_parse_reparse_point (struct cifs_sb_info *cifs_sb,struct kvec *rsp_iov, +int smb2_parse_reparse_point (struct cifs_sb_info *cifs_sb, +const char *full_path, +struct kvec *rsp_iov,struct cifs_open_info_data *data);#endif /* _CIFS_REPARSE_H */
fs/smb/client/smb1ops.c +2 -1
@@ -994,6 +994,7 @@ static int cifs_query_symlink(const unsigned int xid, }static int cifs_parse_reparse_point (struct cifs_sb_info *cifs_sb, +const char *full_path,struct kvec *rsp_iov,struct cifs_open_info_data *data) {
@@ -1004,7 +1005,7 @@ static int cifs_parse_reparse_point(struct cifs_sb_info *cifs_sb, buf = (struct reparse_data_buffer *)((__u8 *)&io->hdr.Protocol +le32_to_cpu (io->DataOffset)); -return parse_reparse_point (buf, plen, cifs_sb, unicode, data); +return parse_reparse_point (buf, plen, cifs_sb, full_path, unicode, data); } static bool
fs/smb/client/smb2file.c +10 -11
@@ -63,12 +63,12 @@ static struct smb2_symlink_err_rsp *symlink_data(const struct kvec *iov)return sym; } -int smb2_parse_symlink_response (struct cifs_sb_info *cifs_sb,const struct kvec *iov,char **path) +int smb2_parse_symlink_response (struct cifs_sb_info *cifs_sb,const struct kvec *iov, +const char *full_path,char **path) {struct smb2_symlink_err_rsp *sym;unsigned int sub_offs, sub_len;unsigned int print_offs, print_len; -char *s;if (!cifs_sb || !iov || !iov->iov_base || !iov->iov_len || !path)return -EINVAL ;
@@ -86,15 +86,13 @@ int smb2_parse_symlink_response(struct cifs_sb_info *cifs_sb, const struct kvec iov->iov_len < SMB2_SYMLINK_STRUCT_SIZE + print_offs + print_len) return -EINVAL; - s =cifs_strndup_from_utf16 ((char *)sym->PathBuffer + sub_offs, sub_len, true, - cifs_sb->local_nls); -if (!s) -return -ENOMEM ; -convert_delimiter (s,'/' ); -cifs_dbg (FYI ,"%s: symlink target: %s\n" , __func__, s); - - *path = s; -return 0 ; +return smb2_parse_native_symlink (path, + (char *)sym->PathBuffer + sub_offs, + sub_len, + true, +le32_to_cpu (sym->Flags) &SYMLINK_FLAG_RELATIVE , + full_path, + cifs_sb); }int smb2_open_file (const unsigned int xid,struct cifs_open_parms *oparms,__u32 *oplock,void *buf)
@@ -126,6 +124,7 @@ int smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms, __u32 goto out;if (hdr->Status ==STATUS_STOPPED_ON_SYMLINK ) { rc =smb2_parse_symlink_response (oparms->cifs_sb, &err_iov, + oparms->path, &data->symlink_target);if (!rc) {memset (smb2_data,0 ,sizeof (*smb2_data));
fs/smb/client/smb2inode.c +4 -2
@@ -828,6 +828,7 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,static int parse_create_response (struct cifs_open_info_data *data,struct cifs_sb_info *cifs_sb, +const char *full_path,const struct kvec *iov) {struct smb2_create_rsp *rsp = iov->iov_base;
@@ -841,6 +842,7 @@ static int parse_create_response(struct cifs_open_info_data *data,break ;case STATUS_STOPPED_ON_SYMLINK : rc =smb2_parse_symlink_response (cifs_sb, iov, + full_path, &data->symlink_target);if (rc)return rc;
@@ -930,14 +932,14 @@ int smb2_query_path_info(const unsigned int xid,switch (rc) {case 0 : - rc =parse_create_response (data, cifs_sb, &out_iov[0 ]); + rc =parse_create_response (data, cifs_sb, full_path, &out_iov[0 ]);break ;case -EOPNOTSUPP :/* * BB TODO: When support for special files added to Samba * re-verify this path. */ - rc =parse_create_response (data, cifs_sb, &out_iov[0 ]); + rc =parse_create_response (data, cifs_sb, full_path, &out_iov[0 ]);if (rc || !data->reparse_point) goto out;
fs/smb/client/smb2proto.h +8 -1
@@ -113,7 +113,14 @@ extern int smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, unsigned int *pbytes_read); -int smb2_parse_symlink_response (struct cifs_sb_info *cifs_sb,const struct kvec *iov,char **path); +int smb2_parse_native_symlink (char **target,const char *buf,unsigned int len, +bool unicode,bool relative, +const char *full_path, +struct cifs_sb_info *cifs_sb); +int smb2_parse_symlink_response (struct cifs_sb_info *cifs_sb, +const struct kvec *iov, +const char *full_path, +char **path);int smb2_open_file (const unsigned int xid,struct cifs_open_parms *oparms,__u32 *oplock,void *buf); extern int smb2_unlock_range(struct cifsFileInfo *cfile,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 795/817 cifs: Fix parsing reparse point with native symlink in SMB1 non-UNICODE session
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pali Rohár <[email protected]>
[ Upstream commit f4ca4f5a36eac9b4da378a0f28cbbe38534a0901 ]
SMB1 NT_TRANSACT_IOCTL/FSCTL_GET_REPARSE_POINT even in non-UNICODE mode returns reparse buffer in UNICODE/UTF-16 format.
This is because FSCTL_GET_REPARSE_POINT is NT-based IOCTL which does not distinguish between 8-bit non-UNICODE and 16-bit UNICODE modes and its path buffers are always encoded in UTF-16.
This change fixes reading of native symlinks in SMB1 when UNICODE session is not active.
--- fs/smb/client/smb1ops.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/smb/client/smb1ops.c +1 -2
@@ -1000,12 +1000,11 @@ static int cifs_parse_reparse_point(struct cifs_sb_info *cifs_sb, {struct reparse_data_buffer *buf;TRANSACT_IOCTL_RSP *io = rsp_iov->iov_base; -bool unicode = !!(io->hdr.Flags2 &SMBFLG2_UNICODE );u32 plen =le16_to_cpu (io->ByteCount); buf = (struct reparse_data_buffer *)((__u8 *)&io->hdr.Protocol +le32_to_cpu (io->DataOffset)); -return parse_reparse_point (buf, plen, cifs_sb, full_path, unicode, data); +return parse_reparse_point (buf, plen, cifs_sb, full_path, true, data); } static bool
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 796/817 rtc: ab-eoz9: dont fail temperature reads on undervoltage notification
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Chevallier <[email protected]>
[ Upstream commit e0779a0dcf41a6452ac0a169cd96863feb5787c7 ]
The undervoltage flags reported by the RTC are useful to know if the time and date are reliable after a reboot. Although the threshold VLOW1 indicates that the thermometer has been shutdown and time compensation is off, it doesn't mean that the temperature readout is currently impossible.
As the system is running, the RTC voltage is now fully established and we can read the temperature.
--- drivers/rtc/rtc-ab-eoz9.c | 7 ------- 1 file changed, 7 deletions(-)
drivers/rtc/rtc-ab-eoz9.c +0 -7
@@ -396,13 +396,6 @@ static int abeoz9z3_temp_read(struct device *dev,if (ret <0 )return ret; -if ((val &ABEOZ9_REG_CTRL_STATUS_V1F ) || - (val &ABEOZ9_REG_CTRL_STATUS_V2F )) { -dev_err (dev, -"thermometer might be disabled due to low voltage\n" ); -return -EINVAL ; - } -switch (attr) {case hwmon_temp_input: ret =regmap_read (regmap,ABEOZ9_REG_REG_TEMP , &val);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 797/817 Rename .data.unlikely to .data..unlikely
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit bb43a59944f45e89aa158740b8a16ba8f0b0fa2b ]
Commit 7ccaba5314ca ("consolidate WARN_...ONCE() static variables") was intended to collect all .data.unlikely sections into one chunk. However, this has not worked when CONFIG_LD_DEAD_CODE_DATA_ELIMINATION or CONFIG_LTO_CLANG is enabled, because .data.unlikely matches the .data.[0-9a-zA-Z_]* pattern in the DATA_MAIN macro.
Commit cb87481ee89d ("kbuild: linker script do not match C names unless LD_DEAD_CODE_DATA_ELIMINATION is configured") was introduced to suppress the issue for the default CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=n case, providing a minimal fix for stable backporting. We were aware this did not address the issue for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y. The plan was to apply correct fixes and then revert cb87481ee89d. [1]
Seven years have passed since then, yet the #ifdef workaround remains in place.
Using a ".." separator in the section name fixes the issue for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION and CONFIG_LTO_CLANG.
--- include/asm-generic/vmlinux.lds.h | 2 +- include/linux/rcupdate.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/asm-generic/vmlinux.lds.h +1 -1
@@ -349,7 +349,7 @@ *(.data..decrypted) \ *(.ref.data) \ *(.data..shared_aligned) /* percpu related */ \ - *(.data.unlikely) \ + *(.data..unlikely) \ __start_once = .; \ *(.data.once) \ __end_once = .; \
include/linux/rcupdate.h +1 -1
@@ -390,7 +390,7 @@ static inline int debug_lockdep_rcu_enabled(void)*/ #define RCU_LOCKDEP_WARN (c, s) \ do { \ - static bool __section(".data.unlikely") __warned; \ + static bool __section(".data..unlikely") __warned; \ if (debug_lockdep_rcu_enabled() && (c) && \ debug_lockdep_rcu_enabled() && !__warned) { \ __warned = true; \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 798/817 Rename .data.once to .data..once to fix resetting WARN*_ONCE
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit dbefa1f31a91670c9e7dac9b559625336206466f ]
Commit b1fca27d384e ("kernel debug: support resetting WARN*_ONCE") added support for clearing the state of once warnings. However, it is not functional when CONFIG_LD_DEAD_CODE_DATA_ELIMINATION or CONFIG_LTO_CLANG is enabled, because .data.once matches the .data.[0-9a-zA-Z_]* pattern in the DATA_MAIN macro.
Commit cb87481ee89d ("kbuild: linker script do not match C names unless LD_DEAD_CODE_DATA_ELIMINATION is configured") was introduced to suppress the issue for the default CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=n case, providing a minimal fix for stable backporting. We were aware this did not address the issue for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y. The plan was to apply correct fixes and then revert cb87481ee89d. [1]
Seven years have passed since then, yet the #ifdef workaround remains in place. Meanwhile, commit b1fca27d384e introduced the .data.once section, and commit dc5723b02e52 ("kbuild: add support for Clang LTO") extended the #ifdef.
Using a ".." separator in the section name fixes the issue for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION and CONFIG_LTO_CLANG.
--- include/asm-generic/vmlinux.lds.h | 2 +- include/linux/mmdebug.h | 6 +++--- include/linux/once.h | 4 ++-- include/linux/once_lite.h | 2 +- include/net/net_debug.h | 2 +- mm/internal.h | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-)
include/asm-generic/vmlinux.lds.h +1 -1
@@ -351,7 +351,7 @@ *(.data..shared_aligned) /* percpu related */ \ *(.data..unlikely) \ __start_once = .; \ - *(.data.once) \ + *(.data..once) \ __end_once = .; \STRUCT_ALIGN (); \ *(__tracepoints) \
include/linux/mmdebug.h +3 -3
@@ -46,7 +46,7 @@ void vma_iter_dump_tree(const struct vma_iterator *vmi); } \ } while (0)#define VM_WARN_ON_ONCE_PAGE (cond, page) ({ \ - static bool __section(".data.once") __warned; \ + static bool __section(".data..once") __warned; \ int __ret_warn_once = !!(cond); \ \ if (unlikely(__ret_warn_once && !__warned)) { \
@@ -66,7 +66,7 @@ void vma_iter_dump_tree(const struct vma_iterator *vmi);unlikely (__ret_warn); \ })#define VM_WARN_ON_ONCE_FOLIO (cond, folio) ({ \ - static bool __section(".data.once") __warned; \ + static bool __section(".data..once") __warned; \ int __ret_warn_once = !!(cond); \ \ if (unlikely(__ret_warn_once && !__warned)) { \
@@ -77,7 +77,7 @@ void vma_iter_dump_tree(const struct vma_iterator *vmi);unlikely (__ret_warn_once); \ })#define VM_WARN_ON_ONCE_MM (cond, mm) ({ \ - static bool __section(".data.once") __warned; \ + static bool __section(".data..once") __warned; \ int __ret_warn_once = !!(cond); \ \ if (unlikely(__ret_warn_once && !__warned)) { \
include/linux/once.h +2 -2
@@ -46,7 +46,7 @@ void __do_once_sleepable_done(bool *done, struct static_key_true *once_key,#define DO_ONCE (func, ...) \ ({ \ bool ___ret = false; \ - static bool __section(".data.once") ___done = false; \ + static bool __section(".data..once") ___done = false; \ static DEFINE_STATIC_KEY_TRUE(___once_key); \ if (static_branch_unlikely(&___once_key)) { \ unsigned long ___flags; \
@@ -64,7 +64,7 @@ void __do_once_sleepable_done(bool *done, struct static_key_true *once_key,#define DO_ONCE_SLEEPABLE (func, ...) \ ({ \ bool ___ret = false; \ - static bool __section(".data.once") ___done = false; \ + static bool __section(".data..once") ___done = false; \ static DEFINE_STATIC_KEY_TRUE(___once_key); \ if (static_branch_unlikely(&___once_key)) { \ ___ret = __do_once_sleepable_start(&___done); \
include/linux/once_lite.h +1 -1
@@ -12,7 +12,7 @@#define __ONCE_LITE_IF (condition) \ ({ \ - static bool __section(".data.once") __already_done; \ + static bool __section(".data..once") __already_done; \ bool __ret_cond = !!(condition); \ bool __ret_once = false; \ \
include/net/net_debug.h +1 -1
@@ -27,7 +27,7 @@ void netdev_info(const struct net_device *dev, const char *format, ...);#define netdev_level_once (level, dev, fmt, ...) \ do { \ - static bool __section(".data.once") __print_once; \ + static bool __section(".data..once") __print_once; \ \ if (!__print_once) { \ __print_once = true; \
mm/internal.h +1 -1
@@ -42,7 +42,7 @@ struct folio_batch;* when we specify __GFP_NOWARN. */ #define WARN_ON_ONCE_GFP (cond, gfp) ({ \ - static bool __section(".data.once") __warned; \ + static bool __section(".data..once") __warned; \ int __ret_warn_once = !!(cond); \ \ if (unlikely(!(gfp & __GFP_NOWARN) && __ret_warn_once && !__warned)) { \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 799/817 kbuild: deb-pkg: Dont fail if modules.order is missing
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Fleming <[email protected]>
[ Upstream commit bcbbf493f2fa6fa1f0832f6b5b4c80a65de242d6 ]
Kernels built without CONFIG_MODULES might still want to create -dbg deb packages but install_linux_image_dbg() assumes modules.order always exists. This obviously isn't true if no modules were built, so we should skip reading modules.order in that case.
--- scripts/package/builddeb | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
scripts/package/builddeb +12 -10
@@ -97,16 +97,18 @@ install_linux_image_dbg () { # Parse modules.order directly because 'make modules_install' may sign, # compress modules, and then run unneeded depmod. - while read -r mod; do - mod="${mod%.o}.ko" - dbg="${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/kernel/${mod}" - buildid=$("${READELF}" -n "${mod}" | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p') - link="${pdir}/usr/lib/debug/.build-id/${buildid}.debug" - - mkdir -p "${dbg%/*}" "${link%/*}" - "${OBJCOPY}" --only-keep-debug "${mod}" "${dbg}" - ln -sf --relative "${dbg}" "${link}" - done < modules.order + if is_enabled CONFIG_MODULES; then + while read -r mod; do + mod="${mod%.o}.ko" + dbg="${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/kernel/${mod}" + buildid=$("${READELF}" -n "${mod}" | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p') + link="${pdir}/usr/lib/debug/.build-id/${buildid}.debug" + + mkdir -p "${dbg%/*}" "${link%/*}" + "${OBJCOPY}" --only-keep-debug "${mod}" "${dbg}" + ln -sf --relative "${dbg}" "${link}" + done < modules.order + fi # Build debug package # Different tools want the image in different locations
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 800/817 smb: Initialize cfid->tcon before performing network ops
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Aurich <[email protected]>
[ Upstream commit c353ee4fb119a2582d0e011f66a76a38f5cf984d ]
Avoid leaking a tcon ref when a lease break races with opening the cached directory. Processing the leak break might take a reference to the tcon in cached_dir_lease_break() and then fail to release the ref in cached_dir_offload_close, since cfid->tcon is still NULL.
--- fs/smb/client/cached_dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/cached_dir.c +1 -1
@@ -227,6 +227,7 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon, } } cfid->dentry = dentry; + cfid->tcon = tcon;/* * We do not hold the lock for the open because in case
@@ -298,7 +299,6 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon, } goto oshr_free; } - cfid->tcon = tcon; cfid->is_open = true;spin_lock (&cfids->cfid_list_lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 801/817 block: Dont allow an atomic write be truncated in blkdev_write_iter()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Garry <[email protected]>
[ Upstream commit 2cbd51f1f8739fd2fdf4bae1386bcf75ce0176ba ]
A write which goes past the end of the bdev in blkdev_write_iter() will be truncated. Truncating cannot tolerated for an atomic write, so error that condition.
--- block/fops.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
block/fops.c +4 -1
@@ -676,6 +676,7 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)struct file *file = iocb->ki_filp;struct inode *bd_inode =bdev_file_inode (file);struct block_device *bdev =I_BDEV (bd_inode); +bool atomic = iocb->ki_flags &IOCB_ATOMIC ;loff_t size =bdev_nr_bytes (bdev);size_t shorted =0 ;ssize_t ret;
@@ -695,7 +696,7 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)if ((iocb->ki_flags & (IOCB_NOWAIT |IOCB_DIRECT )) ==IOCB_NOWAIT )return -EOPNOTSUPP ; -if (iocb->ki_flags &IOCB_ATOMIC ) { +if (atomic) { ret =generic_atomic_write_valid (iocb, from);if (ret)return ret;
@@ -703,6 +704,8 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) size -= iocb->ki_pos;if (iov_iter_count (from) > size) { +if (atomic) +return -EINVAL ; shorted =iov_iter_count (from) - size;iov_iter_truncate (from, size); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 802/817 modpost: remove incorrect code in do_eisa_entry()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit 0c3e091319e4748cb36ac9a50848903dc6f54054 ]
This function contains multiple bugs after the following commits:
- ac551828993e ("modpost: i2c aliases need no trailing wildcard")
- 6543becf26ff ("mod/file2alias: make modalias generation safe for cross compiling")
Commit ac551828993e inserted the following code to do_eisa_entry():
else
strcat(alias, "*");
This is incorrect because 'alias' is uninitialized. If it is not NULL-terminated, strcat() could cause a buffer overrun.
Even if 'alias' happens to be zero-filled, it would output:
MODULE_ALIAS("*");This would match anything. As a result, the module could be loaded by any unrelated uevent from an unrelated subsystem.
Commit ac551828993e introduced another bug.
Prior to that commit, the conditional check was:
if (eisa->sig[0])
This checked if the first character of eisa_device_id::sig was not '\0'.
However, commit ac551828993e changed it as follows:
if (sig[0])
sig[0] is NOT the first character of the eisa_device_id::sig. The type of 'sig' is 'char (*)[8]', meaning that the type of 'sig[0]' is 'char [8]' instead of 'char'. 'sig[0]' and 'symval' refer to the same address, which never becomes NULL.
The correct conversion would have been:
if ((*sig)[0])
However, this if-conditional was meaningless because the earlier change in commit ac551828993e was incorrect.
This commit removes the entire incorrect code, which should never have been executed.
--- scripts/mod/file2alias.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
scripts/mod/file2alias.c +1 -4
@@ -809,10 +809,7 @@ static int do_eisa_entry(const char *filename, void *symval, char *alias) {DEF_FIELD_ADDR (symval, eisa_device_id, sig); -if (sig[0 ]) -sprintf (alias,EISA_DEVICE_MODALIAS_FMT "*" , *sig); -else -strcat (alias,"*" ); +sprintf (alias,EISA_DEVICE_MODALIAS_FMT "*" , *sig);return 1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 803/817 cifs: during remount, make sure passwords are in sync
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shyam Prasad N <[email protected]>
[ Upstream commit 0f0e357902957fba28ed31bde0d6921c6bd1485d ]
This fixes scenarios where remount can overwrite the only currently working password, breaking reconnect.
We recently introduced a password2 field in both ses and ctx structs. This was done so as to allow the client to rotate passwords for a mount without any downtime. However, when the client transparently handles password rotation, it can swap the values of the two password fields in the ses struct, but not in smb3_fs_context struct that hangs off cifs_sb. This can lead to a situation where a remount unintentionally overwrites a working password in the ses struct.
In order to fix this, we first get the passwords in ctx struct in-sync with ses struct, before replacing them with what the passwords that could be passed as a part of remount.
Also, in order to avoid race condition between smb2_reconnect and smb3_reconfigure, we make sure to lock session_mutex before changing password and password2 fields of the ses structure.
--- fs/smb/client/fs_context.c | 83 +++++++++++++++++++++++++++++++++----- fs/smb/client/fs_context.h | 1 + 2 files changed, 75 insertions(+), 9 deletions(-)
fs/smb/client/fs_context.c +74 -9
@@ -890,12 +890,37 @@ do { \ cifs_sb->ctx->field =NULL ; \ }while (0 ) +int smb3_sync_session_ctx_passwords(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses) +{ +if (ses->password && + cifs_sb->ctx->password && +strcmp (ses->password, cifs_sb->ctx->password)) { +kfree_sensitive (cifs_sb->ctx->password); + cifs_sb->ctx->password =kstrdup (ses->password,GFP_KERNEL ); +if (!cifs_sb->ctx->password) +return -ENOMEM ; + } +if (ses->password2 && + cifs_sb->ctx->password2 && +strcmp (ses->password2, cifs_sb->ctx->password2)) { +kfree_sensitive (cifs_sb->ctx->password2); + cifs_sb->ctx->password2 =kstrdup (ses->password2,GFP_KERNEL ); +if (!cifs_sb->ctx->password2) { +kfree_sensitive (cifs_sb->ctx->password); + cifs_sb->ctx->password =NULL ; +return -ENOMEM ; + } + } +return 0 ; +} +static int smb3_reconfigure (struct fs_context *fc) {struct smb3_fs_context *ctx =smb3_fc2context (fc);struct dentry *root = fc->root;struct cifs_sb_info *cifs_sb =CIFS_SB (root->d_sb);struct cifs_ses *ses =cifs_sb_master_tcon (cifs_sb)->ses; +char *new_password =NULL , *new_password2 =NULL ;bool need_recon = false;int rc;
@@ -915,21 +940,61 @@ static int smb3_reconfigure(struct fs_context *fc)STEAL_STRING (cifs_sb, ctx,UNC );STEAL_STRING (cifs_sb, ctx, source);STEAL_STRING (cifs_sb, ctx, username); +if (need_recon == false)STEAL_STRING_SENSITIVE (cifs_sb, ctx, password);else { -kfree_sensitive (ses->password); - ses->password =kstrdup (ctx->password,GFP_KERNEL ); -if (!ses->password) -return -ENOMEM ; -kfree_sensitive (ses->password2); - ses->password2 =kstrdup (ctx->password2,GFP_KERNEL ); -if (!ses->password2) { -kfree_sensitive (ses->password); - ses->password =NULL ; +if (ctx->password) { + new_password =kstrdup (ctx->password,GFP_KERNEL ); +if (!new_password) +return -ENOMEM ; + }else +STEAL_STRING_SENSITIVE (cifs_sb, ctx, password); + } + +/* +* if a new password2 has been specified, then reset it's value +* inside the ses struct +*/ +if (ctx->password2) { + new_password2 =kstrdup (ctx->password2,GFP_KERNEL ); +if (!new_password2) { +kfree_sensitive (new_password);return -ENOMEM ; } + }else +STEAL_STRING_SENSITIVE (cifs_sb, ctx, password2); + +/* +* we may update the passwords in the ses struct below. Make sure we do +* not race with smb2_reconnect +*/ +mutex_lock (&ses->session_mutex); + +/* +* smb2_reconnect may swap password and password2 in case session setup +* failed. First get ctx passwords in sync with ses passwords. It should +* be okay to do this even if this function were to return an error at a +* later stage +*/ + rc =smb3_sync_session_ctx_passwords (cifs_sb, ses); +if (rc) +return rc; + +/* +* now that allocations for passwords are done, commit them +*/ +if (new_password) { +kfree_sensitive (ses->password); + ses->password = new_password; } +if (new_password2) { +kfree_sensitive (ses->password2); + ses->password2 = new_password2; + } + +mutex_unlock (&ses->session_mutex); +STEAL_STRING (cifs_sb, ctx, domainname);STEAL_STRING (cifs_sb, ctx, nodename);STEAL_STRING (cifs_sb, ctx, iocharset);
fs/smb/client/fs_context.h +1 -0
@@ -298,6 +298,7 @@ static inline struct smb3_fs_context *smb3_fc2context(const struct fs_context *f }extern int smb3_fs_context_dup (struct smb3_fs_context *new_ctx,struct smb3_fs_context *ctx); +extern int smb3_sync_session_ctx_passwords (struct cifs_sb_info *cifs_sb,struct cifs_ses *ses);extern void smb3_update_mnt_flags (struct cifs_sb_info *cifs_sb);/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 804/817 cifs: unlock on error in smb3_reconfigure()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit cda88d2fef7aa7de80b5697e8009fcbbb436f42d ]
Unlock before returning if smb3_sync_session_ctx_passwords() fails.
--- fs/smb/client/fs_context.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/smb/client/fs_context.c +3 -1
@@ -978,8 +978,10 @@ static int smb3_reconfigure(struct fs_context *fc)* later stage */ rc =smb3_sync_session_ctx_passwords (cifs_sb, ses); -if (rc) +if (rc) { +mutex_unlock (&ses->session_mutex);return rc; + }/* * now that allocations for passwords are done, commit them
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 805/817 nfs: ignore SB_RDONLY when mounting nfs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Lingfeng <[email protected]>
[ Upstream commit 52cb7f8f177878b4f22397b9c4d2c8f743766be3 ]
When exporting only one file system with fsid=0 on the server side, the client alternately uses the ro/rw mount options to perform the mount operation, and a new vfsmount is generated each time.
It can be reproduced as follows:
[root@localhost ~]# mount /dev/sda /mnt2
[root@localhost ~]# echo "/mnt2 *(rw,no_root_squash,fsid=0)" >/etc/exports [root@localhost ~]# systemctl restart nfs-server [root@localhost ~]# mount -t nfs -o ro,vers=4 127.0.0.1:/ /mnt/sdaa [root@localhost ~]# mount -t nfs -o rw,vers=4 127.0.0.1:/ /mnt/sdaa [root@localhost ~]# mount -t nfs -o ro,vers=4 127.0.0.1:/ /mnt/sdaa [root@localhost ~]# mount -t nfs -o rw,vers=4 127.0.0.1:/ /mnt/sdaa [root@localhost ~]# mount | grep nfs4
127.0.0.1:/ on /mnt/sdaa type nfs4 (ro,relatime,vers=4.2,rsize=1048576,... 127.0.0.1:/ on /mnt/sdaa type nfs4 (rw,relatime,vers=4.2,rsize=1048576,... 127.0.0.1:/ on /mnt/sdaa type nfs4 (ro,relatime,vers=4.2,rsize=1048576,... 127.0.0.1:/ on /mnt/sdaa type nfs4 (rw,relatime,vers=4.2,rsize=1048576,... [root@localhost ~]#
We expected that after mounting with the ro option, using the rw option to mount again would return EBUSY, but the actual situation was not the case.
As shown above, when mounting for the first time, a superblock with the ro flag will be generated, and at the same time, in do_new_mount_fc --> do_add_mount, it detects that the superblock corresponding to the current target directory is inconsistent with the currently generated one (path->mnt->mnt_sb != newmnt->mnt.mnt_sb), and a new vfsmount will be generated.
When mounting with the rw option for the second time, since no matching superblock can be found in the fs_supers list, a new superblock with the rw flag will be generated again. The superblock in use (ro) is different from the newly generated superblock (rw), and a new vfsmount will be generated again.
When mounting with the ro option for the third time, the superblock (ro) is found in fs_supers, the superblock in use (rw) is different from the found superblock (ro), and a new vfsmount will be generated again.
We can switch between ro/rw through remount, and only one superblock needs to be generated, thus avoiding the problem of repeated generation of vfsmount caused by switching superblocks.
Furthermore, This can also resolve the issue described in the link.
--- fs/nfs/internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/internal.h +1 -1
@@ -11,7 +11,7 @@#include <linux/nfs_page.h> #include <linux/wait_bit.h> -#define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS) +#define NFS_SB_MASK (SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)extern const struct export_operations nfs_export_ops;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 806/817 sunrpc: clear XPRT_SOCK_UPD_TIMEOUT when reset transport
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Jian <[email protected]>
[ Upstream commit 4db9ad82a6c823094da27de4825af693a3475d51 ]
Since transport->sock has been set to NULL during reset transport, XPRT_SOCK_UPD_TIMEOUT also needs to be cleared. Otherwise, the xs_tcp_set_socket_timeouts() may be triggered in xs_tcp_send_request() to dereference the transport->sock that has been set to NULL.
--- net/sunrpc/xprtsock.c | 1 + 1 file changed, 1 insertion(+)
net/sunrpc/xprtsock.c +1 -0
@@ -1198,6 +1198,7 @@ static void xs_sock_reset_state_flags(struct rpc_xprt *xprt)clear_bit (XPRT_SOCK_WAKE_WRITE , &transport->sock_state);clear_bit (XPRT_SOCK_WAKE_DISCONNECT , &transport->sock_state);clear_bit (XPRT_SOCK_NOSPACE , &transport->sock_state); +clear_bit (XPRT_SOCK_UPD_TIMEOUT , &transport->sock_state); }static void xs_run_error_worker (struct sock_xprt *transport,unsigned int nr)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 807/817 SUNRPC: timeout and cancel TLS handshake with -ETIMEDOUT
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Coddington <[email protected]>
[ Upstream commit d7bdd849ef1b681da03ac05ca0957b2cbe2d24b6 ]
We've noticed a situation where an unstable TCP connection can cause the TLS handshake to timeout waiting for userspace to complete it. When this happens, we don't want to return from xs_tls_handshake_sync() with zero, as this will cause the upper xprt to be set CONNECTED, and subsequent attempts to transmit will be returned with -EPIPE. The sunrpc machine does not recover from this situation and will spin attempting to transmit.
The return value of tls_handshake_cancel() can be used to detect a race with completion:
* tls_handshake_cancel - cancel a pending handshake
* Return values:
* %true - Uncompleted handshake request was canceled
* %false - Handshake request already completed or not found
If true, we do not want the upper xprt to be connected, so return -ETIMEDOUT. If false, its possible the handshake request was lost and that may be the reason for our timeout. Again we do not want the upper xprt to be connected, so return -ETIMEDOUT.
Ensure that we alway return an error from xs_tls_handshake_sync() if we call tls_handshake_cancel().
--- net/sunrpc/xprtsock.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/sunrpc/xprtsock.c +4 -5
@@ -2615,11 +2615,10 @@ static int xs_tls_handshake_sync(struct rpc_xprt *lower_xprt, struct xprtsec_par rc =wait_for_completion_interruptible_timeout (&lower_transport->handshake_done,XS_TLS_HANDSHAKE_TO );if (rc <=0 ) { -if (!tls_handshake_cancel (sk)) { -if (rc ==0 ) - rc = -ETIMEDOUT ; - goto out_put_xprt; - } +tls_handshake_cancel (sk); +if (rc ==0 ) + rc = -ETIMEDOUT ; + goto out_put_xprt; } rc = lower_transport->xprt_err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 808/817 sunrpc: fix one UAF issue caused by sunrpc kernel tcp socket
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Jian <[email protected]>
[ Upstream commit 3f23f96528e8fcf8619895c4c916c52653892ec1 ]
BUG: KASAN: slab-use-after-free in tcp_write_timer_handler+0x156/0x3e0 Read of size 1 at addr ffff888111f322cd by task swapper/0/0 CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.0-rc4-dirty #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 Call Trace: <IRQ> dump_stack_lvl+0x68/0xa0 print_address_description.constprop.0+0x2c/0x3d0 print_report+0xb4/0x270 kasan_report+0xbd/0xf0 tcp_write_timer_handler+0x156/0x3e0 tcp_write_timer+0x66/0x170 call_timer_fn+0xfb/0x1d0 __run_timers+0x3f8/0x480 run_timer_softirq+0x9b/0x100 handle_softirqs+0x153/0x390 __irq_exit_rcu+0x103/0x120 irq_exit_rcu+0xe/0x20 sysvec_apic_timer_interrupt+0x76/0x90 </IRQ> <TASK> asm_sysvec_apic_timer_interrupt+0x1a/0x20 RIP: 0010:default_idle+0xf/0x20 Code: 4c 01 c7 4c 29 c2 e9 72 ff ff ff 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 f3 0f 1e fa 66 90 0f 00 2d 33 f8 25 00 fb f4 <fa> c3 cc cc cc cc 66 66 2e 0f 1f 84 00 00 00 00 00 90 90 90 90 90 RSP: 0018:ffffffffa2007e28 EFLAGS: 00000242 RAX: 00000000000f3b31 RBX: 1ffffffff4400fc7 RCX: ffffffffa09c3196 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffffff9f00590f RBP: 0000000000000000 R08: 0000000000000001 R09: ffffed102360835d R10: ffff88811b041aeb R11: 0000000000000001 R12: 0000000000000000 R13: ffffffffa202d7c0 R14: 0000000000000000 R15: 00000000000147d0 default_idle_call+0x6b/0xa0 cpuidle_idle_call+0x1af/0x1f0 do_idle+0xbc/0x130 cpu_startup_entry+0x33/0x40 rest_init+0x11f/0x210 start_kernel+0x39a/0x420 x86_64_start_reservations+0x18/0x30 x86_64_start_kernel+0x97/0xa0 common_startup_64+0x13e/0x141 </TASK> Allocated by task 595: kasan_save_stack+0x24/0x50 kasan_save_track+0x14/0x30 __kasan_slab_alloc+0x87/0x90 kmem_cache_alloc_noprof+0x12b/0x3f0 copy_net_ns+0x94/0x380 create_new_namespaces+0x24c/0x500 unshare_nsproxy_namespaces+0x75/0xf0 ksys_unshare+0x24e/0x4f0 __x64_sys_unshare+0x1f/0x30 do_syscall_64+0x70/0x180 entry_SYSCALL_64_after_hwframe+0x76/0x7e Freed by task 100: kasan_save_stack+0x24/0x50 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 __kasan_slab_free+0x54/0x70 kmem_cache_free+0x156/0x5d0 cleanup_net+0x5d3/0x670 process_one_work+0x776/0xa90 worker_thread+0x2e2/0x560 kthread+0x1a8/0x1f0 ret_from_fork+0x34/0x60 ret_from_fork_asm+0x1a/0x30
Reproduction script:
mkdir -p /mnt/nfsshare
mkdir -p /mnt/nfs/netns_1
mkfs.ext4 /dev/sdb
mount /dev/sdb /mnt/nfsshare
systemctl restart nfs-server
chmod 777 /mnt/nfsshare
exportfs -i -o rw,no_root_squash *:/mnt/nfsshare
ip netns add netns_1
ip link add name veth_1_peer type veth peer veth_1 ifconfig veth_1_peer 11.11.0.254 up
ip link set veth_1 netns netns_1
ip netns exec netns_1 ifconfig veth_1 11.11.0.1
ip netns exec netns_1 /root/iptables -A OUTPUT -d 11.11.0.254 -p tcp \
--tcp-flags FIN FIN -j DROP
(note: In my environment, a DESTROY_CLIENTID operation is always sent
immediately, breaking the nfs tcp connection.)
ip netns exec netns_1 timeout -s 9 300 mount -t nfs -o proto=tcp,vers=4.1 \ 11.11.0.254:/mnt/nfsshare /mnt/nfs/netns_1
ip netns del netns_1
The reason here is that the tcp socket in netns_1 (nfs side) has been shutdown and closed (done in xs_destroy), but the FIN message (with ack) is discarded, and the nfsd side keeps sending retransmission messages. As a result, when the tcp sock in netns_1 processes the received message, it sends the message (FIN message) in the sending queue, and the tcp timer is re-established. When the network namespace is deleted, the net structure accessed by tcp's timer handler function causes problems.
To fix this problem, let's hold netns refcnt for the tcp kernel socket as done in other modules. This is an ugly hack which can easily be backported to earlier kernels. A proper fix which cleans up the interfaces will follow, but may not be so easy to backport.
--- net/sunrpc/svcsock.c | 4 ++++ net/sunrpc/xprtsock.c | 7 +++++++ 2 files changed, 11 insertions(+)
net/sunrpc/svcsock.c +4 -0
@@ -1552,6 +1552,10 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv, newlen = error;if (protocol ==IPPROTO_TCP ) { +__netns_tracker_free (net, &sock->sk->ns_tracker, false); + sock->sk->sk_net_refcnt =1 ; +get_net_track (net, &sock->sk->ns_tracker,GFP_KERNEL ); +sock_inuse_add (net,1 );if ((error =kernel_listen (sock,64 )) <0 ) goto bummer; }
net/sunrpc/xprtsock.c +7 -0
@@ -1940,6 +1940,13 @@ static struct socket *xs_create_sock(struct rpc_xprt *xprt, goto out; } +if (protocol ==IPPROTO_TCP ) { +__netns_tracker_free (xprt->xprt_net, &sock->sk->ns_tracker, false); + sock->sk->sk_net_refcnt =1 ; +get_net_track (xprt->xprt_net, &sock->sk->ns_tracker,GFP_KERNEL ); +sock_inuse_add (xprt->xprt_net,1 ); + } + filp =sock_alloc_file (sock,O_NONBLOCK ,NULL );if (IS_ERR (filp))return ERR_CAST (filp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 809/817 nfs/blocklayout: Dont attempt unregister for invalid block device
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Coddington <[email protected]>
[ Upstream commit 3a4ce14d9a6b868e0787e4582420b721c04ee41e ]
Since commit d869da91cccb ("nfs/blocklayout: Fix premature PR key unregistration") an unmount of a pNFS SCSI layout-enabled NFS may dereference a NULL block_device in:
bl_unregister_scsi+0x16/0xe0 [blocklayoutdriver] bl_free_device+0x70/0x80 [blocklayoutdriver] bl_free_deviceid_node+0x12/0x30 [blocklayoutdriver] nfs4_put_deviceid_node+0x60/0xc0 [nfsv4] nfs4_deviceid_purge_client+0x132/0x190 [nfsv4] unset_pnfs_layoutdriver+0x59/0x60 [nfsv4] nfs4_destroy_server+0x36/0x70 [nfsv4] nfs_free_server+0x23/0xe0 [nfs] deactivate_locked_super+0x30/0xb0 cleanup_mnt+0xba/0x150 task_work_run+0x59/0x90 syscall_exit_to_user_mode+0x217/0x220 do_syscall_64+0x8e/0x160
This happens because even though we were able to create the nfs4_deviceid_node, the lookup for the device was unable to attach the block device to the pnfs_block_dev.
If we never found a block device to register, we can avoid this case with the PNFS_BDEV_REGISTERED flag. Move the deref behind the test for the flag.
--- fs/nfs/blocklayout/dev.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
fs/nfs/blocklayout/dev.c +2 -4
@@ -20,9 +20,6 @@ static void bl_unregister_scsi(struct pnfs_block_dev *dev)const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;int status; -if (!test_and_clear_bit (PNFS_BDEV_REGISTERED , &dev->flags)) -return ; - status = ops->pr_register (bdev, dev->pr_key,0 , false);if (status)trace_bl_pr_key_unreg_err (bdev, dev->pr_key, status);
@@ -58,7 +55,8 @@ static void bl_unregister_dev(struct pnfs_block_dev *dev)return ; } -if (dev->type ==PNFS_BLOCK_VOLUME_SCSI ) +if (dev->type ==PNFS_BLOCK_VOLUME_SCSI && +test_and_clear_bit (PNFS_BDEV_REGISTERED , &dev->flags))bl_unregister_scsi (dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 810/817 nfs/blocklayout: Limit repeat device registration on failure
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Coddington <[email protected]>
[ Upstream commit 614733f9441ed53bb442d4734112ec1e24bd6da7 ]
Every pNFS SCSI IO wants to do LAYOUTGET, then within the layout find the device which can drive GETDEVINFO, then finally may need to prep the device with a reservation. This slow work makes a mess of IO latencies if one of the later steps is going to fail for awhile.
If we're unable to register a SCSI device, ensure we mark the device as unavailable so that it will timeout and be re-added via GETDEVINFO. This avoids repeated doomed attempts to register a device in the IO path.
Add some clarifying comments as well.
--- fs/nfs/blocklayout/blocklayout.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
fs/nfs/blocklayout/blocklayout.c +14 -1
@@ -571,19 +571,32 @@ bl_find_get_deviceid(struct nfs_server *server,if (!node)return ERR_PTR (-ENODEV ); +/* +* Devices that are marked unavailable are left in the cache with a +* timeout to avoid sending GETDEVINFO after every LAYOUTGET, or +* constantly attempting to register the device. Once marked as +* unavailable they must be deleted and never reused. +*/ if (test_bit (NFS_DEVICEID_UNAVAILABLE , &node->flags)) {unsigned long end = jiffies;unsigned long start = end -PNFS_DEVICE_RETRY_TIMEOUT ;if (!time_in_range (node->timestamp_unavailable, start, end)) { +/* Uncork subsequent GETDEVINFO operations for this device */ nfs4_delete_deviceid (node->ld, node->nfs_client, id); goto retry; } goto out_put; } - if (!bl_register_dev(container_of(node, struct pnfs_block_dev, node))) + if (!bl_register_dev(container_of(node, struct pnfs_block_dev, node))) { +/* +* If we cannot register, treat this device as transient: +* Make a negative cache entry for the device +*/ +nfs4_mark_deviceid_unavailable (node); goto out_put; + }return node;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 811/817 block, bfq: fix bfqq uaf in bfq_limit_depth()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Kuai <[email protected]>
[ Upstream commit e8b8344de3980709080d86c157d24e7de07d70ad ]
Set new allocated bfqq to bic or remove freed bfqq from bic are both protected by bfqd->lock, however bfq_limit_depth() is deferencing bfqq from bic without the lock, this can lead to UAF if the io_context is shared by multiple tasks.
For example, test bfq with io_uring can trigger following UAF in v6.6:
==================================================================
BUG: KASAN: slab-use-after-free in bfqq_group+0x15/0x50 Call Trace: <TASK> dump_stack_lvl+0x47/0x80 print_address_description.constprop.0+0x66/0x300 print_report+0x3e/0x70 kasan_report+0xb4/0xf0 bfqq_group+0x15/0x50 bfqq_request_over_limit+0x130/0x9a0 bfq_limit_depth+0x1b5/0x480 __blk_mq_alloc_requests+0x2b5/0xa00 blk_mq_get_new_requests+0x11d/0x1d0 blk_mq_submit_bio+0x286/0xb00 submit_bio_noacct_nocheck+0x331/0x400 __block_write_full_folio+0x3d0/0x640 writepage_cb+0x3b/0xc0 write_cache_pages+0x254/0x6c0 write_cache_pages+0x254/0x6c0 do_writepages+0x192/0x310 filemap_fdatawrite_wbc+0x95/0xc0 __filemap_fdatawrite_range+0x99/0xd0 filemap_write_and_wait_range.part.0+0x4d/0xa0 blkdev_read_iter+0xef/0x1e0 io_read+0x1b6/0x8a0 io_issue_sqe+0x87/0x300 io_wq_submit_work+0xeb/0x390 io_worker_handle_work+0x24d/0x550 io_wq_worker+0x27f/0x6c0 ret_from_fork_asm+0x1b/0x30 </TASK> Allocated by task 808602: kasan_save_stack+0x1e/0x40 kasan_set_track+0x21/0x30 __kasan_slab_alloc+0x83/0x90 kmem_cache_alloc_node+0x1b1/0x6d0 bfq_get_queue+0x138/0xfa0 bfq_get_bfqq_handle_split+0xe3/0x2c0 bfq_init_rq+0x196/0xbb0 bfq_insert_request.isra.0+0xb5/0x480 bfq_insert_requests+0x156/0x180 blk_mq_insert_request+0x15d/0x440 blk_mq_submit_bio+0x8a4/0xb00 submit_bio_noacct_nocheck+0x331/0x400 __blkdev_direct_IO_async+0x2dd/0x330 blkdev_write_iter+0x39a/0x450 io_write+0x22a/0x840 io_issue_sqe+0x87/0x300 io_wq_submit_work+0xeb/0x390 io_worker_handle_work+0x24d/0x550 io_wq_worker+0x27f/0x6c0 ret_from_fork+0x2d/0x50 ret_from_fork_asm+0x1b/0x30 Freed by task 808589: kasan_save_stack+0x1e/0x40 kasan_set_track+0x21/0x30 kasan_save_free_info+0x27/0x40 __kasan_slab_free+0x126/0x1b0 kmem_cache_free+0x10c/0x750 bfq_put_queue+0x2dd/0x770 __bfq_insert_request.isra.0+0x155/0x7a0 bfq_insert_request.isra.0+0x122/0x480 bfq_insert_requests+0x156/0x180 blk_mq_dispatch_plug_list+0x528/0x7e0 blk_mq_flush_plug_list.part.0+0xe5/0x590 __blk_flush_plug+0x3b/0x90 blk_finish_plug+0x40/0x60 do_writepages+0x19d/0x310 filemap_fdatawrite_wbc+0x95/0xc0 __filemap_fdatawrite_range+0x99/0xd0 filemap_write_and_wait_range.part.0+0x4d/0xa0 blkdev_read_iter+0xef/0x1e0 io_read+0x1b6/0x8a0 io_issue_sqe+0x87/0x300 io_wq_submit_work+0xeb/0x390 io_worker_handle_work+0x24d/0x550 io_wq_worker+0x27f/0x6c0 ret_from_fork+0x2d/0x50 ret_from_fork_asm+0x1b/0x30
Fix the problem by protecting bic_to_bfqq() with bfqd->lock.
--- block/bfq-iosched.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-)
block/bfq-iosched.c +24 -13
@@ -582,23 +582,31 @@ static struct request *bfq_choose_req(struct bfq_data *bfqd,#define BFQ_LIMIT_INLINE_DEPTH 16#ifdef CONFIG_BFQ_GROUP_IOSCHED -static bool bfqq_request_over_limit (struct bfq_queue *bfqq,int limit) +static bool bfqq_request_over_limit (struct bfq_data *bfqd, +struct bfq_io_cq *bic,blk_opf_t opf, +unsigned int act_idx,int limit) { -struct bfq_data *bfqd = bfqq->bfqd; -struct bfq_entity *entity = &bfqq->entity;struct bfq_entity *inline_entities[BFQ_LIMIT_INLINE_DEPTH ];struct bfq_entity **entities = inline_entities; -int depth, level, alloc_depth =BFQ_LIMIT_INLINE_DEPTH ; -int class_idx = bfqq->ioprio_class -1 ; +int alloc_depth =BFQ_LIMIT_INLINE_DEPTH ;struct bfq_sched_data *sched_data; +struct bfq_entity *entity; +struct bfq_queue *bfqq;unsigned long wsum;bool ret = false; - -if (!entity->on_st_or_in_serv) -return false; +int depth; +int level; retry:spin_lock_irq (&bfqd->lock); + bfqq =bic_to_bfqq (bic,op_is_sync (opf), act_idx); +if (!bfqq) + goto out; + + entity = &bfqq->entity; +if (!entity->on_st_or_in_serv) + goto out; +/* +1 for bfqq entity, root cgroup not included */ depth =bfqg_to_blkg (bfqq_group (bfqq))->blkcg->css.cgroup->level +1 ;if (depth > alloc_depth) {
@@ -643,7 +651,7 @@ static bool bfqq_request_over_limit(struct bfq_queue *bfqq, int limit)* class. */ wsum =0 ; -for (i =0 ; i <= class_idx; i++) { +for (i =0 ; i <= bfqq->ioprio_class -1 ; i++) { wsum = wsum *IOPRIO_BE_NR + sched_data->service_tree[i].wsum; }
@@ -666,7 +674,9 @@ static bool bfqq_request_over_limit(struct bfq_queue *bfqq, int limit) return ret; }#else -static bool bfqq_request_over_limit (struct bfq_queue *bfqq,int limit) +static bool bfqq_request_over_limit (struct bfq_data *bfqd, +struct bfq_io_cq *bic,blk_opf_t opf, +unsigned int act_idx,int limit) {return false; }
@@ -704,8 +714,9 @@ static void bfq_limit_depth(blk_opf_t opf, struct blk_mq_alloc_data *data) }for (act_idx =0 ; bic && act_idx < bfqd->num_actuators; act_idx++) { -struct bfq_queue *bfqq = -bic_to_bfqq (bic,op_is_sync (opf), act_idx); +/* Fast path to check if bfqq is already allocated. */ +if (!bic_to_bfqq (bic,op_is_sync (opf), act_idx)) +continue ;/* * Does queue (or any parent entity) exceed number of
@@ -713,7 +724,7 @@ static void bfq_limit_depth(blk_opf_t opf, struct blk_mq_alloc_data *data)* limit depth so that it cannot consume more * available requests and thus starve other entities. */ -if (bfqq &&bfqq_request_over_limit (bfqq, limit)) { +if (bfqq_request_over_limit (bfqd, bic, opf, act_idx, limit)) { depth =1 ;break ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 812/817 brd: decrease the number of allocated pages which discarded
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Xianwei <[email protected]>
[ Upstream commit 82734209bedd65a8b508844bab652b464379bfdd ]
The number of allocated pages which discarded will not decrease. Fix it.
--- drivers/block/brd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/block/brd.c +3 -1
@@ -231,8 +231,10 @@ static void brd_do_discard(struct brd_device *brd, sector_t sector, u32 size)xa_lock (&brd->brd_pages);while (size >=PAGE_SIZE && aligned_sector < rd_size *2 ) { page =__xa_erase (&brd->brd_pages, aligned_sector >>PAGE_SECTORS_SHIFT ); -if (page) +if (page) {__free_page (page); + brd->brd_nr_pages--; + } aligned_sector +=PAGE_SECTORS ; size -=PAGE_SIZE ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 813/817 sh: intc: Fix use-after-free bug in register_intc_controller()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 63e72e551942642c48456a4134975136cdcb9b3c ]
In the error handling for this function, d is freed without ever removing it from intc_list which would lead to a use after free. To fix this, let's only add it to the list after everything has succeeded.
--- drivers/sh/intc/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/sh/intc/core.c +1 -1
@@ -209,7 +209,6 @@ int __init register_intc_controller(struct intc_desc *desc) goto err0;INIT_LIST_HEAD (&d->list); -list_add_tail (&d->list, &intc_list);raw_spin_lock_init (&d->lock);INIT_RADIX_TREE (&d->tree,GFP_ATOMIC );
@@ -369,6 +368,7 @@ int __init register_intc_controller(struct intc_desc *desc) d->skip_suspend = desc->skip_syscore_suspend; +list_add_tail (&d->list, &intc_list); nr_intc_controllers++;return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 814/817 tools/power turbostat: Fix trailing \n parsing
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Rui <[email protected]>
[ Upstream commit fed8511cc8996989178823052dc0200643e1389a ]
parse_cpu_string() parses the string input either from command line or from /sys/fs/cgroup/cpuset.cpus.effective to get a list of CPUs that turbostat can run with.
The cpu string returned by /sys/fs/cgroup/cpuset.cpus.effective contains a trailing '\n', but strtoul() fails to treat this as an error.
That says, for the code below
val = ("\n", NULL, 10);val returns 0, and errno is also not set.
As a result, CPU0 is erroneously considered as allowed CPU and this causes failures when turbostat tries to run on CPU0.
get_counters: Could not migrate to CPU 0
...
turbostat: re-initialized with num_cpus 8, allowed_cpus 5
get_counters: Could not migrate to CPU 0
Add a check to return immediately if '\n' or '\0' is detected.
--- tools/power/x86/turbostat/turbostat.c | 3 +++ 1 file changed, 3 insertions(+)
tools/power/x86/turbostat/turbostat.c +3 -0
@@ -5385,6 +5385,9 @@ static int parse_cpu_str(char *cpu_str, cpu_set_t *cpu_set, int cpu_set_size)if (*next =='-' )/* no negative cpu numbers */ return 1 ; +if (*next =='\0' || *next =='\n' ) +break ; + start =strtoul (next, &next,10 );if (start >=CPU_SUBSET_MAXCPUS )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 815/817 tools/power turbostat: Fix childs argument forwarding
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patryk Wlazlyn <[email protected]>
[ Upstream commit 1da0daf746342dfdc114e4dc8fbf3ece28666d4f ]
Add '+' to optstring when early scanning for --no-msr and --no-perf. It causes option processing to stop as soon as a nonoption argument is encountered, effectively skipping child's arguments.
--- tools/power/x86/turbostat/turbostat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/power/x86/turbostat/turbostat.c +1 -1
@@ -9784,7 +9784,7 @@ void cmdline(int argc, char **argv)* Parse some options early, because they may make other options invalid, * like adding the MSR counter with --add and at the same time using --no-msr. */ -while ((opt =getopt_long_only (argc, argv,"MPn:" , long_options, &option_index)) !=-1 ) { +while ((opt =getopt_long_only (argc, argv,"+MPn:" , long_options, &option_index)) !=-1 ) {switch (opt) {case 'M' : no_msr =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 816/817 block: always verify unfreeze lock on the owner task
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit 6a78699838a0ddeed3620ddf50c1521f1fe1e811 upstream.
commit f1be1788a32e ("block: model freeze & enter queue as lock for supporting lockdep") tries to apply lockdep for verifying freeze & unfreeze. However, the verification is only done the outmost freeze and unfreeze. This way is actually not correct because q->mq_freeze_depth still may drop to zero on other task instead of the freeze owner task.
Fix this issue by always verifying the last unfreeze lock on the owner task context, and make sure both the outmost freeze & unfreeze are verified in the current task.
--- block/blk-core.c | 2 - block/blk-mq.c | 62 ++++++++++++++++++++++++++++++++++++++++++------- block/blk.h | 3 +- include/linux/blkdev.h | 4 +++ 4 files changed, 61 insertions(+), 10 deletions(-)
block/blk-core.c +1 -1
@@ -287,7 +287,7 @@ bool blk_queue_start_drain(struct reques* entering queue, so we call blk_freeze_queue_start() to * prevent I/O from crossing blk_queue_enter(). */ -bool freeze =__blk_freeze_queue_start (q); +bool freeze =__blk_freeze_queue_start (q, current);if (queue_is_mq (q))blk_mq_wake_waiters (q);/* Make blk_queue_enter() reexamine the DYING flag. */
block/blk-mq.c +54 -8
103 lines not on this page · raw message
block/blk.h +2 -1
@@ -38,7 +38,8 @@ void blk_free_flush_queue(struct blk_fluvoid blk_freeze_queue (struct request_queue *q);bool __blk_mq_unfreeze_queue (struct request_queue *q,bool force_atomic);bool blk_queue_start_drain (struct request_queue *q); -bool __blk_freeze_queue_start (struct request_queue *q); +bool __blk_freeze_queue_start (struct request_queue *q, +struct task_struct *owner);int __bio_queue_enter (struct request_queue *q,struct bio *bio);void submit_bio_noacct_nocheck (struct bio *bio);void bio_await_chain (struct bio *bio);
include/linux/blkdev.h +4 -0
@@ -572,6 +572,10 @@ struct request_queue {struct throtl_data *td;#endif struct rcu_head rcu_head; +#ifdef CONFIG_LOCKDEP +struct task_struct *mq_freeze_owner; +int mq_freeze_owner_depth; +#endif wait_queue_head_t mq_freeze_wq;/* * Protect concurrent access to q_usage_counter by
Greg Kroah-Hartman
maintainerPATCH 817/817 block: dont verify IO lock for freeze/unfreeze in elevator_init_mq()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit 357e1b7f730bd85a383e7afa75a3caba329c5707 upstream.
elevator_init_mq() is only called at the entry of add_disk_fwnode() when disk IO isn't allowed yet.
So not verify io lock(q->io_lockdep_map) for freeze & unfreeze in elevator_init_mq().
--- block/elevator.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
block/elevator.c +8 -2
@@ -598,13 +598,19 @@ void elevator_init_mq(struct request_que* drain any dispatch activities originated from passthrough * requests, then no need to quiesce queue which may add long boot * latency, especially when lots of disks are involved. +* +* Disk isn't added yet, so verifying queue lock only manually. */ -blk_mq_freeze_queue (q); +blk_freeze_queue_start_non_owner (q); +blk_freeze_acquire_lock (q, true, false); +blk_mq_freeze_queue_wait (q); +blk_mq_cancel_work_sync (q); err =blk_mq_init_sched (q, e); -blk_mq_unfreeze_queue (q); +blk_unfreeze_release_lock (q, true, false); +blk_mq_unfreeze_queue_non_owner (q);if (err) { pr_warn("\"%s\" elevator initialization failed, "
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.11.11 release. There are 817 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.
Am 03.12.2024 um 15:32 schrieb Greg Kroah-Hartman:
Quoted 9 lines
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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 14 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
perf fails to build for ARM 32-bit, ARM 64-bit and BMIPS with:
util/stat-display.c: In function 'uniquify_event_name':util/stat-display.c:895:45: error: 'struct evsel' has no member named 'alternate_hw_config'
895 | if (counter->pmu->is_core &&counter->alternate_hw_config != PERF_COUNT_HW_MAX)
| ^~
make[6]: *** [/local/users/fainelli/buildroot/output/arm/build/linux-custom/tools/build/Makefile.build:106: /local/users/fainelli/buildroot/output/arm/build/linux-custom/tools/perf/util/stat-display.o] Error 1 make[5]: *** [/local/users/fainelli/buildroot/output/arm/build/linux-custom/tools/build/Makefile.build:158: util] Error 2
make[4]: *** [Makefile.perf:787: /local/users/fainelli/buildroot/output/arm/build/linux-custom/tools/perf/perf-util-in.o] Error 2
make[3]: *** [Makefile.perf:290: sub-make] Error 2
make[2]: *** [Makefile:70: all] Error 2
make[1]: *** [package/pkg-generic.mk:300: /local/users/fainelli/buildroot/output/arm/build/linux-tools/.stamp_built] Error 2
make: *** [Makefile:29: _all] Error 2
This is caused by 73666ad2a629ae8c2fbe3b7211ef9a56de4b5948 ("perf stat: Uniquify event name improvements")
Signature · 1 line
Florian
Hello,
Quoted 5 lines · On Tue, 3 Dec 2024 15:32:52 +0100 Greg Kroah-Hartman…
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------
Quoted 7 lines
This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +0000. Anything received after that time might be too late.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/damonitor/damon-tests/tree/next/corr
[2] 57f39ce086c9 ("Linux 6.11.11-rc1")
Thanks,
SJ
[...]
---
ok 9 selftests: damon: damos_tried_regions.py
ok 10 selftests: damon: damon_nr_regions.py
ok 11 selftests: damon: reclaim.sh
ok 12 selftests: damon: lru_sort.sh
ok 13 selftests: damon: debugfs_empty_targets.sh
ok 14 selftests: damon: debugfs_huge_count_read_write.sh
ok 15 selftests: damon: debugfs_duplicate_context_creation.sh ok 16 selftests: damon: debugfs_rm_non_contexts.sh
ok 17 selftests: damon: debugfs_target_ids_read_before_terminate_race.sh ok 18 selftests: damon: debugfs_target_ids_pid_leak.sh
ok 19 selftests: damon: sysfs_update_removed_scheme_dir.sh
ok 20 selftests: damon: sysfs_update_schemes_tried_regions_hang.py ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh # SKIP
ok 12 selftests: damon-tests: build_m68k.sh # SKIP
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
[33m
[92mPASS [39m
Quoted 14 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 15 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
Regressions on arm64, arm, x86_64, riscv and powerpc.
The listed below errors are the same as reported on stable-rc linux-6.12.y
1) The allmodconfig builds failed on arm64, arm, riscv and x86_64 due to following build warnings / errors.
Build error allmodconfig:
------------------------
/drivers/gpu/drm/imx/ipuv3/parallel-display.c:75:3: error: variable 'num_modes' is uninitialized when used here [-Werror,-Wuninitialized]
75 | num_modes++;
| ^~~~~~~~~
/drivers/gpu/drm/imx/ipuv3/parallel-display.c:55:15: note: initialize
the variable 'num_modes' to silence this warning
55 | int num_modes;
| ^
| = 01 error generated.
make[8]: *** [/scripts/Makefile.build:244:drivers/gpu/drm/imx/ipuv3/parallel-display.o] Error 1 /drivers/gpu/drm/imx/ipuv3/imx-ldb.c:143:3: error: variable 'num_modes' is uninitialized when used here [-Werror,-Wuninitialized]
143 | num_modes++;
| ^~~~~~~~~
/drivers/gpu/drm/imx/ipuv3/imx-ldb.c:133:15: note: initialize the
variable 'num_modes' to silence this warning
133 | int num_modes;
| ^
| = 01 error generated.
2) The powerpc builds failed due to these build warnings / errors. Build errors on powerpc:
---------------
ERROR: modpost: "gcm_update" [arch/powerpc/crypto/aes-gcm-p10-crypto.ko] undefined!
3) As other reported perf build failures
Build errors perf:
----------------------
util/stat-display.c: In function 'uniquify_event_name':
util/stat-display.c:895:45: error: 'struct evsel' has no member
named 'alternate_hw_config'
895 | if (counter->pmu->is_core &&
counter->alternate_hw_config != PERF_COUNT_HW_MAX)
| ^~
## Build
* kernel: 6.11.11-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: 57f39ce086c9b727df2d92ea7ab7cc80e89d7ed2
* git describe: v6.11.10-818-g57f39ce086c9
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.11.y/build/v6.11.10-818-g57f39ce086c9
## Test Regressions (compared to v6.11.9-108-gc9b39c48bf4a)
* arm, build
- gcc-13-lkftconfig-perf
* arm64, build
- clang-19-allmodconfig
- gcc-13-lkftconfig-perf
* i386, build
- gcc-13-lkftconfig-perf
* powerpc, build
- clang-19-defconfig
- clang-nightly-defconfig
- gcc-13-defconfig
- gcc-8-defconfig
* riscv, build
- clang-19-allmodconfig
* x86_64, build
- clang-19-allmodconfig
- gcc-13-lkftconfig-perf
## Metric Regressions (compared to v6.11.9-108-gc9b39c48bf4a)
## Test Fixes (compared to v6.11.9-108-gc9b39c48bf4a)
## Metric Fixes (compared to v6.11.9-108-gc9b39c48bf4a)
## Test result summary
total: 130907, pass: 108166, fail: 1524, skip: 21217, xfail: 0
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 130 total, 127 passed, 3 failed
* arm64: 42 total, 40 passed, 2 failed
* i386: 18 total, 15 passed, 3 failed
* mips: 26 total, 25 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 32 total, 27 passed, 5 failed
* riscv: 16 total, 14 passed, 2 failed
* s390: 14 total, 13 passed, 1 failed
* sh: 5 total, 5 passed, 0 failed
* sparc: 4 total, 3 passed, 1 failed
* x86_64: 34 total, 32 passed, 2 failed
## Test suites summary
* boot
* commands
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-filesystems-epoll
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-kcmp
* kselftest-kvm
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-mincore
* kselftest-mqueue
* kselftest-net
* kselftest-net-mptcp
* kselftest-openat2
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-rust
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-tc-testing
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user_events
* kselftest-vDSO
* kselftest-watchdog
* kselftest-x86
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* 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-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* rcutorture
--
Linaro LKFT
https://lkft.linaro.org
Quoted 14 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 11 lines · On Tue, 03 Dec 2024 15:32:52 +0100 Greg Kroah-Hartman…
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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
Responses should be made by Thu, 05 Dec 2024 14:36:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.11.11-rc1.gz
or in the git tree and branch at:git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y and the diffstat can be found below.
Boot-tested under QEMU for Rust x86_64, arm64 and riscv64; built-tested for loongarch64:
Thanks!
Cheers,
Miguel
Quoted 14 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
OVERVIEW
Builds: 14 passed, 0 failed
Boot tests: 0 passed, 0 failed
CI systems: broonie
REVISION
Commit
name: v6.11.10-818-g57f39ce086c9
hash: 57f39ce086c9b727df2d92ea7ab7cc80e89d7ed2
Checked out from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.11.yBUILDS
No build failures found
BOOT TESTS
No boot failures found
See complete and up-to-date report at:
https://kcidb.kernelci.org/d/revision/revision?orgId=1&var-git_commit_hash=57f39ce086c9b727df2d92ea7ab7cc80e89d7ed2&var-patchset_hash=
Thanks,
KernelCI team
Jon Hunter
maintainerQuoted 14 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
Failures detected for Tegra ...
Test results for stable-v6.11:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
111 tests: 109 pass, 2 failLinux version: 6.11.11-rc1-g57f39ce086c9
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Test failures: tegra186-p2771-0000: cpufreq
tegra186-p2771-0000: mmc-dd-urandom.sh
Jon
Quoted 31 lines · Jon Hunter
Quoted 14 lines · Greg Kroah-Hartman
-----------
Note, this is will probably be the last 6.11.y kernel to be released. Please move to the 6.12.y branch at this time.
-----------This is the start of the stable review cycle for the 6.11.11 release. There are 817 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, 05 Dec 2024 14:36:47 +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.11.11-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
Failures detected for Tegra ...
Test results for stable-v6.11:
10 builds: 10 pass, 0 fail 26 boots: 26 pass, 0 fail 111 tests: 109 pass, 2 fail
Quoted 8 lines
Linux version: 6.11.11-rc1-g57f39ce086c9
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04Test failures: tegra186-p2771-0000: cpufreq
tegra186-p2771-0000: mmc-dd-urandom.sh
This is a known issue in the mainline that was not caught for Linux v6.12. It is intermittent and so not easily caught. It landed in stable before this cycle and so nothing we can resolve on this cycle. The good news is that a fix [0] has been identified and once in mainline we can backport for stable. It is a networking issue that is causing random test failures when running with NFS.
With that for this update ...
Jon
[0] https://lore.kernel.org/netdev/[email protected]/
Signature · 1 line
nvpublic