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
