dovecot-2.2: doveadm fs delete: Another attempt at fixing recurs...
dovecot at dovecot.org
dovecot at dovecot.org
Tue May 5 10:37:42 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/a46620d6e0ff
changeset: 18520:a46620d6e0ff
user: Timo Sirainen <tss at iki.fi>
date: Tue May 05 13:35:52 2015 +0300
description:
doveadm fs delete: Another attempt at fixing recursive deletion.
I'm not entirely sure anymore what the original infinite looping was, but
this fixes all the potential problems that I see.
diffstat:
src/doveadm/doveadm-fs.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diffs (60 lines):
diff -r 9b2b3c609367 -r a46620d6e0ff src/doveadm/doveadm-fs.c
--- a/src/doveadm/doveadm-fs.c Tue May 05 13:30:38 2015 +0300
+++ b/src/doveadm/doveadm-fs.c Tue May 05 13:35:52 2015 +0300
@@ -225,20 +225,22 @@
static bool cmd_fs_delete_ctx_run(struct fs_delete_ctx *ctx)
{
unsigned int i;
- bool ret = FALSE;
+ int ret = 0;
for (i = 0; i < ctx->files_count; i++) {
if (ctx->files[i] == NULL)
;
else if (fs_delete(ctx->files[i]) == 0)
fs_file_deinit(&ctx->files[i]);
- else if (errno == EAGAIN)
- ret = TRUE;
- else {
+ else if (errno == EAGAIN) {
+ if (ret == 0)
+ ret = 1;
+ } else {
i_error("fs_delete(%s) failed: %s",
fs_file_path(ctx->files[i]),
fs_file_last_error(ctx->files[i]));
doveadm_exit_code = EX_TEMPFAIL;
+ ret = -1;
}
}
return ret;
@@ -253,6 +255,7 @@
struct fs_delete_ctx ctx;
const char *fname, *const *fnamep;
unsigned int i;
+ int ret;
memset(&ctx, 0, sizeof(ctx));
ctx.files_count = I_MAX(async_count, 1);
@@ -311,9 +314,10 @@
fname = NULL;
break;
}
- cmd_fs_delete_ctx_run(&ctx);
+ if ((ret = cmd_fs_delete_ctx_run(&ctx)) < 0)
+ break;
if (fname != NULL) {
- if (fs_wait_async(fs) < 0) {
+ if (ret > 0 && fs_wait_async(fs) < 0) {
i_error("fs_wait_async() failed: %s", fs_last_error(fs));
doveadm_exit_code = EX_TEMPFAIL;
break;
@@ -321,7 +325,7 @@
goto retry;
}
} T_END;
- while (doveadm_exit_code == 0 && cmd_fs_delete_ctx_run(&ctx)) {
+ while (doveadm_exit_code == 0 && cmd_fs_delete_ctx_run(&ctx) != 0) {
if (fs_wait_async(fs) < 0) {
i_error("fs_wait_async() failed: %s", fs_last_error(fs));
doveadm_exit_code = EX_TEMPFAIL;
More information about the dovecot-cvs
mailing list