ovsdb: Factor out code to fsync a file's containing directory.
authorBen Pfaff <blp@nicira.com>
Thu, 11 Feb 2010 23:35:46 +0000 (15:35 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 15 Feb 2010 19:31:34 +0000 (11:31 -0800)
In an upcoming commit, another function wants to do the same thing, so
break it out into a helper function.

lib/socket-util.c
lib/socket-util.h
ovsdb/log.c

index a8f805c56370c79eb052013943483f51706abe19..912c47e097f8e80c807cabf3cfddcab343594184 100644 (file)
@@ -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;
+}
index 11f21c2dcc4b3c77112c55376bb709b3ba1b5574..e4899265c41b85914219b4346aba9b6e4a90c72c 100644 (file)
@@ -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 */
index 6d07aca01e65adfb10824b7f72e984dd1affa2e1..9c2767cb7206a05ed1efa245e925033f3efce99e 100644 (file)
@@ -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");