[PATCH 2/2] repair/prefetch.c: Create one workqueue with multiple workers

Chandan Babu R
2025-11-04T09:15:11Z

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 <chandanbabu@kernel.org>
---
repair/prefetch.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/repair/prefetch.c b/repair/prefetch.c
index 5ecf19ae9..8cd3416fa 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.45.2