init_vdi_copy_number() uses O_DIRECT for vdi objects too.  This patch
introduces get_open_flags to avoid making this kind of mistake any
more.

Signed-off-by: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
---
 sheep/plain_store.c |   31 ++++++++++++++++---------------
 1 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index c0c6915..fe2ced9 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -19,7 +19,18 @@
 
 static char stale_dir[PATH_MAX];
 
-static int def_open_flags = O_DIRECT | O_DSYNC | O_RDWR;
+static int get_open_flags(uint64_t oid, bool create)
+{
+       int flags = O_DSYNC | O_RDWR;
+
+       if (is_data_obj(oid))
+               flags |= O_DIRECT;
+
+       if (create)
+               flags |= O_CREAT | O_TRUNC;
+
+       return flags;
+}
 
 static int get_obj_path(uint64_t oid, char *path)
 {
@@ -97,7 +108,7 @@ static int err_to_sderr(uint64_t oid, int err)
 
 int default_write(uint64_t oid, struct siocb *iocb, int create)
 {
-       int flags = def_open_flags, fd, ret = SD_RES_SUCCESS;
+       int flags = get_open_flags(oid, create), fd, ret = SD_RES_SUCCESS;
        char path[PATH_MAX];
        ssize_t size;
 
@@ -105,11 +116,6 @@ int default_write(uint64_t oid, struct siocb *iocb, int 
create)
                dprintf("%"PRIu32" sys %"PRIu32"\n", iocb->epoch, sys_epoch());
                return SD_RES_OLD_NODE_VER;
        }
-       if (!is_data_obj(oid))
-               flags &= ~O_DIRECT;
-
-       if (create)
-               flags |= O_CREAT | O_TRUNC;
 
        get_obj_path(oid, path);
        fd = open(path, flags, def_fmode);
@@ -146,7 +152,7 @@ int default_cleanup(struct siocb *iocb)
 static int init_vdi_copy_number(uint64_t oid)
 {
        char path[PATH_MAX];
-       int fd, flags = def_open_flags, ret;
+       int fd, flags = get_open_flags(oid, false), ret;
        struct sheepdog_inode inode;
 
        snprintf(path, sizeof(path), "%s%016" PRIx64, obj_path, oid);
@@ -202,12 +208,9 @@ int default_init(char *p)
 static int default_read_from_path(uint64_t oid, char *path,
                                       struct siocb *iocb)
 {
-       int flags = def_open_flags, fd, ret = SD_RES_SUCCESS;
+       int flags = get_open_flags(oid, false), fd, ret = SD_RES_SUCCESS;
        ssize_t size;
 
-       if (!is_data_obj(oid))
-               flags &= ~O_DIRECT;
-
        fd = open(path, flags);
 
        if (fd < 0)
@@ -244,15 +247,13 @@ int default_read(uint64_t oid, struct siocb *iocb)
 int default_atomic_put(uint64_t oid, struct siocb *iocb)
 {
        char path[PATH_MAX], tmp_path[PATH_MAX];
-       int flags = def_open_flags | O_CREAT;
+       int flags = get_open_flags(oid, true);
        int ret = SD_RES_EIO, fd;
        uint32_t len = iocb->length;
 
        get_obj_path(oid, path);
        get_tmp_obj_path(oid, tmp_path);
 
-       if (!is_data_obj(oid))
-               flags &= ~O_DIRECT;
        fd = open(tmp_path, flags, def_fmode);
        if (fd < 0) {
                eprintf("failed to open %s: %m\n", tmp_path);
-- 
1.7.2.5

-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to