From: Ben Pfaff Date: Thu, 11 Feb 2010 23:35:46 +0000 (-0800) Subject: ovsdb: Factor out code to fsync a file's containing directory. X-Git-Tag: v1.0.0~259^2~130 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=8e71cf88b78eb704d452b1a4abf8014de340438e;p=sliver-openvswitch.git ovsdb: Factor out code to fsync a file's containing directory. In an upcoming commit, another function wants to do the same thing, so break it out into a helper function. --- diff --git a/lib/socket-util.c b/lib/socket-util.c index a8f805c56..912c47e09 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -557,3 +557,34 @@ write_fully(int fd, const void *p_, size_t size, size_t *bytes_written) } return 0; } + +/* Given file name 'file_name', fsyncs the directory in which it is contained. + * Returns 0 if successful, otherwise a positive errno value. */ +int +fsync_parent_dir(const char *file_name) +{ + int error = 0; + char *dir; + int fd; + + dir = dir_name(file_name); + fd = open(dir, O_RDONLY); + if (fd >= 0) { + if (fsync(fd)) { + if (errno == EINVAL || errno == EROFS) { + /* This directory does not support synchronization. Not + * really an error. */ + } else { + error = errno; + VLOG_ERR("%s: fsync failed (%s)", dir, strerror(error)); + } + } + close(fd); + } else { + error = errno; + VLOG_ERR("%s: open failed (%s)", dir, strerror(error)); + } + free(dir); + + return error; +} diff --git a/lib/socket-util.h b/lib/socket-util.h index 11f21c2dc..e4899265c 100644 --- a/lib/socket-util.h +++ b/lib/socket-util.h @@ -42,4 +42,6 @@ int inet_open_passive(int style, const char *target, int default_port, int read_fully(int fd, void *, size_t, size_t *bytes_read); int write_fully(int fd, const void *, size_t, size_t *bytes_written); +int fsync_parent_dir(const char *file_name); + #endif /* socket-util.h */ diff --git a/ovsdb/log.c b/ovsdb/log.c index 6d07aca01..9c2767cb7 100644 --- a/ovsdb/log.c +++ b/ovsdb/log.c @@ -29,6 +29,7 @@ #include "ovsdb.h" #include "ovsdb-error.h" #include "sha1.h" +#include "socket-util.h" #include "transaction.h" #include "util.h" @@ -106,17 +107,7 @@ ovsdb_log_open(const char *name, enum ovsdb_log_open_mode open_mode, if (!fstat(fd, &s) && s.st_size == 0) { /* It's (probably) a new file so fsync() its parent directory to ensure * that its directory entry is committed to disk. */ - char *dir = dir_name(name); - int dirfd = open(dir, O_RDONLY); - if (dirfd >= 0) { - if (fsync(dirfd) && errno != EINVAL) { - VLOG_ERR("%s: fsync failed (%s)", dir, strerror(errno)); - } - close(dirfd); - } else { - VLOG_ERR("%s: open failed (%s)", dir, strerror(errno)); - } - free(dir); + fsync_parent_dir(name); } stream = fdopen(fd, open_mode == OVSDB_LOG_READ_ONLY ? "rb" : "w+b");