From 17aa67421d0efec9e1b965d2e2f7bf4bd541cbbb Mon Sep 17 00:00:00 2001 From: Chandan Babu R Date: Tue, 4 Nov 2025 14:44:37 +0530 Subject: [PATCH] repair/prefetch.c: Create one workqueue with multiple workers When xfs_repair is executed with a non-zero value for ag_stride, do_inode_prefetch() create multiple workqueues with each of them having just one worker thread. Since commit 12838bda12e669 ("libfrog: fix overly sleep workqueues"), a workqueue can process multiple work items concurrently. Hence, this commit replaces the above logic with just one workqueue having multiple workers. Signed-off-by: Chandan Babu R Reviewed-by: Christoph Hellwig Reviewed-by: Darrick J. Wong --- repair/prefetch.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/repair/prefetch.c b/repair/prefetch.c index 5ecf19ae..8cd3416f 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -1024,7 +1024,6 @@ do_inode_prefetch( { int i; struct workqueue queue; - struct workqueue *queues; int queues_started = 0; /* @@ -1056,7 +1055,7 @@ do_inode_prefetch( /* * create one worker thread for each segment of the volume */ - queues = malloc(thread_count * sizeof(struct workqueue)); + create_work_queue(&queue, mp, thread_count); for (i = 0; i < thread_count; i++) { struct pf_work_args *wargs; @@ -1067,8 +1066,7 @@ do_inode_prefetch( wargs->dirs_only = dirs_only; wargs->func = func; - create_work_queue(&queues[i], mp, 1); - queue_work(&queues[i], prefetch_ag_range_work, 0, wargs); + queue_work(&queue, prefetch_ag_range_work, 0, wargs); queues_started++; if (wargs->end_ag >= mp->m_sb.sb_agcount) @@ -1078,9 +1076,7 @@ do_inode_prefetch( /* * wait for workers to complete */ - for (i = 0; i < queues_started; i++) - destroy_work_queue(&queues[i]); - free(queues); + destroy_work_queue(&queue); } void -- 2.47.3