#include "tapdisk-disktype.h"
#include "tapdisk-stats.h"
+static void
+tapdisk_driver_log_flush(td_driver_t *driver, const char *__caller)
+{
+ td_loglimit_t *rl = &driver->loglimit;
+
+ if (rl->dropped) {
+ tlog_syslog(LOG_WARNING,
+ "%s: %s: %d messages suppressed",
+ driver->name, __caller, rl->dropped);
+ rl->dropped = 0;
+ }
+}
+
+int
+tapdisk_driver_log_pass(td_driver_t *driver, const char *__caller)
+{
+ td_loglimit_t *rl = &driver->loglimit;
+ int dropping = rl->dropped;
+
+ if (tapdisk_loglimit_pass(rl)) {
+ tapdisk_driver_log_flush(driver, __caller);
+ return 1;
+ }
+
+ if (!dropping)
+ tlog_syslog(LOG_WARNING,
+ "%s: %s: too many errors, dropped.",
+ driver->name, __caller);
+
+ return 0;
+}
+
td_driver_t *
tapdisk_driver_allocate(int type, const char *name, td_flag_t flags)
{
if (td_flag_test(flags, TD_OPEN_RDONLY))
td_flag_set(driver->state, TD_DRIVER_RDONLY);
+ tapdisk_loglimit_init(&driver->loglimit,
+ 16 /* msgs */,
+ 90 * 1000 /* ms */);
+
return driver;
fail:
EPRINTF("freeing open driver %s (state 0x%08x)\n",
driver->name, driver->state);
+ tapdisk_driver_log_flush(driver, __func__);
+
free(driver->name);
free(driver->data);
free(driver);
#include "tapdisk.h"
#include "scheduler.h"
#include "tapdisk-queue.h"
+#include "tapdisk-loglimit.h"
#define TD_DRIVER_OPEN 0x0001
#define TD_DRIVER_RDONLY 0x0002
void *data;
const struct tap_disk *ops;
+ td_loglimit_t loglimit;
struct list_head next;
};
void tapdisk_driver_stats(td_driver_t *, td_stats_t *);
+int tapdisk_driver_log_pass(td_driver_t *, const char *caller);
+
#endif
__tlog_error("ERROR: errno %d at %s: " _f, \
_err, __func__, ##_a)
+#define tlog_drv_error(_drv, _err, _f, _a ...) do { \
+ if (tapdisk_driver_log_pass(_drv, __func__)) \
+ tlog_error(_err, _f, ##_a); \
+} while (0)
+
#endif