#define ZFS_PROBE2(a, c, e) ((void) 0)
#define ZFS_PROBE3(a, c, e, g) ((void) 0)
#define ZFS_PROBE4(a, c, e, g, i) ((void) 0)
-#define ZFS_SET_ERROR(err) ((void) 0)
-#else
-
-#if defined(HAVE_DECLARE_EVENT_CLASS)
-
-#include <sys/trace.h>
+#endif /* _KERNEL */
/*
* The set-error SDT probe is extra static, in that we declare its fake
* twice, so it should not have side effects (e.g. something like:
* "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
*/
-#define SET_ERROR(err) \
- (trace_zfs_set__error(__FILE__, __func__, __LINE__, err), err)
-
-#else
-
+extern void __set_error(const char *file, const char *func, int line, int err);
#undef SET_ERROR
-#define SET_ERROR(err) (err)
-
-#endif /* HAVE_DECLARE_EVENT_CLASS */
-
-#endif /* _KERNEL */
+#define SET_ERROR(err) \
+ (__set_error(__FILE__, __func__, __LINE__, err), err)
#endif /* _SYS_SDT_H */
*/
/*
- * Generic support for four argument tracepoints of the form:
+ * Generic support for one argument tracepoints of the form:
*
- * DTRACE_PROBE4(...,
- * const char *, ...,
- * const char *, ...,
- * int, ...,
+ * DTRACE_PROBE1(...,
* const char *, ...);
*/
/* BEGIN CSTYLED */
DECLARE_EVENT_CLASS(zfs_dprintf_class,
- TP_PROTO(const char *file, const char *function, int line,
- const char *msg),
- TP_ARGS(file, function, line, msg),
+ TP_PROTO(const char *msg),
+ TP_ARGS(msg),
TP_STRUCT__entry(
- __string(file, file)
- __string(function, function)
- __field(int, line)
__string(msg, msg)
),
TP_fast_assign(
- __assign_str(file, strchr(file, '/') ?
- strrchr(file, '/') + 1 : file)
- __assign_str(function, function);
- __entry->line = line;
__assign_str(msg, msg);
),
- TP_printk("%s:%d:%s(): %s", __get_str(file), __entry->line,
- __get_str(function), __get_str(msg))
+ TP_printk("%s", __get_str(msg))
);
/* END CSTYLED */
/* BEGIN CSTYLED */
#define DEFINE_DPRINTF_EVENT(name) \
DEFINE_EVENT(zfs_dprintf_class, name, \
- TP_PROTO(const char *file, const char *function, int line, \
- const char *msg), \
- TP_ARGS(file, function, line, msg))
+ TP_PROTO(const char *msg), \
+ TP_ARGS(msg))
/* END CSTYLED */
DEFINE_DPRINTF_EVENT(zfs_zfs__dprintf);
-
-/*
- * Generic support for four argument tracepoints of the form:
- *
- * DTRACE_PROBE4(...,
- * const char *, ...,
- * const char *, ...,
- * int, ...,
- * uintptr_t, ...);
- */
-/* BEGIN CSTYLED */
-DECLARE_EVENT_CLASS(zfs_set_error_class,
- TP_PROTO(const char *file, const char *function, int line,
- uintptr_t error),
- TP_ARGS(file, function, line, error),
- TP_STRUCT__entry(
- __string(file, file)
- __string(function, function)
- __field(int, line)
- __field(uintptr_t, error)
- ),
- TP_fast_assign(
- __assign_str(file, strchr(file, '/') ?
- strrchr(file, '/') + 1 : file)
- __assign_str(function, function);
- __entry->line = line;
- __entry->error = error;
- ),
- TP_printk("%s:%d:%s(): error 0x%lx", __get_str(file), __entry->line,
- __get_str(function), __entry->error)
-);
-/* END CSTYLED */
-
-/* BEGIN CSTYLED */
-#ifdef TP_CONDITION
-#define DEFINE_SET_ERROR_EVENT(name) \
-DEFINE_EVENT_CONDITION(zfs_set_error_class, name, \
- TP_PROTO(const char *file, const char *function, int line, \
- uintptr_t error), \
- TP_ARGS(file, function, line, error), \
- TP_CONDITION(error))
-#else
-#define DEFINE_SET_ERROR_EVENT(name) \
-DEFINE_EVENT(zfs_set_error_class, name, \
- TP_PROTO(const char *file, const char *function, int line, \
- uintptr_t error), \
- TP_ARGS(file, function, line, error))
-#endif
-/* END CSTYLED */
-DEFINE_SET_ERROR_EVENT(zfs_set__error);
ZFS_PROBE4(#a, (unsigned long)c, (unsigned long)e, (unsigned long)g, \
(unsigned long)i)
-/*
- * We use the comma operator so that this macro can be used without much
- * additional code. For example, "return (EINVAL);" becomes
- * "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated
- * twice, so it should not have side effects (e.g. something like:
- * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
- */
-#define SET_ERROR(err) (ZFS_SET_ERROR(err), err)
-
/*
* Threads. TS_STACK_MIN is dictated by the minimum allowed pthread stack
* size. While TS_STACK_MAX is somewhat arbitrary, it was selected to be
#define ZFS_DEBUG_ZIO_FREE (1 << 6)
#define ZFS_DEBUG_HISTOGRAM_VERIFY (1 << 7)
#define ZFS_DEBUG_METASLAB_VERIFY (1 << 8)
+#define ZFS_DEBUG_SET_ERROR (1 << 9)
extern void __dprintf(const char *file, const char *func,
int line, const char *fmt, ...);
_
128 ZFS_DEBUG_HISTOGRAM_VERIFY
Enable extra spacemap histogram verifications.
+_
+256 ZFS_DEBUG_METASLAB_VERIFY
+ Verify space accounting on disk matches in-core range_trees.
+_
+512 ZFS_DEBUG_SET_ERROR
+ Enable SET_ERROR and dprintf entries in the debug log.
.TE
.sp
* Requires debug build.
mutex_exit(&zfs_dbgmsgs_lock);
}
+void
+__set_error(const char *file, const char *func, int line, int err)
+{
+ if (zfs_flags & ZFS_DEBUG_SET_ERROR)
+ __dprintf(file, func, line, "error %lu", err);
+}
+
#ifdef _KERNEL
void
__dprintf(const char *file, const char *func, int line, const char *fmt, ...)
size_t size;
char *buf;
char *nl;
+ int i;
- if (!zfs_dbgmsg_enable && !(zfs_flags & ZFS_DEBUG_DPRINTF))
+ if (!zfs_dbgmsg_enable &&
+ !(zfs_flags & (ZFS_DEBUG_DPRINTF | ZFS_DEBUG_SET_ERROR)))
return;
size = 1024;
newfile = file;
}
- va_start(adx, fmt);
- (void) vsnprintf(buf, size, fmt, adx);
- va_end(adx);
+ i = snprintf(buf, size, "%s:%d:%s(): ", newfile, line, func);
+
+ if (i < size) {
+ va_start(adx, fmt);
+ (void) vsnprintf(buf + i, size - i, fmt, adx);
+ va_end(adx);
+ }
/*
* Get rid of trailing newline.
* # Dump the ring buffer.
* $ cat /sys/kernel/debug/tracing/trace
*/
- if (zfs_flags & ZFS_DEBUG_DPRINTF)
- DTRACE_PROBE4(zfs__dprintf,
- char *, newfile, char *, func, int, line, char *, buf);
+ if (zfs_flags & (ZFS_DEBUG_DPRINTF | ZFS_DEBUG_SET_ERROR))
+ DTRACE_PROBE1(zfs__dprintf, char *, buf);
/*
* To get this data enable the zfs debug log as shown: