mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 11:26:16 +01:00
Bug 637544 - Skip fsync() on btrfs
For g_file_set_contents() we fsync() before renaming the file over the original in order to ensure that we don't end up with an invalid file. btrfs provides this guarantee for us without the fsync() so skip it there.
This commit is contained in:
parent
dce0c1c563
commit
99fe4b1da7
@ -53,6 +53,10 @@
|
||||
#include "gstdio.h"
|
||||
#include "glibintl.h"
|
||||
|
||||
#ifdef __linux__ /* for btrfs check */
|
||||
#include <linux/magic.h>
|
||||
#include <sys/vfs.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* g_mkdir_with_parents:
|
||||
@ -963,6 +967,20 @@ write_to_temp_file (const gchar *contents,
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
{
|
||||
struct statfs buf;
|
||||
|
||||
/* On Linux, on btrfs, skip the fsync since rename-over-existing is
|
||||
* guaranteed to be atomic and this is the only case in which we
|
||||
* would fsync() anyway.
|
||||
*/
|
||||
|
||||
if (fstatfs (fd, &buf) == 0 && buf.f_type == BTRFS_SUPER_MAGIC)
|
||||
goto no_fsync;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FSYNC
|
||||
{
|
||||
@ -994,6 +1012,7 @@ write_to_temp_file (const gchar *contents,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
no_fsync:
|
||||
|
||||
errno = 0;
|
||||
if (fclose (file) == EOF)
|
||||
|
Loading…
Reference in New Issue
Block a user