Page MenuHomeFreeBSD

D21165.id60486.diff
No OneTemporary

D21165.id60486.diff

Index: sys/geom/geom.h
===================================================================
--- sys/geom/geom.h
+++ sys/geom/geom.h
@@ -346,6 +346,7 @@
int g_write_data(struct g_consumer *cp, off_t offset, void *ptr, off_t length);
int g_delete_data(struct g_consumer *cp, off_t offset, off_t length);
void g_print_bio(struct bio *bp);
+void g_format_bio(struct sbuf *, struct bio *bp);
int g_use_g_read_data(void *, off_t, void **, int);
int g_use_g_write_data(void *, off_t, void *, int);
Index: sys/geom/geom_int.h
===================================================================
--- sys/geom/geom_int.h
+++ sys/geom/geom_int.h
@@ -37,9 +37,22 @@
* $FreeBSD$
*/
+#pragma once
+
LIST_HEAD(class_list_head, g_class);
TAILQ_HEAD(g_tailq_head, g_geom);
+#define _GEOM_DEBUG(gcls, ctrlvar, loglvl, biop, formatstr, ...) do { \
+ const int __control = (ctrlvar); \
+ const int __level = (loglvl); \
+ \
+ if (__control < __level) \
+ break; \
+ \
+ g_dbg_printf((gcls), (__control > 0) ? __level : -1, (biop), \
+ ": " formatstr, ## __VA_ARGS__); \
+} while (0)
+
extern int g_collectstats;
#define G_STATS_PROVIDERS 1 /* Collect I/O stats for providers */
#define G_STATS_CONSUMERS 2 /* Collect I/O stats for consumers */
@@ -60,7 +73,7 @@
void g_confxml(void *, int flag);
void g_conf_specific(struct sbuf *sb, struct g_class *mp, struct g_geom *gp, struct g_provider *pp, struct g_consumer *cp);
void g_conf_cat_escaped(struct sbuf *sb, const char *buf);
-void g_conf_printf_escaped(struct sbuf *sb, const char *fmt, ...);
+void g_conf_printf_escaped(struct sbuf *sb, const char *fmt, ...) __printflike(2, 3);
void g_confdot(void *, int flag);
void g_conftxt(void *, int flag);
@@ -73,6 +86,7 @@
extern struct class_list_head g_classes;
extern char *g_wait_event, *g_wait_sim, *g_wait_up, *g_wait_down;
void g_wither_washer(void);
+void g_dbg_printf(const char *gcls, int lvl, struct bio *bp, const char *format, ...) __printflike(4, 5);
/* geom_io.c */
void g_io_init(void);
Index: sys/geom/geom_io.c
===================================================================
--- sys/geom/geom_io.c
+++ sys/geom/geom_io.c
@@ -49,6 +49,7 @@
#include <sys/bio.h>
#include <sys/ktr.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/stack.h>
#include <sys/sysctl.h>
#include <sys/vmem.h>
@@ -1030,6 +1031,24 @@
void
g_print_bio(struct bio *bp)
+{
+#ifndef PRINTF_BUFR_SIZE
+#define PRINTF_BUFR_SIZE 64
+#endif
+ char bufr[PRINTF_BUFR_SIZE];
+ struct sbuf sb, *sbp __unused;
+
+ sbp = sbuf_new(&sb, bufr, sizeof(bufr), SBUF_FIXEDLEN);
+ KASSERT(sbp != NULL, ("sbuf_new misused?"));
+
+ sbuf_set_drain(&sb, sbuf_printf_drain, NULL);
+ g_format_bio(&sb, bp);
+ sbuf_finish(&sb);
+ sbuf_delete(&sb);
+}
+
+void
+g_format_bio(struct sbuf *sb, struct bio *bp)
{
const char *pname, *cmd = NULL;
@@ -1041,11 +1060,12 @@
switch (bp->bio_cmd) {
case BIO_GETATTR:
cmd = "GETATTR";
- printf("%s[%s(attr=%s)]", pname, cmd, bp->bio_attribute);
+ sbuf_printf(sb, "%s[%s(attr=%s)]", pname, cmd,
+ bp->bio_attribute);
return;
case BIO_FLUSH:
cmd = "FLUSH";
- printf("%s[%s]", pname, cmd);
+ sbuf_printf(sb, "%s[%s]", pname, cmd);
return;
case BIO_ZONE: {
char *subcmd = NULL;
@@ -1073,7 +1093,7 @@
subcmd = "UNKNOWN";
break;
}
- printf("%s[%s,%s]", pname, cmd, subcmd);
+ sbuf_printf(sb, "%s[%s,%s]", pname, cmd, subcmd);
return;
}
case BIO_READ:
@@ -1087,9 +1107,9 @@
break;
default:
cmd = "UNKNOWN";
- printf("%s[%s()]", pname, cmd);
+ sbuf_printf(sb, "%s[%s()]", pname, cmd);
return;
}
- printf("%s[%s(offset=%jd, length=%jd)]", pname, cmd,
+ sbuf_printf(sb, "%s[%s(offset=%jd, length=%jd)]", pname, cmd,
(intmax_t)bp->bio_offset, (intmax_t)bp->bio_length);
}
Index: sys/geom/geom_subr.c
===================================================================
--- sys/geom/geom_subr.c
+++ sys/geom/geom_subr.c
@@ -77,6 +77,43 @@
int post;
};
+void
+g_dbg_printf(const char *gcls, int lvl, struct bio *bp, const char *format,
+ ...)
+{
+#ifndef PRINTF_BUFR_SIZE
+#define PRINTF_BUFR_SIZE 64
+#endif
+ char bufr[PRINTF_BUFR_SIZE];
+ struct sbuf sb, *sbp __unused;
+ va_list ap;
+
+ sbp = sbuf_new(&sb, bufr, sizeof(bufr), SBUF_FIXEDLEN);
+ KASSERT(sbp != NULL, ("sbuf_new misused?"));
+
+ sbuf_set_drain(&sb, sbuf_printf_drain, NULL);
+
+ sbuf_cat(&sb, gcls);
+ if (lvl >= 0)
+ sbuf_printf(&sb, "[%d]", lvl);
+
+ va_start(ap, format);
+ sbuf_vprintf(&sb, format, ap);
+ va_end(ap);
+
+ if (bp != NULL) {
+ sbuf_putc(&sb, ' ');
+ g_format_bio(&sb, bp);
+ }
+
+ /* Terminate the debug line with a single '\n'. */
+ sbuf_nl_terminate(&sb);
+
+ /* Flush line to printf. */
+ sbuf_finish(&sb);
+ sbuf_delete(&sb);
+}
+
/*
* This event offers a new class a chance to taste all preexisting providers.
*/
Index: sys/geom/label/g_label.h
===================================================================
--- sys/geom/label/g_label.h
+++ sys/geom/label/g_label.h
@@ -34,6 +34,7 @@
#include <sys/endian.h>
#ifdef _KERNEL
#include <sys/sysctl.h>
+#include <geom/geom_int.h>
#endif
#define G_LABEL_CLASS_NAME "LABEL"
@@ -50,16 +51,8 @@
#ifdef _KERNEL
extern u_int g_label_debug;
-#define G_LABEL_DEBUG(lvl, ...) do { \
- if (g_label_debug >= (lvl)) { \
- printf("GEOM_LABEL"); \
- if (g_label_debug > 0) \
- printf("[%u]", lvl); \
- printf(": "); \
- printf(__VA_ARGS__); \
- printf("\n"); \
- } \
-} while (0)
+#define G_LABEL_DEBUG(lvl, ...) \
+ _GEOM_DEBUG("GEOM_LABEL", g_label_debug, (lvl), NULL, __VA_ARGS__)
SYSCTL_DECL(_kern_geom_label);
Index: sys/geom/mirror/g_mirror.h
===================================================================
--- sys/geom/mirror/g_mirror.h
+++ sys/geom/mirror/g_mirror.h
@@ -34,6 +34,10 @@
#include <sys/endian.h>
#include <sys/md5.h>
+#ifdef _KERNEL
+#include <geom/geom_int.h>
+#endif
+
#define G_MIRROR_CLASS_NAME "MIRROR"
#define G_MIRROR_MAGIC "GEOM::MIRROR"
@@ -86,28 +90,10 @@
extern int g_mirror_debug;
-#define G_MIRROR_DEBUG(lvl, ...) do { \
- if (g_mirror_debug >= (lvl)) { \
- printf("GEOM_MIRROR"); \
- if (g_mirror_debug > 0) \
- printf("[%u]", lvl); \
- printf(": "); \
- printf(__VA_ARGS__); \
- printf("\n"); \
- } \
-} while (0)
-#define G_MIRROR_LOGREQ(lvl, bp, ...) do { \
- if (g_mirror_debug >= (lvl)) { \
- printf("GEOM_MIRROR"); \
- if (g_mirror_debug > 0) \
- printf("[%u]", lvl); \
- printf(": "); \
- printf(__VA_ARGS__); \
- printf(" "); \
- g_print_bio(bp); \
- printf("\n"); \
- } \
-} while (0)
+#define G_MIRROR_DEBUG(lvl, ...) \
+ _GEOM_DEBUG("GEOM_MIRROR", g_mirror_debug, (lvl), NULL, __VA_ARGS__)
+#define G_MIRROR_LOGREQ(lvl, bp, ...) \
+ _GEOM_DEBUG("GEOM_MIRROR", g_mirror_debug, (lvl), (bp), __VA_ARGS__)
#define G_MIRROR_BIO_FLAG_REGULAR 0x01
#define G_MIRROR_BIO_FLAG_SYNC 0x02

File Metadata

Mime Type
text/plain
Expires
Tue, Mar 17, 4:26 AM (4 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29807602
Default Alt Text
D21165.id60486.diff (6 KB)

Event Timeline