From: Chandan Babu R Date: Tue, 4 Nov 2025 09:14:37 +0000 (+0530) Subject: repair/prefetch.c: Create one workqueue with multiple workers X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Ffor-next;p=thirdparty%2Fxfsprogs-dev.git 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 --- 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