1*94c4a1e1SFrank Piva // SPDX-License-Identifier: MIT or LGPL-2.1-only
2*94c4a1e1SFrank Piva
3*94c4a1e1SFrank Piva #ifndef UBLKSRV_UTILS_INC_H
4*94c4a1e1SFrank Piva #define UBLKSRV_UTILS_INC_H
5*94c4a1e1SFrank Piva
6*94c4a1e1SFrank Piva #include <syslog.h>
7*94c4a1e1SFrank Piva #include <stdio.h>
8*94c4a1e1SFrank Piva #include <stdarg.h>
9*94c4a1e1SFrank Piva #include <sys/syscall.h>
10*94c4a1e1SFrank Piva
11*94c4a1e1SFrank Piva #ifdef __cplusplus
12*94c4a1e1SFrank Piva extern "C" {
13*94c4a1e1SFrank Piva #endif
14*94c4a1e1SFrank Piva
ublksrv_gettid(void)15*94c4a1e1SFrank Piva static inline int ublksrv_gettid(void)
16*94c4a1e1SFrank Piva {
17*94c4a1e1SFrank Piva return syscall(SYS_gettid);
18*94c4a1e1SFrank Piva }
19*94c4a1e1SFrank Piva
20*94c4a1e1SFrank Piva /* The following two are obsolete, use new ublk_err/ublk_dbg/ublk_log */
21*94c4a1e1SFrank Piva static inline void ublksrv_log(int priority, const char *fmt, ...)
22*94c4a1e1SFrank Piva __attribute__ ((format (printf, 2, 3)));
23*94c4a1e1SFrank Piva static inline void ublksrv_printf(FILE *stream, const char *fmt, ...)
24*94c4a1e1SFrank Piva __attribute__ ((format (printf, 2, 3)));
25*94c4a1e1SFrank Piva
26*94c4a1e1SFrank Piva #ifdef DEBUG
ublksrv_log(int priority,const char * fmt,...)27*94c4a1e1SFrank Piva static inline void ublksrv_log(int priority, const char *fmt, ...)
28*94c4a1e1SFrank Piva {
29*94c4a1e1SFrank Piva va_list ap;
30*94c4a1e1SFrank Piva
31*94c4a1e1SFrank Piva va_start(ap, fmt);
32*94c4a1e1SFrank Piva vsyslog(priority, fmt, ap);
33*94c4a1e1SFrank Piva }
34*94c4a1e1SFrank Piva
ublksrv_printf(FILE * stream,const char * fmt,...)35*94c4a1e1SFrank Piva static inline void ublksrv_printf(FILE *stream, const char *fmt, ...)
36*94c4a1e1SFrank Piva {
37*94c4a1e1SFrank Piva va_list ap;
38*94c4a1e1SFrank Piva
39*94c4a1e1SFrank Piva va_start(ap, fmt);
40*94c4a1e1SFrank Piva vfprintf(stream, fmt, ap);
41*94c4a1e1SFrank Piva }
42*94c4a1e1SFrank Piva #else
ublksrv_log(int priority,const char * fmt,...)43*94c4a1e1SFrank Piva static inline void ublksrv_log(int priority, const char *fmt, ...) { }
ublksrv_printf(FILE * stream,const char * fmt,...)44*94c4a1e1SFrank Piva static inline void ublksrv_printf(FILE *stream, const char *fmt, ...) {}
45*94c4a1e1SFrank Piva #endif
46*94c4a1e1SFrank Piva
47*94c4a1e1SFrank Piva /* 32bit debug mask, high 16 bits are for target code, and low 16 bits for lib */
48*94c4a1e1SFrank Piva #define UBLK_DBG_DEV (1U << 0)
49*94c4a1e1SFrank Piva #define UBLK_DBG_QUEUE (1U << 1)
50*94c4a1e1SFrank Piva #define UBLK_DBG_IO_CMD (1U << 2)
51*94c4a1e1SFrank Piva #define UBLK_DBG_IO (1U << 3)
52*94c4a1e1SFrank Piva #define UBLK_DBG_CTRL_CMD (1U << 4)
53*94c4a1e1SFrank Piva
54*94c4a1e1SFrank Piva #ifdef DEBUG
55*94c4a1e1SFrank Piva extern void ublk_dbg(int level, const char *fmt, ...)
56*94c4a1e1SFrank Piva __attribute__ ((format (printf, 2, 3)));
57*94c4a1e1SFrank Piva extern void ublk_ctrl_dbg(int level, const char *fmt, ...)
58*94c4a1e1SFrank Piva __attribute__ ((format (printf, 2, 3)));
59*94c4a1e1SFrank Piva extern void ublk_set_debug_mask(unsigned mask);
60*94c4a1e1SFrank Piva extern unsigned ublk_get_debug_mask(unsigned mask);
61*94c4a1e1SFrank Piva #else
ublk_dbg(int level,const char * fmt,...)62*94c4a1e1SFrank Piva static inline void ublk_dbg(int level, const char *fmt, ...) { }
ublk_ctrl_dbg(int level,const char * fmt,...)63*94c4a1e1SFrank Piva static inline void ublk_ctrl_dbg(int level, const char *fmt, ...) { }
ublk_set_debug_mask(unsigned mask)64*94c4a1e1SFrank Piva static inline void ublk_set_debug_mask(unsigned mask) {}
ublk_get_debug_mask(unsigned mask)65*94c4a1e1SFrank Piva static inline unsigned ublk_get_debug_mask(unsigned mask) { return 0;}
66*94c4a1e1SFrank Piva #endif
67*94c4a1e1SFrank Piva
68*94c4a1e1SFrank Piva extern void ublk_log(const char *fmt, ...)
69*94c4a1e1SFrank Piva __attribute__ ((format (printf, 1, 2)));
70*94c4a1e1SFrank Piva extern void ublk_err(const char *fmt, ...)
71*94c4a1e1SFrank Piva __attribute__ ((format (printf, 1, 2)));
72*94c4a1e1SFrank Piva
73*94c4a1e1SFrank Piva #define round_up(val, rnd) \
74*94c4a1e1SFrank Piva (((val) + ((rnd) - 1)) & ~((rnd) - 1))
75*94c4a1e1SFrank Piva
76*94c4a1e1SFrank Piva #ifndef offsetof
77*94c4a1e1SFrank Piva #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
78*94c4a1e1SFrank Piva #endif
79*94c4a1e1SFrank Piva
80*94c4a1e1SFrank Piva #ifndef container_of
81*94c4a1e1SFrank Piva #define container_of(ptr, type, member) ({ \
82*94c4a1e1SFrank Piva unsigned long __mptr = (unsigned long)(ptr); \
83*94c4a1e1SFrank Piva ((type *)(__mptr - offsetof(type, member))); })
84*94c4a1e1SFrank Piva #endif
85*94c4a1e1SFrank Piva
86*94c4a1e1SFrank Piva #define ublk_ignore_result(x) ({ typeof(x) z = x; (void)sizeof z; })
87*94c4a1e1SFrank Piva
88*94c4a1e1SFrank Piva #ifdef __cplusplus
89*94c4a1e1SFrank Piva }
90*94c4a1e1SFrank Piva #endif
91*94c4a1e1SFrank Piva
92*94c4a1e1SFrank Piva #endif
93