Loading fs/ceph/decode.h +67 −62 Original line number Diff line number Diff line Loading @@ -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. */ Loading @@ -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) \ Loading @@ -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 Loading fs/ceph/mds_client.c +10 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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]; Loading Loading @@ -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. */ Loading Loading @@ -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? */ Loading fs/ceph/mdsmap.c +19 −19 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -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; } Loading @@ -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); Loading fs/ceph/mon_client.c +2 −2 Original line number Diff line number Diff line Loading @@ -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) Loading fs/ceph/osd_client.c +4 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 Loading
fs/ceph/decode.h +67 −62 Original line number Diff line number Diff line Loading @@ -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. */ Loading @@ -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) \ Loading @@ -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 Loading
fs/ceph/mds_client.c +10 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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]; Loading Loading @@ -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. */ Loading Loading @@ -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? */ Loading
fs/ceph/mdsmap.c +19 −19 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -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; } Loading @@ -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); Loading
fs/ceph/mon_client.c +2 −2 Original line number Diff line number Diff line Loading @@ -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) Loading
fs/ceph/osd_client.c +4 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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