summaryrefslogtreecommitdiff
path: root/glib/gfileutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'glib/gfileutils.c')
-rw-r--r--glib/gfileutils.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/glib/gfileutils.c b/glib/gfileutils.c
index 185a756dc..a87f0e97a 100644
--- a/glib/gfileutils.c
+++ b/glib/gfileutils.c
@@ -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 BTRFS_SUPER_MAGIC
+ {
+ 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)