]> git.proxmox.com Git - ovs.git/commitdiff
log: Add new open mode OVSDB_LOG_CREATE_EXCL.
authorBen Pfaff <blp@ovn.org>
Tue, 5 Dec 2017 17:30:26 +0000 (09:30 -0800)
committerBen Pfaff <blp@ovn.org>
Sun, 24 Dec 2017 19:47:33 +0000 (11:47 -0800)
Until now, OVSDB_LOG_CREATE implied EXCL, but this commit breaks them
apart.

Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Justin Pettit <jpettit@ovn.org>
ovsdb/file.c
ovsdb/log.c
ovsdb/log.h
ovsdb/ovsdb-tool.c
tests/ovsdb-log.at
tests/test-ovsdb.c

index 1c5573c326f376ae101ce13955471d85d0ac6251..983759e3582ea839b8ac62b0f372bfb9d199da84 100644 (file)
@@ -439,7 +439,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;
     }
index edce44310359bcae92a244136ed7b86846459e60..b7f8222748e16cc4f5fb0440791edf47bf842dd2 100644 (file)
@@ -96,11 +96,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)) {
@@ -115,7 +120,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
@@ -123,7 +134,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;
     }
index 8bba3f1b776579ecf57f7c64ac961aaa221741cd..a6cba58e1df512b1fd042b367a42ab652e5cf722 100644 (file)
@@ -27,7 +27,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"
index 157ebabc7789d84d5f6b58563adf9a1255f7d1ca..4343e3ce5b22435b23c0db37e2cc64b39708e046 100644 (file)
@@ -220,7 +220,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);
index 29c0c5913c1570cc4e0936e40fdfde6060ebe414..826e334efdddb2e78c5b74a9846e2d76f5c5b101 100644 (file)
@@ -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
 
index d2ac6a63795d26ebadc7bbe0f0d6737adb67bc58..1b908ae699e62462a96606229f60df6722ce1f95 100644 (file)
@@ -321,6 +321,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);
     }