Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 278b1d70 authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

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: default avatarIlya Dryomov <idryomov@gmail.com>
parent ab75144b
Loading
Loading
Loading
Loading
+60 −0
Original line number Diff line number Diff line
@@ -132,6 +132,66 @@ static inline char *ceph_extract_encoded_string(void **p, void *end,
	return ERR_PTR(-ERANGE);
}

/*
 * skip helpers
 */
#define ceph_decode_skip_n(p, end, n, bad)			\
	do {							\
		ceph_decode_need(p, end, n, bad);		\
                *p += n;					\
	} while (0)

#define ceph_decode_skip_64(p, end, bad)			\
ceph_decode_skip_n(p, end, sizeof(u64), bad)

#define ceph_decode_skip_32(p, end, bad)			\
ceph_decode_skip_n(p, end, sizeof(u32), bad)

#define ceph_decode_skip_16(p, end, bad)			\
ceph_decode_skip_n(p, end, sizeof(u16), bad)

#define ceph_decode_skip_8(p, end, bad)				\
ceph_decode_skip_n(p, end, sizeof(u8), bad)

#define ceph_decode_skip_string(p, end, bad)			\
	do {							\
		u32 len;					\
								\
		ceph_decode_32_safe(p, end, len, bad);		\
		ceph_decode_skip_n(p, end, len, bad);		\
	} while (0)

#define ceph_decode_skip_set(p, end, type, bad)			\
	do {							\
		u32 len;					\
								\
		ceph_decode_32_safe(p, end, len, bad);		\
		while (len--)					\
			ceph_decode_skip_##type(p, end, bad);	\
	} while (0)

#define ceph_decode_skip_map(p, end, ktype, vtype, bad)		\
	do {							\
		u32 len;					\
								\
		ceph_decode_32_safe(p, end, len, bad);		\
		while (len--) {					\
			ceph_decode_skip_##ktype(p, end, bad);	\
			ceph_decode_skip_##vtype(p, end, bad);	\
		}						\
	} while (0)

#define ceph_decode_skip_map_of_map(p, end, ktype1, ktype2, vtype2, bad) \
	do {							\
		u32 len;					\
								\
		ceph_decode_32_safe(p, end, len, bad);		\
		while (len--) {					\
			ceph_decode_skip_##ktype1(p, end, bad);	\
			ceph_decode_skip_map(p, end, ktype2, vtype2, bad); \
		}						\
	} while (0)

/*
 * struct ceph_timespec <-> struct timespec
 */
+3 −22
Original line number Diff line number Diff line
@@ -138,21 +138,6 @@ static int crush_decode_straw2_bucket(void **p, void *end,
	return -EINVAL;
}

static int skip_name_map(void **p, void *end)
{
        int len;
        ceph_decode_32_safe(p, end, len ,bad);
        while (len--) {
                int strlen;
                *p += sizeof(u32);
                ceph_decode_32_safe(p, end, strlen, bad);
                *p += strlen;
}
        return 0;
bad:
        return -EINVAL;
}

static void crush_finalize(struct crush_map *c)
{
	__s32 b;
@@ -187,7 +172,6 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
	void **p = &pbyval;
	void *start = pbyval;
	u32 magic;
	u32 num_name_maps;

	dout("crush_decode %p to %p len %d\n", *p, end, (int)(end - *p));

@@ -353,12 +337,9 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
		}
	}

	/* ignore trailing name maps. */
        for (num_name_maps = 0; num_name_maps < 3; num_name_maps++) {
                err = skip_name_map(p, end);
                if (err < 0)
                        goto done;
        }
	ceph_decode_skip_map(p, end, 32, string, bad); /* type_map */
	ceph_decode_skip_map(p, end, 32, string, bad); /* name_map */
	ceph_decode_skip_map(p, end, 32, string, bad); /* rule_name_map */

        /* tunables */
        ceph_decode_need(p, end, 3*sizeof(u32), done);