Commit c89136ea authored by Sage Weil's avatar Sage Weil
Browse files

ceph: convert encode/decode macros to inlines



This avoids the fugly pass by reference and makes the code a bit easier
to read.

Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 535bbb53
Loading
Loading
Loading
Loading
+67 −62
Original line number Diff line number Diff line
@@ -3,12 +3,44 @@

#include <asm/unaligned.h>

#include "types.h"

/*
 * in all cases,
 *   void **p     pointer to position pointer
 *   void *end    pointer to end of buffer (last byte + 1)
 */

static inline u64 ceph_decode_64(void **p)
{
	u64 v = get_unaligned_le64(*p);
	*p += sizeof(u64);
	return v;
}
static inline u32 ceph_decode_32(void **p)
{
	u32 v = get_unaligned_le32(*p);
	*p += sizeof(u32);
	return v;
}
static inline u16 ceph_decode_16(void **p)
{
	u16 v = get_unaligned_le16(*p);
	*p += sizeof(u16);
	return v;
}
static inline u8 ceph_decode_8(void **p)
{
	u8 v = *(u8 *)*p;
	(*p)++;
	return v;
}
static inline void ceph_decode_copy(void **p, void *pv, size_t n)
{
	memcpy(pv, *p, n);
	*p += n;
}

/*
 * bounds check input.
 */
@@ -18,48 +50,20 @@
			goto bad;			\
	} while (0)

#define ceph_decode_64(p, v)					\
	do {							\
		v = get_unaligned_le64(*(p));			\
		*(p) += sizeof(u64);				\
	} while (0)
#define ceph_decode_32(p, v)					\
	do {							\
		v = get_unaligned_le32(*(p));			\
		*(p) += sizeof(u32);				\
	} while (0)
#define ceph_decode_16(p, v)					\
	do {							\
		v = get_unaligned_le16(*(p));			\
		*(p) += sizeof(u16);				\
	} while (0)
#define ceph_decode_8(p, v)				\
	do {						\
		v = *(u8 *)*(p);			\
		(*p)++;					\
	} while (0)

#define ceph_decode_copy(p, pv, n)			\
	do {						\
		memcpy(pv, *(p), n);			\
		*(p) += n;				\
	} while (0)

/* bounds check too */
#define ceph_decode_64_safe(p, end, v, bad)			\
	do {							\
		ceph_decode_need(p, end, sizeof(u64), bad);	\
		ceph_decode_64(p, v);				\
		v = ceph_decode_64(p);				\
	} while (0)
#define ceph_decode_32_safe(p, end, v, bad)			\
	do {							\
		ceph_decode_need(p, end, sizeof(u32), bad);	\
		ceph_decode_32(p, v);				\
		v = ceph_decode_32(p);				\
	} while (0)
#define ceph_decode_16_safe(p, end, v, bad)			\
	do {							\
		ceph_decode_need(p, end, sizeof(u16), bad);	\
		ceph_decode_16(p, v);				\
		v = ceph_decode_16(p);				\
	} while (0)

#define ceph_decode_copy_safe(p, end, pv, n, bad)		\
@@ -71,41 +75,42 @@
/*
 * struct ceph_timespec <-> struct timespec
 */
#define ceph_decode_timespec(ts, tv)					\
	do {								\
		(ts)->tv_sec = le32_to_cpu((tv)->tv_sec);		\
		(ts)->tv_nsec = le32_to_cpu((tv)->tv_nsec);		\
	} while (0)
#define ceph_encode_timespec(tv, ts)				\
	do {							\
		(tv)->tv_sec = cpu_to_le32((ts)->tv_sec);	\
		(tv)->tv_nsec = cpu_to_le32((ts)->tv_nsec);	\
	} while (0)

static inline void ceph_decode_timespec(struct timespec *ts,
					struct ceph_timespec *tv)
{
	ts->tv_sec = le32_to_cpu(tv->tv_sec);
	ts->tv_nsec = le32_to_cpu(tv->tv_nsec);
}
static inline void ceph_encode_timespec(struct ceph_timespec *tv,
					struct timespec *ts)
{
	tv->tv_sec = cpu_to_le32(ts->tv_sec);
	tv->tv_nsec = cpu_to_le32(ts->tv_nsec);
}

/*
 * encoders
 */
#define ceph_encode_64(p, v)						\
	do {								\
		put_unaligned_le64(v, (__le64 *)*(p));			\
		*(p) += sizeof(u64);					\
	} while (0)
#define ceph_encode_32(p, v)					\
	do {							\
		put_unaligned_le32(v, (__le32 *)*(p));		\
		*(p) += sizeof(u32);				\
	} while (0)
#define ceph_encode_16(p, v)					\
	do {							\
		put_unaligned_le16(v), (__le16 *)*(p));		\
	*(p) += sizeof(u16);					\
	} while (0)
#define ceph_encode_8(p, v)			  \
	do {					  \
		*(u8 *)*(p) = v;		  \
		(*(p))++;			  \
	} while (0)
static inline void ceph_encode_64(void **p, u64 v)
{
	put_unaligned_le64(v, (__le64 *)*p);
	*p += sizeof(u64);
}
static inline void ceph_encode_32(void **p, u32 v)
{
	put_unaligned_le32(v, (__le32 *)*p);
	*p += sizeof(u32);
}
static inline void ceph_encode_16(void **p, u16 v)
{
	put_unaligned_le16(v, (__le16 *)*p);
	*p += sizeof(u16);
}
static inline void ceph_encode_8(void **p, u8 v)
{
	*(u8 *)*p = v;
	(*p)++;
}

/*
 * filepath, string encoders
+10 −10
Original line number Diff line number Diff line
@@ -136,9 +136,9 @@ static int parse_reply_info_dir(void **p, void *end,
		goto bad;

	ceph_decode_need(p, end, sizeof(num) + 2, bad);
	ceph_decode_32(p, num);
	ceph_decode_8(p, info->dir_end);
	ceph_decode_8(p, info->dir_complete);
	num = ceph_decode_32(p);
	info->dir_end = ceph_decode_8(p);
	info->dir_complete = ceph_decode_8(p);
	if (num == 0)
		goto done;

@@ -160,7 +160,7 @@ static int parse_reply_info_dir(void **p, void *end,
	while (num) {
		/* dentry */
		ceph_decode_need(p, end, sizeof(u32)*2, bad);
		ceph_decode_32(p, info->dir_dname_len[i]);
		info->dir_dname_len[i] = ceph_decode_32(p);
		ceph_decode_need(p, end, info->dir_dname_len[i], bad);
		info->dir_dname[i] = *p;
		*p += info->dir_dname_len[i];
@@ -1791,10 +1791,10 @@ static void handle_forward(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
	from_mds = le64_to_cpu(msg->hdr.src.name.num);

	ceph_decode_need(&p, end, sizeof(u64)+2*sizeof(u32), bad);
	ceph_decode_64(&p, tid);
	ceph_decode_32(&p, next_mds);
	ceph_decode_32(&p, fwd_seq);
	ceph_decode_8(&p, must_resend);
	tid = ceph_decode_64(&p);
	next_mds = ceph_decode_32(&p);
	fwd_seq = ceph_decode_32(&p);
	must_resend = ceph_decode_8(&p);

	WARN_ON(must_resend);  /* shouldn't happen. */

@@ -2783,8 +2783,8 @@ void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
		pr_err("got mdsmap with wrong fsid\n");
		return;
	}
	ceph_decode_32(&p, epoch);
	ceph_decode_32(&p, maplen);
	epoch = ceph_decode_32(&p);
	maplen = ceph_decode_32(&p);
	dout("handle_map epoch %u len %d\n", epoch, (int)maplen);

	/* do we need it? */
+19 −19
Original line number Diff line number Diff line
@@ -60,21 +60,21 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
	ceph_decode_16_safe(p, end, version, bad);

	ceph_decode_need(p, end, 8*sizeof(u32) + sizeof(u64), bad);
	ceph_decode_32(p, m->m_epoch);
	ceph_decode_32(p, m->m_client_epoch);
	ceph_decode_32(p, m->m_last_failure);
	ceph_decode_32(p, m->m_root);
	ceph_decode_32(p, m->m_session_timeout);
	ceph_decode_32(p, m->m_session_autoclose);
	ceph_decode_64(p, m->m_max_file_size);
	ceph_decode_32(p, m->m_max_mds);
	m->m_epoch = ceph_decode_32(p);
	m->m_client_epoch = ceph_decode_32(p);
	m->m_last_failure = ceph_decode_32(p);
	m->m_root = ceph_decode_32(p);
	m->m_session_timeout = ceph_decode_32(p);
	m->m_session_autoclose = ceph_decode_32(p);
	m->m_max_file_size = ceph_decode_64(p);
	m->m_max_mds = ceph_decode_32(p);

	m->m_info = kcalloc(m->m_max_mds, sizeof(*m->m_info), GFP_NOFS);
	if (m->m_info == NULL)
		goto badmem;

	/* pick out active nodes from mds_info (state > 0) */
	ceph_decode_32(p, n);
	n = ceph_decode_32(p);
	for (i = 0; i < n; i++) {
		u32 namelen;
		s32 mds, inc, state;
@@ -86,18 +86,18 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)

		ceph_decode_need(p, end, sizeof(addr) + 1 + sizeof(u32), bad);
		ceph_decode_copy(p, &addr, sizeof(addr));
		ceph_decode_8(p, infoversion);
		ceph_decode_32(p, namelen);  /* skip mds name */
		infoversion = ceph_decode_8(p);
		namelen = ceph_decode_32(p);  /* skip mds name */
		*p += namelen;

		ceph_decode_need(p, end,
				 4*sizeof(u32) + sizeof(u64) +
				 sizeof(addr) + sizeof(struct ceph_timespec),
				 bad);
		ceph_decode_32(p, mds);
		ceph_decode_32(p, inc);
		ceph_decode_32(p, state);
		ceph_decode_64(p, state_seq);
		mds = ceph_decode_32(p);
		inc = ceph_decode_32(p);
		state = ceph_decode_32(p);
		state_seq = ceph_decode_64(p);
		*p += sizeof(addr);
		*p += sizeof(struct ceph_timespec);
		*p += sizeof(u32);
@@ -123,8 +123,8 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
					kcalloc(num_export_targets, sizeof(u32),
						GFP_NOFS);
				for (j = 0; j < num_export_targets; j++)
					ceph_decode_32(&pexport_targets,
					      m->m_info[mds].export_targets[j]);
					m->m_info[mds].export_targets[j] =
					       ceph_decode_32(&pexport_targets);
			} else {
				m->m_info[mds].export_targets = NULL;
			}
@@ -139,8 +139,8 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
		goto badmem;
	ceph_decode_need(p, end, sizeof(u32)*(n+1), bad);
	for (i = 0; i < n; i++)
		ceph_decode_32(p, m->m_data_pg_pools[i]);
	ceph_decode_32(p, m->m_cas_pg_pool);
		m->m_data_pg_pools[i] = ceph_decode_32(p);
	m->m_cas_pg_pool = ceph_decode_32(p);

	/* ok, we don't care about the rest. */
	dout("mdsmap_decode success epoch %u\n", m->m_epoch);
+2 −2
Original line number Diff line number Diff line
@@ -45,9 +45,9 @@ struct ceph_monmap *ceph_monmap_decode(void *p, void *end)

	ceph_decode_need(&p, end, sizeof(fsid) + 2*sizeof(u32), bad);
	ceph_decode_copy(&p, &fsid, sizeof(fsid));
	ceph_decode_32(&p, epoch);
	epoch = ceph_decode_32(&p);

	ceph_decode_32(&p, num_mon);
	num_mon = ceph_decode_32(&p);
	ceph_decode_need(&p, end, num_mon*sizeof(m->mon_inst[0]), bad);

	if (num_mon >= CEPH_MAX_MON)
+4 −4
Original line number Diff line number Diff line
@@ -894,8 +894,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
	dout(" %d inc maps\n", nr_maps);
	while (nr_maps > 0) {
		ceph_decode_need(&p, end, 2*sizeof(u32), bad);
		ceph_decode_32(&p, epoch);
		ceph_decode_32(&p, maplen);
		epoch = ceph_decode_32(&p);
		maplen = ceph_decode_32(&p);
		ceph_decode_need(&p, end, maplen, bad);
		next = p + maplen;
		if (osdc->osdmap && osdc->osdmap->epoch+1 == epoch) {
@@ -927,8 +927,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
	dout(" %d full maps\n", nr_maps);
	while (nr_maps) {
		ceph_decode_need(&p, end, 2*sizeof(u32), bad);
		ceph_decode_32(&p, epoch);
		ceph_decode_32(&p, maplen);
		epoch = ceph_decode_32(&p);
		maplen = ceph_decode_32(&p);
		ceph_decode_need(&p, end, maplen, bad);
		if (nr_maps > 1) {
			dout("skipping non-latest full map %u len %d\n",
Loading