enum fs_iter_flags flags);
const char *(*iter_next)(struct fs_iter *iter);
int (*iter_deinit)(struct fs_iter *iter);
+
+ bool (*switch_ioloop)(struct fs *fs);
};
struct fs {
return ret;
}
+bool fs_switch_ioloop(struct fs *fs)
+{
+ bool ret = FALSE;
+
+ if (fs->v.switch_ioloop != NULL) {
+ T_BEGIN {
+ ret = fs->v.switch_ioloop(fs);
+ } T_END;
+ } else if (fs->parent != NULL) {
+ ret = fs_switch_ioloop(fs->parent);
+ }
+ return ret;
+}
+
int fs_lock(struct fs_file *file, unsigned int secs, struct fs_lock **lock_r)
{
int ret;
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);
+/* Switch the fs to the current ioloop. This can be used to do fs_wait_async()
+ among other IO work. Returns TRUE if there is actually some work that can
+ be waited on. */
+bool fs_switch_ioloop(struct fs *fs) ATTR_NOWARN_UNUSED_RESULT;
/* Returns 1 if file exists, 0 if not, -1 if error occurred. */
int fs_exists(struct fs_file *file);
fs_dict_delete,
fs_dict_iter_init,
fs_dict_iter_next,
- fs_dict_iter_deinit
+ fs_dict_iter_deinit,
+ NULL
}
};
fs_metawrap_delete,
fs_metawrap_iter_init,
fs_metawrap_iter_next,
- fs_metawrap_iter_deinit
+ fs_metawrap_iter_deinit,
+ NULL
}
};
fs_posix_delete,
fs_posix_iter_init,
fs_posix_iter_next,
- fs_posix_iter_deinit
+ fs_posix_iter_deinit,
+ NULL
}
};
fs_randomfail_delete,
fs_randomfail_iter_init,
fs_randomfail_iter_next,
- fs_randomfail_iter_deinit
+ fs_randomfail_iter_deinit,
+ NULL
}
};
fs_sis_queue_delete,
fs_sis_queue_iter_init,
NULL,
+ NULL,
NULL
}
};
fs_sis_delete,
fs_sis_iter_init,
NULL,
+ NULL,
NULL
}
};
fs_test_delete,
fs_test_iter_init,
fs_test_iter_next,
- fs_test_iter_deinit
+ fs_test_iter_deinit,
+ NULL
}
};
fs_compress_delete,
fs_compress_iter_init,
fs_compress_iter_next,
- fs_compress_iter_deinit
+ fs_compress_iter_deinit,
+ NULL
}
};