Until now, OVSDB_LOG_CREATE implied EXCL, but this commit breaks them
apart.

Signed-off-by: Ben Pfaff <[email protected]>
---
 ovsdb/file.c       |  2 +-
 ovsdb/log.c        | 23 ++++++++++++++++++-----
 ovsdb/log.h        |  3 ++-
 ovsdb/ovsdb-tool.c |  2 +-
 tests/ovsdb-log.at |  7 ++++++-
 tests/test-ovsdb.c |  2 ++
 6 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/ovsdb/file.c b/ovsdb/file.c
index 16461a75bfe5..fca07c3d722d 100644
--- a/ovsdb/file.c
+++ b/ovsdb/file.c
@@ -441,7 +441,7 @@ ovsdb_file_save_copy__(const char *file_name, int locking,
     struct json *json;
 
     error = ovsdb_log_open(file_name, OVSDB_MAGIC,
-                           OVSDB_LOG_CREATE, locking, &log);
+                           OVSDB_LOG_CREATE_EXCL, locking, &log);
     if (error) {
         return error;
     }
diff --git a/ovsdb/log.c b/ovsdb/log.c
index f3c6e22ae212..f95075034b3d 100644
--- a/ovsdb/log.c
+++ b/ovsdb/log.c
@@ -95,11 +95,16 @@ ovsdb_log_open(const char *name, const char *magic,
         lockfile = NULL;
     }
 
-    if (open_mode == OVSDB_LOG_READ_ONLY) {
+    switch (open_mode) {
+    case OVSDB_LOG_READ_ONLY:
         flags = O_RDONLY;
-    } else if (open_mode == OVSDB_LOG_READ_WRITE) {
+        break;
+
+    case OVSDB_LOG_READ_WRITE:
         flags = O_RDWR;
-    } else if (open_mode == OVSDB_LOG_CREATE) {
+        break;
+
+    case OVSDB_LOG_CREATE_EXCL:
 #ifndef _WIN32
         if (stat(name, &s) == -1 && errno == ENOENT
             && lstat(name, &s) == 0 && S_ISLNK(s.st_mode)) {
@@ -114,7 +119,13 @@ ovsdb_log_open(const char *name, const char *magic,
 #else
         flags = O_RDWR | O_CREAT | O_EXCL;
 #endif
-    } else {
+        break;
+
+    case OVSDB_LOG_CREATE:
+        flags = O_RDWR | O_CREAT;
+        break;
+
+    default:
         OVS_NOT_REACHED();
     }
 #ifdef _WIN32
@@ -122,7 +133,9 @@ ovsdb_log_open(const char *name, const char *magic,
 #endif
     fd = open(name, flags, 0666);
     if (fd < 0) {
-        const char *op = open_mode == OVSDB_LOG_CREATE ? "create" : "open";
+        const char *op = (open_mode == OVSDB_LOG_CREATE_EXCL ? "create"
+            : open_mode == OVSDB_LOG_CREATE ? "create or open"
+            : "open");
         error = ovsdb_io_error(errno, "%s: %s failed", name, op);
         goto error_unlock;
     }
diff --git a/ovsdb/log.h b/ovsdb/log.h
index fd495e518dd0..08c6a7783094 100644
--- a/ovsdb/log.h
+++ b/ovsdb/log.h
@@ -26,7 +26,8 @@ struct ovsdb_log;
 enum ovsdb_log_open_mode {
     OVSDB_LOG_READ_ONLY,        /* Open existing file, read-only. */
     OVSDB_LOG_READ_WRITE,       /* Open existing file, read/write. */
-    OVSDB_LOG_CREATE            /* Create new file, read/write. */
+    OVSDB_LOG_CREATE_EXCL,      /* Create new file, read/write. */
+    OVSDB_LOG_CREATE            /* Create or open file, read/write. */
 };
 
 #define OVSDB_MAGIC "OVSDB JSON"
diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
index 45b3f7348c3d..da6b7142a4fa 100644
--- a/ovsdb/ovsdb-tool.c
+++ b/ovsdb/ovsdb-tool.c
@@ -218,7 +218,7 @@ do_create(struct ovs_cmdl_context *ctx)
 
     /* Create database file. */
     check_ovsdb_error(ovsdb_log_open(db_file_name, OVSDB_MAGIC,
-                                     OVSDB_LOG_CREATE, -1, &log));
+                                     OVSDB_LOG_CREATE_EXCL, -1, &log));
     check_ovsdb_error(ovsdb_log_write(log, json));
     check_ovsdb_error(ovsdb_log_commit(log));
     ovsdb_log_close(log);
diff --git a/tests/ovsdb-log.at b/tests/ovsdb-log.at
index 29c0c5913c15..826e334efddd 100644
--- a/tests/ovsdb-log.at
+++ b/tests/ovsdb-log.at
@@ -46,9 +46,14 @@ AT_CHECK(
 file: read: {"x":1}
 ]], [ignore])
 AT_CHECK(
-  [test-ovsdb log-io file create read], [1],
+  [test-ovsdb log-io file create-excl read], [1],
   [], [test-ovsdb: I/O error: file: create failed (File exists)
 ])
+AT_CHECK(
+  [test-ovsdb log-io file create read], [0],
+  [file: open successful
+file: read: {"x":1}
+])
 AT_CHECK([test -f .file.~lock~])
 AT_CLEANUP
 
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index 4d6a894e3e83..e06ecad4f368 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -323,6 +323,8 @@ do_log_io(struct ovs_cmdl_context *ctx)
         mode = OVSDB_LOG_READ_WRITE;
     } else if (!strcmp(mode_string, "create")) {
         mode = OVSDB_LOG_CREATE;
+    } else if (!strcmp(mode_string, "create-excl")) {
+        mode = OVSDB_LOG_CREATE_EXCL;
     } else {
         ovs_fatal(0, "unknown log-io open mode \"%s\"", mode_string);
     }
-- 
2.10.2

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to