Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 188579
b: refs/heads/master
c: c89136e
h: refs/heads/master
i:
  188577: 3dc8455
  188575: e952cf4
v: v3
  • Loading branch information
Sage Weil committed Oct 14, 2009
1 parent 154afe8 commit 4b33818
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 133 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 535bbb530764b1b2b3b732837f0e61e1baae7109
refs/heads/master: c89136ea4253c73e89e97f5138bb22d97ad9f564
129 changes: 67 additions & 62 deletions trunk/fs/ceph/decode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand All @@ -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) \
Expand All @@ -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
Expand Down
20 changes: 10 additions & 10 deletions trunk/fs/ceph/mds_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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];
Expand Down Expand Up @@ -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. */

Expand Down Expand Up @@ -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? */
Expand Down
38 changes: 19 additions & 19 deletions trunk/fs/ceph/mdsmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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;
}
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions trunk/fs/ceph/mon_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions trunk/fs/ceph/osd_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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",
Expand Down
Loading

0 comments on commit 4b33818

Please sign in to comment.