2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-27 15:18:06 +00:00

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.
This commit is contained in:
Ben Pfaff
2010-02-11 15:35:46 -08:00
parent a3d573ed9b
commit 8e71cf88b7
3 changed files with 35 additions and 11 deletions

View 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;
}

View 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 */

View 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");