From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Fix all the places where we drop or screw up error handling in scan_fs_tree. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- scrub/vfs.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/scrub/vfs.c b/scrub/vfs.c index e0bc3ea4..d7c40239 100644 --- a/scrub/vfs.c +++ b/scrub/vfs.c @@ -216,6 +216,7 @@ scan_fs_tree( { struct workqueue wq; struct scan_fs_tree sft; + bool moveon = false; int ret; sft.moveon = true; @@ -224,14 +225,22 @@ scan_fs_tree( sft.dir_fn = dir_fn; sft.dirent_fn = dirent_fn; sft.arg = arg; - pthread_mutex_init(&sft.lock, NULL); - pthread_cond_init(&sft.wakeup, NULL); + ret = pthread_mutex_init(&sft.lock, NULL); + if (ret) { + str_liberror(ctx, ret, _("creating directory scan lock")); + return false; + } + ret = pthread_cond_init(&sft.wakeup, NULL); + if (ret) { + str_liberror(ctx, ret, _("creating directory scan signal")); + goto out_mutex; + } ret = workqueue_create(&wq, (struct xfs_mount *)ctx, scrub_nproc_workqueue(ctx)); if (ret) { - str_info(ctx, ctx->mntpoint, _("Could not create workqueue.")); - return false; + str_liberror(ctx, ret, _("creating directory scan workqueue")); + goto out_cond; } ret = queue_subdir(ctx, &sft, &wq, ctx->mntpoint, true); @@ -255,12 +264,18 @@ scan_fs_tree( ret = workqueue_terminate(&wq); if (ret) { - sft.moveon = false; str_liberror(ctx, ret, _("finishing directory scan work")); + goto out_wq; } + + moveon = sft.moveon; out_wq: workqueue_destroy(&wq); - return sft.moveon; +out_cond: + pthread_cond_destroy(&sft.wakeup); +out_mutex: + pthread_mutex_destroy(&sft.lock); + return moveon; } #ifndef FITRIM