Commit fc77891f by Edward Thomson

git_filebuf: optionally fsync when committing

parent a4b5ac64
...@@ -291,6 +291,9 @@ int git_filebuf_open_withsize(git_filebuf *file, const char *path, int flags, mo ...@@ -291,6 +291,9 @@ int git_filebuf_open_withsize(git_filebuf *file, const char *path, int flags, mo
if (flags & GIT_FILEBUF_DO_NOT_BUFFER) if (flags & GIT_FILEBUF_DO_NOT_BUFFER)
file->do_not_buffer = true; file->do_not_buffer = true;
if (flags & GIT_FILEBUF_FSYNC)
file->do_fsync = true;
file->buf_size = size; file->buf_size = size;
file->buf_pos = 0; file->buf_pos = 0;
file->fd = -1; file->fd = -1;
...@@ -425,6 +428,11 @@ int git_filebuf_commit(git_filebuf *file) ...@@ -425,6 +428,11 @@ int git_filebuf_commit(git_filebuf *file)
file->fd_is_open = false; file->fd_is_open = false;
if (file->do_fsync && p_fsync(file->fd) < 0) {
giterr_set(GITERR_OS, "failed to fsync '%s'", file->path_lock);
goto on_error;
}
if (p_close(file->fd) < 0) { if (p_close(file->fd) < 0) {
giterr_set(GITERR_OS, "failed to close file at '%s'", file->path_lock); giterr_set(GITERR_OS, "failed to close file at '%s'", file->path_lock);
goto on_error; goto on_error;
......
...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
#define GIT_FILEBUF_FORCE (1 << 3) #define GIT_FILEBUF_FORCE (1 << 3)
#define GIT_FILEBUF_TEMPORARY (1 << 4) #define GIT_FILEBUF_TEMPORARY (1 << 4)
#define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5) #define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5)
#define GIT_FILEBUF_DEFLATE_SHIFT (6) #define GIT_FILEBUF_FSYNC (1 << 6)
#define GIT_FILEBUF_DEFLATE_SHIFT (7)
#define GIT_FILELOCK_EXTENSION ".lock\0" #define GIT_FILELOCK_EXTENSION ".lock\0"
#define GIT_FILELOCK_EXTLENGTH 6 #define GIT_FILELOCK_EXTLENGTH 6
...@@ -47,6 +48,7 @@ struct git_filebuf { ...@@ -47,6 +48,7 @@ struct git_filebuf {
bool created_lock; bool created_lock;
bool did_rename; bool did_rename;
bool do_not_buffer; bool do_not_buffer;
bool do_fsync;
int last_error; int last_error;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment