From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Change queue_subdir to return a positive error code to callers and move the error reporting to the callers. This continues the process of changing internal functions to return error codes. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- scrub/vfs.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/scrub/vfs.c b/scrub/vfs.c index 8aa58d6e..7053dbd6 100644 --- a/scrub/vfs.c +++ b/scrub/vfs.c @@ -72,7 +72,7 @@ dec_nr_dirs( } /* Queue a directory for scanning. */ -static bool +static int queue_subdir( struct scrub_ctx *ctx, struct scan_fs_tree *sft, @@ -81,33 +81,34 @@ queue_subdir( bool is_rootdir) { struct scan_fs_tree_dir *new_sftd; - int error; + int ret; new_sftd = malloc(sizeof(struct scan_fs_tree_dir)); - if (!new_sftd) { - str_errno(ctx, _("creating directory scan context")); - return false; - } + if (!new_sftd) + return errno; new_sftd->path = strdup(path); if (!new_sftd->path) { - str_errno(ctx, _("creating directory scan path")); - free(new_sftd); - return false; + ret = errno; + goto out_dir; } new_sftd->sft = sft; new_sftd->rootdir = is_rootdir; inc_nr_dirs(sft); - error = workqueue_add(wq, scan_fs_dir, 0, new_sftd); - if (error) { + ret = workqueue_add(wq, scan_fs_dir, 0, new_sftd); + if (ret) { dec_nr_dirs(sft); - str_liberror(ctx, error, _("queueing directory scan work")); - return false; + goto out_path; } - return true; + return 0; +out_path: + free(new_sftd->path); +out_dir: + free(new_sftd); + return ret; } /* Scan a directory sub tree. */ @@ -183,10 +184,13 @@ scan_fs_dir( /* If directory, call ourselves recursively. */ if (S_ISDIR(sb.st_mode) && strcmp(".", dirent->d_name) && strcmp("..", dirent->d_name)) { - sft->moveon = queue_subdir(ctx, sft, wq, newpath, - false); - if (!sft->moveon) + error = queue_subdir(ctx, sft, wq, newpath, false); + if (error) { + str_liberror(ctx, error, +_("queueing subdirectory scan")); + sft->moveon = false; break; + } } } @@ -229,9 +233,11 @@ scan_fs_tree( return false; } - sft.moveon = queue_subdir(ctx, &sft, &wq, ctx->mntpoint, true); - if (!sft.moveon) + ret = queue_subdir(ctx, &sft, &wq, ctx->mntpoint, true); + if (ret) { + str_liberror(ctx, ret, _("queueing directory scan")); goto out_wq; + } pthread_mutex_lock(&sft.lock); if (sft.nr_dirs)