Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- sheep/plain_store.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sheep/plain_store.c b/sheep/plain_store.c index b932d6a..e8dfb65 100644 --- a/sheep/plain_store.c +++ b/sheep/plain_store.c @@ -20,6 +20,11 @@ #include "config.h" #include "sha1.h" +static inline bool is_aligned_to_pagesize(void *p) +{ + return ((uintptr_t)p & (getpagesize() - 1)) == 0; +} + static int get_open_flags(uint64_t oid, bool create) { int flags = O_DSYNC | O_RDWR; @@ -97,6 +102,8 @@ int default_write(uint64_t oid, const struct siocb *iocb) char path[PATH_MAX]; ssize_t size; + assert(flags & O_DIRECT ? is_aligned_to_pagesize(iocb->buf) : true); + if (iocb->epoch < sys_epoch()) { sd_dprintf("%"PRIu32" sys %"PRIu32, iocb->epoch, sys_epoch()); return SD_RES_OLD_NODE_VER; @@ -237,6 +244,8 @@ static int default_read_from_path(uint64_t oid, char *path, ret = SD_RES_SUCCESS; ssize_t size; + assert(flags & O_DIRECT ? is_aligned_to_pagesize(iocb->buf) : true); + fd = open(path, flags); if (fd < 0) @@ -298,6 +307,8 @@ int default_create_and_write(uint64_t oid, const struct siocb *iocb) int ret, fd; uint32_t len = iocb->length; + assert(flags & O_DIRECT ? is_aligned_to_pagesize(iocb->buf) : true); + get_obj_path(oid, path); get_tmp_obj_path(oid, tmp_path); -- 1.8.1.3.566.gaa39828 |