Get rid of the likes of *(__le64*)foo.
Get rid of useless ceph_decode_##_le() macros; use ceph_decode_copy
instead.
#ifndef __CEPH_DECODE_H
#define __CEPH_DECODE_H
+#include <asm/unaligned.h>
+
/*
* in all cases,
* void **p pointer to position pointer
goto bad; \
} while (0)
-#define ceph_decode_64(p, v) \
- do { \
- v = le64_to_cpu(*(__le64 *)*(p)); \
- *(p) += sizeof(u64); \
+#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 = le32_to_cpu(*(__le32 *)*(p)); \
- *(p) += sizeof(u32); \
+#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 = le16_to_cpu(*(__le16 *)*(p)); \
- *(p) += sizeof(u16); \
+#define ceph_decode_16(p, v) \
+ do { \
+ v = get_unaligned_le16(*(p)); \
+ *(p) += sizeof(u16); \
} while (0)
#define ceph_decode_8(p, v) \
do { \
(*p)++; \
} while (0)
-/* decode into an __le## */
-#define ceph_decode_64_le(p, v) \
- do { \
- v = *(__le64 *)*(p); \
- *(p) += sizeof(u64); \
- } while (0)
-#define ceph_decode_32_le(p, v) \
- do { \
- v = *(__le32 *)*(p); \
- *(p) += sizeof(u32); \
- } while (0)
-#define ceph_decode_16_le(p, v) \
- do { \
- v = *(__le16 *)*(p); \
- *(p) += sizeof(u16); \
- } while (0)
-
#define ceph_decode_copy(p, pv, n) \
do { \
memcpy(pv, *(p), n); \
/*
* encoders
*/
-#define ceph_encode_64(p, v) \
- do { \
- *(__le64 *)*(p) = cpu_to_le64((v)); \
- *(p) += sizeof(u64); \
+#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 { \
- *(__le32 *)*(p) = cpu_to_le32((v)); \
- *(p) += sizeof(u32); \
+#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 { \
- *(__le16 *)*(p) = cpu_to_le16((v)); \
- *(p) += sizeof(u16); \
+#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 { \
#include <linux/exportfs.h>
+#include <asm/unaligned.h>
#include "super.h"
#include "ceph_debug.h"
struct ceph_vino ino;
struct ceph_vino parent_ino;
u32 parent_name_hash;
-};
+} __attribute__ ((packed));
#define IPSZ ((sizeof(struct ceph_export_item) + sizeof(u32) + 1) / sizeof(u32))
int fh_len, int fh_type)
{
u32 *fh = fid->raw;
- u64 ino = *(u64 *)fh;
+ u64 ino = get_unaligned((u64 *)fh);
u32 hash = fh[2];
- derr(10, "fh_to_parent %llx.%x\n", ino, hash);
+ derr(10, "fh_to_parent %llx.%x\n", (unsigned long long)ino, hash);
if (fh_len < 6)
return ERR_PTR(-ESTALE);
mask = le16_to_cpu(h->mask);
dname.name = (void *)h + sizeof(*h) + sizeof(u32);
dname.len = msg->front.iov_len - sizeof(*h) - sizeof(u32);
- if (dname.len != le32_to_cpu(*(__le32 *)(h+1)))
+ if (dname.len != get_unaligned_le32(h+1))
goto bad;
/* find session */
lease->ino = cpu_to_le64(ceph_vino(inode).ino);
lease->first = lease->last = cpu_to_le64(ceph_vino(inode).snap);
lease->seq = cpu_to_le32(seq);
- *(__le32 *)((void *)lease + sizeof(*lease)) = cpu_to_le32(dnamelen);
- memcpy((void *)lease + sizeof(*lease) + 4, dentry->d_name.name,
- dnamelen);
+ put_unaligned_le32(dnamelen, lease + 1);
+ memcpy((void *)(lease + 1) + 4, dentry->d_name.name, dnamelen);
/*
* if this is a preemptive lease RELEASE, no need to
ceph_fsid_t fsid;
int err = -EINVAL;
int from;
- __le64 major, minor;
if (le32_to_cpu(msg->hdr.src.name.type) == CEPH_ENTITY_TYPE_MDS)
from = le32_to_cpu(msg->hdr.src.name.num);
from = -1;
ceph_decode_need(&p, end, sizeof(fsid)+2*sizeof(u32), bad);
- ceph_decode_64_le(&p, major);
- __ceph_fsid_set_major(&fsid, major);
- ceph_decode_64_le(&p, minor);
- __ceph_fsid_set_minor(&fsid, minor);
+ ceph_decode_copy(&p, &fsid, sizeof(fsid));
if (ceph_fsid_compare(&fsid, &mdsc->client->monc.monmap->fsid)) {
derr(0, "got mdsmap with wrong fsid\n");
return;
{
struct ceph_monmap *m;
int i, err = -EINVAL;
- __le64 major, minor;
+ ceph_fsid_t fsid;
dout(30, "monmap_decode %p %p len %d\n", p, end, (int)(end-p));
return ERR_PTR(-ENOMEM);
ceph_decode_need(&p, end, 2*sizeof(u32) + 2*sizeof(u64), bad);
- ceph_decode_64_le(&p, major);
- __ceph_fsid_set_major(&m->fsid, major);
- ceph_decode_64_le(&p, minor);
- __ceph_fsid_set_minor(&m->fsid, minor);
+ ceph_decode_copy(&p, &m->fsid, sizeof(fsid));
ceph_decode_32(&p, m->epoch);
ceph_decode_32(&p, m->num_mon);
ceph_decode_need(&p, end, m->num_mon*sizeof(m->mon_inst[0]), bad);
head->snap_seq = cpu_to_le64(snapc->seq);
head->num_snaps = cpu_to_le32(snapc->num_snaps);
for (i = 0; i < snapc->num_snaps; i++) {
- *(__le64 *)p = cpu_to_le64(snapc->snaps[i]);
+ put_unaligned_le64(snapc->snaps[i], p);
p += sizeof(u64);
}
}
struct ceph_osdmap *newmap = NULL, *oldmap;
int err;
ceph_fsid_t fsid;
- __le64 major, minor;
dout(2, "handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0);
p = msg->front.iov_base;
/* verify fsid */
ceph_decode_need(&p, end, sizeof(fsid), bad);
- ceph_decode_64_le(&p, major);
- __ceph_fsid_set_major(&fsid, major);
- ceph_decode_64_le(&p, minor);
- __ceph_fsid_set_minor(&fsid, minor);
+ ceph_decode_copy(&p, &fsid, sizeof(fsid));
if (ceph_fsid_compare(&fsid, &osdc->client->monc.monmap->fsid)) {
derr(0, "got map with wrong fsid, ignoring\n");
return;
u32 len, max, i;
int err = -EINVAL;
void *start = *p;
- __le64 major, minor;
dout(30, "osdmap_decode %p to %p len %d\n", *p, end, (int)(end - *p));
return ERR_PTR(-ENOMEM);
ceph_decode_need(p, end, 2*sizeof(u64)+6*sizeof(u32), bad);
- ceph_decode_64_le(p, major);
- __ceph_fsid_set_major(&map->fsid, major);
- ceph_decode_64_le(p, minor);
- __ceph_fsid_set_minor(&map->fsid, minor);
+ ceph_decode_copy(p, &map->fsid, sizeof(map->fsid));
ceph_decode_32(p, map->epoch);
- ceph_decode_32_le(p, map->created.tv_sec);
- ceph_decode_32_le(p, map->created.tv_nsec);
- ceph_decode_32_le(p, map->modified.tv_sec);
- ceph_decode_32_le(p, map->modified.tv_nsec);
+ ceph_decode_copy(p, &map->created, sizeof(map->created));
+ ceph_decode_copy(p, &map->modified, sizeof(map->modified));
ceph_decode_32(p, map->num_pools);
map->pg_pool = kmalloc(map->num_pools * sizeof(*map->pg_pool),
__s32 new_flags, max;
void *start = *p;
int err = -EINVAL;
- __le64 major, minor;
ceph_decode_need(p, end, sizeof(fsid)+sizeof(modified)+2*sizeof(u32),
bad);
- ceph_decode_64_le(p, major);
- __ceph_fsid_set_major(&fsid, major);
- ceph_decode_64_le(p, minor);
- __ceph_fsid_set_minor(&fsid, minor);
+ ceph_decode_copy(p, &fsid, sizeof(fsid));
ceph_decode_32(p, epoch);
BUG_ON(epoch != map->epoch+1);
- ceph_decode_32_le(p, modified.tv_sec);
- ceph_decode_32_le(p, modified.tv_nsec);
+ ceph_decode_copy(p, &modified, sizeof(modified));
ceph_decode_32(p, new_flags);
/* full map? */
#ifndef _FS_CEPH_SUPER_H
#define _FS_CEPH_SUPER_H
+#include <asm/unaligned.h>
#include <linux/fs.h>
#include <linux/wait.h>
#include <linux/completion.h>
static inline __le64 __ceph_fsid_minor(ceph_fsid_t *fsid)
{
- return *(__le64 *)&fsid->fsid[8];
+ return get_unaligned_le64(&fsid->fsid[8]);
}
static inline __le64 __ceph_fsid_major(ceph_fsid_t *fsid)
{
- return *(__le64 *)&fsid->fsid[0];
+ return get_unaligned_le64(&fsid->fsid[0]);
}
static inline void __ceph_fsid_set_minor(ceph_fsid_t *fsid, __le64 val)
{
- *(__le64 *)&fsid->fsid[8] = val;
+ put_unaligned_le64(val, &fsid->fsid[8]);
}
static inline void __ceph_fsid_set_major(ceph_fsid_t *fsid, __le64 val)
{
- *(__le64 *)&fsid->fsid[0] = val;
+ put_unaligned_le64(val, &fsid->fsid[0]);
}
/* inode.c */