The individual requests can timeout, but not the waiting itself.
if ((ret = cmd_fs_delete_ctx_run(ctx)) < 0)
return -1;
if (fname != NULL) {
- if (ret > 0 && fs_wait_async(ctx->fs) < 0) {
- i_error("fs_wait_async() failed: %s", fs_last_error(ctx->fs));
- doveadm_exit_code = EX_TEMPFAIL;
- return -1;;
- }
+ if (ret > 0)
+ fs_wait_async(ctx->fs);
return doveadm_fs_delete_async_fname(ctx, fname);
}
return 0;
unsigned int i;
while (doveadm_exit_code == 0 && cmd_fs_delete_ctx_run(ctx) > 0) {
- if (fs_wait_async(ctx->fs) < 0) {
- i_error("fs_wait_async() failed: %s", fs_last_error(ctx->fs));
- doveadm_exit_code = EX_TEMPFAIL;
- break;
- }
+ fs_wait_async(ctx->fs);
}
for (i = 0; i < ctx->files_count; i++) {
if (ctx->files[i] != NULL)
void (*set_async_callback)(struct fs_file *file,
fs_file_async_callback_t *callback,
void *context);
- int (*wait_async)(struct fs *fs);
+ void (*wait_async)(struct fs *fs);
void (*set_metadata)(struct fs_file *file, const char *key,
const char *value);
/* read the whole input stream before returning */
while ((ret = i_stream_read_more(input, &data, &size)) >= 0) {
i_stream_skip(input, size);
- if (ret == 0) {
- if (fs_wait_async(file->fs) < 0) {
- input->stream_errno = errno;
- input->eof = TRUE;
- break;
- }
- }
+ if (ret == 0)
+ fs_wait_async(file->fs);
}
i_stream_seek(input, 0);
}
callback(context);
}
-int fs_wait_async(struct fs *fs)
+void fs_wait_async(struct fs *fs)
{
- int ret;
-
/* recursion not allowed */
i_assert(fs->prev_ioloop == NULL);
- if (fs->v.wait_async == NULL)
- ret = 0;
- else T_BEGIN {
+ if (fs->v.wait_async != NULL) T_BEGIN {
fs->prev_ioloop = current_ioloop;
- ret = fs->v.wait_async(fs);
+ fs->v.wait_async(fs);
i_assert(current_ioloop == fs->prev_ioloop);
fs->prev_ioloop = NULL;
} T_END;
- return ret;
}
int fs_lock(struct fs_file *file, unsigned int secs, struct fs_lock **lock_r)
fs_file_async_callback_t *callback,
void *context);
/* Wait until some file can be read/written to more before returning.
- It's an error to call this when there are no pending async operations.
- Returns 0 if ok, -1 if timed out. */
-int fs_wait_async(struct fs *fs);
+ It's an error to call this when there are no pending async operations. */
+void fs_wait_async(struct fs *fs);
/* Returns 1 if file exists, 0 if not, -1 if error occurred. */
int fs_exists(struct fs_file *file);
fs_file_set_async_callback(file->super, callback, context);
}
-static int fs_metawrap_wait_async(struct fs *_fs)
+static void fs_metawrap_wait_async(struct fs *_fs)
{
- return fs_wait_async(_fs->parent);
+ fs_wait_async(_fs->parent);
}
static void
break;
i_assert(!file->input->blocking);
- if (fs_wait_async(_file->fs) < 0)
- return -1;
+ fs_wait_async(_file->fs);
}
if (ret == -1 && file->input->stream_errno != 0) {
fs_set_error(_file->fs, "read(%s) failed: %s",
return TRUE;
}
-static int fs_randomfail_wait_async(struct fs *_fs)
+static void fs_randomfail_wait_async(struct fs *_fs)
{
- if (fs_random_fail(_fs, 1, FS_OP_WAIT))
- return -1;
- return fs_wait_async(_fs->parent);
+ fs_wait_async(_fs->parent);
}
static void
fs_file_set_async_callback(file->super, callback, context);
}
-static int fs_sis_queue_wait_async(struct fs *_fs)
+static void fs_sis_queue_wait_async(struct fs *_fs)
{
struct sis_queue_fs *fs = (struct sis_queue_fs *)_fs;
- return fs_wait_async(fs->super);
+ fs_wait_async(fs->super);
}
static void
fs_file_set_async_callback(file->super, callback, context);
}
-static int fs_sis_wait_async(struct fs *_fs)
+static void fs_sis_wait_async(struct fs *_fs)
{
struct sis_fs *fs = (struct sis_fs *)_fs;
- return fs_wait_async(fs->super);
+ fs_wait_async(fs->super);
}
static void
file->async_context = context;
}
-static int fs_test_wait_async(struct fs *_fs ATTR_UNUSED)
+static void fs_test_wait_async(struct fs *_fs ATTR_UNUSED)
{
- return 0;
}
static void
fs_file_set_async_callback(file->super, callback, context);
}
-static int fs_compress_wait_async(struct fs *_fs)
+static void fs_compress_wait_async(struct fs *_fs)
{
- return fs_wait_async(_fs->parent);
+ fs_wait_async(_fs->parent);
}
static void