From fa4b0e431e493592ac650faa37675f31982ed11a Mon Sep 17 00:00:00 2001 From: Sebastian Keller Date: Tue, 11 Jan 2022 18:43:34 +0100 Subject: [PATCH] gfileutils: Remove outdated BTRFS fsync optimization from set_contents This code was skipping fsync on BTRFS because of an old guarantee about the overwrite-by-rename behavior that no longer holds true. This has been confirmed by the BTRFS developers to no longer be guaranteed since Kernel 3.17 (August 2014), but it was guaranteed when this optimization was first introduced in 2010. This could result in empty files after crashes in applications using g_file_set_contents(). Most prominently this might have been the cause of dconf settings getting lost on BTRFS after crashes due to the frequency with which such writes can happen in dconf. See: https://gitlab.gnome.org/GNOME/dconf/-/issues/73 --- glib/gfileutils.c | 22 ---------------------- meson.build | 1 - 2 files changed, 23 deletions(-) diff --git a/glib/gfileutils.c b/glib/gfileutils.c index 966de84da..66a558e40 100644 --- a/glib/gfileutils.c +++ b/glib/gfileutils.c @@ -56,11 +56,6 @@ #include "gstdioprivate.h" #include "glibintl.h" -#ifdef HAVE_LINUX_MAGIC_H /* for btrfs check */ -#include -#include -#endif - /** * SECTION:fileutils @@ -1091,23 +1086,6 @@ fd_should_be_fsynced (int fd, #ifdef HAVE_FSYNC struct stat statbuf; -#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. - * - * See https://btrfs.wiki.kernel.org/index.php/FAQ#What_are_the_crash_guarantees_of_overwrite-by-rename.3F - */ - - if ((flags & G_FILE_SET_CONTENTS_CONSISTENT) && - fstatfs (fd, &buf) == 0 && buf.f_type == BTRFS_SUPER_MAGIC) - return FALSE; - } -#endif /* BTRFS_SUPER_MAGIC */ - /* If the final destination exists and is > 0 bytes, we want to sync the * newly written file to ensure the data is on disk when we rename over * the destination. Otherwise if we get a system crash we can lose both diff --git a/meson.build b/meson.build index 05b9acab1..31243cec9 100644 --- a/meson.build +++ b/meson.build @@ -282,7 +282,6 @@ headers = [ 'grp.h', 'inttypes.h', 'limits.h', - 'linux/magic.h', 'locale.h', 'mach/mach_time.h', 'memory.h',