]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_scrub: fix error handling problems in vfs.c
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 17 Oct 2019 02:35:25 +0000 (22:35 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Thu, 17 Oct 2019 02:35:25 +0000 (22:35 -0400)
Fix all the places where we drop or screw up error handling in
scan_fs_tree.

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>
scrub/vfs.c

index e0bc3ea436fc6e2595d673ad04c8d200ad3ba96c..d7c40239b677d06a222c8096a67bf14c80c5e7e9 100644 (file)
@@ -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