diff options
| author | Ilya Dryomov <idryomov@gmail.com> | 2017-06-21 11:27:17 -0400 |
|---|---|---|
| committer | Ilya Dryomov <idryomov@gmail.com> | 2017-07-07 11:25:18 -0400 |
| commit | 278b1d709c6acc6f7d138fed775c76695b068e43 (patch) | |
| tree | b09bfb75761ff13c956e310834c34e25e34576ba /include/linux/ceph | |
| parent | ab75144be08cfc1d80f49e9c37970fcadb1215a2 (diff) | |
libceph: ceph_decode_skip_* helpers
Some of these won't be as efficient as they could be (e.g.
ceph_decode_skip_set(... 32 ...) could advance by len * sizeof(u32)
once instead of advancing by sizeof(u32) len times), but that's fine
and not worth a bunch of extra macro code.
Replace skip_name_map() with ceph_decode_skip_map as an example.
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'include/linux/ceph')
| -rw-r--r-- | include/linux/ceph/decode.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/include/linux/ceph/decode.h b/include/linux/ceph/decode.h index f990f2cc907a..14af9b70d301 100644 --- a/include/linux/ceph/decode.h +++ b/include/linux/ceph/decode.h | |||
| @@ -133,6 +133,66 @@ bad: | |||
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | /* | 135 | /* |
| 136 | * skip helpers | ||
| 137 | */ | ||
| 138 | #define ceph_decode_skip_n(p, end, n, bad) \ | ||
| 139 | do { \ | ||
| 140 | ceph_decode_need(p, end, n, bad); \ | ||
| 141 | *p += n; \ | ||
| 142 | } while (0) | ||
| 143 | |||
| 144 | #define ceph_decode_skip_64(p, end, bad) \ | ||
| 145 | ceph_decode_skip_n(p, end, sizeof(u64), bad) | ||
| 146 | |||
| 147 | #define ceph_decode_skip_32(p, end, bad) \ | ||
| 148 | ceph_decode_skip_n(p, end, sizeof(u32), bad) | ||
| 149 | |||
| 150 | #define ceph_decode_skip_16(p, end, bad) \ | ||
| 151 | ceph_decode_skip_n(p, end, sizeof(u16), bad) | ||
| 152 | |||
| 153 | #define ceph_decode_skip_8(p, end, bad) \ | ||
| 154 | ceph_decode_skip_n(p, end, sizeof(u8), bad) | ||
| 155 | |||
| 156 | #define ceph_decode_skip_string(p, end, bad) \ | ||
| 157 | do { \ | ||
| 158 | u32 len; \ | ||
| 159 | \ | ||
| 160 | ceph_decode_32_safe(p, end, len, bad); \ | ||
| 161 | ceph_decode_skip_n(p, end, len, bad); \ | ||
| 162 | } while (0) | ||
| 163 | |||
| 164 | #define ceph_decode_skip_set(p, end, type, bad) \ | ||
| 165 | do { \ | ||
| 166 | u32 len; \ | ||
| 167 | \ | ||
| 168 | ceph_decode_32_safe(p, end, len, bad); \ | ||
| 169 | while (len--) \ | ||
| 170 | ceph_decode_skip_##type(p, end, bad); \ | ||
| 171 | } while (0) | ||
| 172 | |||
| 173 | #define ceph_decode_skip_map(p, end, ktype, vtype, bad) \ | ||
| 174 | do { \ | ||
| 175 | u32 len; \ | ||
| 176 | \ | ||
| 177 | ceph_decode_32_safe(p, end, len, bad); \ | ||
| 178 | while (len--) { \ | ||
| 179 | ceph_decode_skip_##ktype(p, end, bad); \ | ||
| 180 | ceph_decode_skip_##vtype(p, end, bad); \ | ||
| 181 | } \ | ||
| 182 | } while (0) | ||
| 183 | |||
| 184 | #define ceph_decode_skip_map_of_map(p, end, ktype1, ktype2, vtype2, bad) \ | ||
| 185 | do { \ | ||
| 186 | u32 len; \ | ||
| 187 | \ | ||
| 188 | ceph_decode_32_safe(p, end, len, bad); \ | ||
| 189 | while (len--) { \ | ||
| 190 | ceph_decode_skip_##ktype1(p, end, bad); \ | ||
| 191 | ceph_decode_skip_map(p, end, ktype2, vtype2, bad); \ | ||
| 192 | } \ | ||
| 193 | } while (0) | ||
| 194 | |||
| 195 | /* | ||
| 136 | * struct ceph_timespec <-> struct timespec | 196 | * struct ceph_timespec <-> struct timespec |
| 137 | */ | 197 | */ |
| 138 | static inline void ceph_decode_timespec(struct timespec *ts, | 198 | static inline void ceph_decode_timespec(struct timespec *ts, |
