1 #ifndef __CEPH_DECODE_H
2 #define __CEPH_DECODE_H
4 #include <asm/unaligned.h>
8 * void **p pointer to position pointer
9 * void *end pointer to end of buffer (last byte + 1)
15 #define ceph_decode_need(p, end, n, bad) \
17 if (unlikely(*(p) + (n) > (end))) \
21 #define ceph_decode_64(p, v) \
23 v = get_unaligned_le64(*(p)); \
24 *(p) += sizeof(u64); \
26 #define ceph_decode_32(p, v) \
28 v = get_unaligned_le32(*(p)); \
29 *(p) += sizeof(u32); \
31 #define ceph_decode_16(p, v) \
33 v = get_unaligned_le16(*(p)); \
34 *(p) += sizeof(u16); \
36 #define ceph_decode_8(p, v) \
42 #define ceph_decode_copy(p, pv, n) \
44 memcpy(pv, *(p), n); \
48 /* bounds check too */
49 #define ceph_decode_64_safe(p, end, v, bad) \
51 ceph_decode_need(p, end, sizeof(u64), bad); \
52 ceph_decode_64(p, v); \
54 #define ceph_decode_32_safe(p, end, v, bad) \
56 ceph_decode_need(p, end, sizeof(u32), bad); \
57 ceph_decode_32(p, v); \
59 #define ceph_decode_16_safe(p, end, v, bad) \
61 ceph_decode_need(p, end, sizeof(u16), bad); \
62 ceph_decode_16(p, v); \
65 #define ceph_decode_copy_safe(p, end, pv, n, bad) \
67 ceph_decode_need(p, end, n, bad); \
68 ceph_decode_copy(p, pv, n); \
72 * struct ceph_timespec <-> struct timespec
74 #define ceph_decode_timespec(ts, tv) \
76 (ts)->tv_sec = le32_to_cpu((tv)->tv_sec); \
77 (ts)->tv_nsec = le32_to_cpu((tv)->tv_nsec); \
79 #define ceph_encode_timespec(tv, ts) \
81 (tv)->tv_sec = cpu_to_le32((ts)->tv_sec); \
82 (tv)->tv_nsec = cpu_to_le32((ts)->tv_nsec); \
89 #define ceph_encode_64(p, v) \
91 put_unaligned_le64(v, (__le64 *)*(p)); \
92 *(p) += sizeof(u64); \
94 #define ceph_encode_32(p, v) \
96 put_unaligned_le32(v, (__le32 *)*(p)); \
97 *(p) += sizeof(u32); \
99 #define ceph_encode_16(p, v) \
101 put_unaligned_le16(v), (__le16 *)*(p)); \
102 *(p) += sizeof(u16); \
104 #define ceph_encode_8(p, v) \
111 * filepath, string encoders
113 static inline void ceph_encode_filepath(void **p, void *end,
114 u64 ino, const char *path)
116 u32 len = path ? strlen(path) : 0;
117 BUG_ON(*p + sizeof(ino) + sizeof(len) + len > end);
118 ceph_encode_64(p, ino);
119 ceph_encode_32(p, len);
121 memcpy(*p, path, len);
125 static inline void ceph_encode_string(void **p, void *end,
126 const char *s, u32 len)
128 BUG_ON(*p + sizeof(len) + len > end);
129 ceph_encode_32(p, len);