Fix a couple of code paths that forgot to tear down a workqueue when
erroring out, because if we don't the wq threads keep running even after
we've freed the wq memory.
Found by fuzzing core.nlinkv2=0 in xfs/377, but only because the fs will
shut down when it hits an error destroying the incore (corrupt) inode
after the scrub.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
*/
moveon = xfs_scrub_primary_super(ctx);
if (!moveon)
- return moveon;
+ goto out;
for (agno = 0; moveon && agno < ctx->geo.agcount; agno++) {
ret = workqueue_add(&wq, xfs_scan_ag_metadata, agno, &moveon);
if (ret) {
str_info(ctx, ctx->mntpoint,
_("Could not queue directory scan work."));
- goto out_free;
+ goto out_wq;
}
pthread_mutex_lock(&sft.lock);
workqueue_destroy(&wq);
return sft.moveon;
+out_wq:
+ workqueue_destroy(&wq);
out_free:
free(sftd->path);
free(sftd);