Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- v2: - move alignment check ingo get_open_flags() - add check for object cache IO sheep/object_cache.c | 8 ++++++-- sheep/plain_store.c | 14 ++++++++------ sheep/sheep_priv.h | 5 +++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/sheep/object_cache.c b/sheep/object_cache.c index 3aa7fd6..18f1198 100644 --- a/sheep/object_cache.c +++ b/sheep/object_cache.c @@ -288,8 +288,10 @@ static int read_cache_object_noupdate(uint32_t vid, uint32_t idx, void *buf, snprintf(p, sizeof(p), "%s/%06"PRIx32"/%08"PRIx32, object_cache_dir, vid, idx); - if (sys->object_cache_directio && !idx_has_vdi_bit(idx)) + if (sys->object_cache_directio && !idx_has_vdi_bit(idx)) { + assert(is_aligned_to_pagesize(buf)); flags |= O_DIRECT; + } fd = open(p, flags, sd_def_fmode); if (fd < 0) { @@ -322,8 +324,10 @@ static int write_cache_object_noupdate(uint32_t vid, uint32_t idx, void *buf, snprintf(p, sizeof(p), "%s/%06"PRIx32"/%08"PRIx32, object_cache_dir, vid, idx); - if (sys->object_cache_directio && !idx_has_vdi_bit(idx)) + if (sys->object_cache_directio && !idx_has_vdi_bit(idx)) { + assert(is_aligned_to_pagesize(buf)); flags |= O_DIRECT; + } fd = open(p, flags, sd_def_fmode); if (fd < 0) { diff --git a/sheep/plain_store.c b/sheep/plain_store.c index b932d6a..33a3fd2 100644 --- a/sheep/plain_store.c +++ b/sheep/plain_store.c @@ -20,7 +20,7 @@ #include "config.h" #include "sha1.h" -static int get_open_flags(uint64_t oid, bool create) +static int get_open_flags(uint64_t oid, bool create, void *buf) { int flags = O_DSYNC | O_RDWR; @@ -28,8 +28,10 @@ static int get_open_flags(uint64_t oid, bool create) flags &= ~O_DSYNC; /* We can not use DIO for inode object because it is not 512B aligned */ - if (sys->backend_dio && is_data_obj(oid)) + if (sys->backend_dio && is_data_obj(oid)) { + assert(is_aligned_to_pagesize(buf)); flags |= O_DIRECT; + } if (create) flags |= O_CREAT | O_EXCL; @@ -92,7 +94,7 @@ static int err_to_sderr(char *path, uint64_t oid, int err) int default_write(uint64_t oid, const struct siocb *iocb) { - int flags = get_open_flags(oid, false), fd, + int flags = get_open_flags(oid, false, iocb->buf), fd, ret = SD_RES_SUCCESS; char path[PATH_MAX]; ssize_t size; @@ -173,8 +175,8 @@ int default_cleanup(void) static int init_vdi_state(uint64_t oid, char *wd) { char path[PATH_MAX]; - int fd, flags = get_open_flags(oid, false), ret; struct sd_inode *inode = xzalloc(sizeof(*inode)); + int fd, flags = get_open_flags(oid, false, inode), ret; snprintf(path, sizeof(path), "%s/%016"PRIx64, wd, oid); @@ -233,7 +235,7 @@ int default_init(void) static int default_read_from_path(uint64_t oid, char *path, const struct siocb *iocb) { - int flags = get_open_flags(oid, false), fd, + int flags = get_open_flags(oid, false, iocb->buf), fd, ret = SD_RES_SUCCESS; ssize_t size; @@ -294,7 +296,7 @@ int prealloc(int fd, uint32_t size) int default_create_and_write(uint64_t oid, const struct siocb *iocb) { char path[PATH_MAX], tmp_path[PATH_MAX]; - int flags = get_open_flags(oid, true); + int flags = get_open_flags(oid, true, iocb->buf); int ret, fd; uint32_t len = iocb->length; diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index d086aef..98c4197 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -212,6 +212,11 @@ static inline uint32_t sys_epoch(void) return uatomic_read(&sys->epoch); } +static inline bool is_aligned_to_pagesize(void *p) +{ + return ((uintptr_t)p & (getpagesize() - 1)) == 0; +} + int create_listen_port(char *bindaddr, int port); int init_unix_domain_socket(const char *dir); -- 1.8.1.3.566.gaa39828 |