Tomas Bzatek e9fb887
From 6592ecb3b95146b84072cf276eb98fba324b11ad Mon Sep 17 00:00:00 2001
Tomas Bzatek e9fb887
From: Christian Kellner <gicmo@gnome.org>
Tomas Bzatek e9fb887
Date: Wed, 18 Nov 2009 14:33:36 +0000
Tomas Bzatek e9fb887
Subject: Fsync the directory when rotating the metadata
Tomas Bzatek e9fb887
Tomas Bzatek e9fb887
This is needed so we never end up having a stable file with the
Tomas Bzatek e9fb887
rotated bit set. Should fix bug #600057.
Tomas Bzatek e9fb887
---
Tomas Bzatek e9fb887
diff --git a/metadata/metabuilder.c b/metadata/metabuilder.c
Tomas Bzatek e9fb887
index a4a2043..bffdd16 100644
Tomas Bzatek e9fb887
--- a/metadata/metabuilder.c
Tomas Bzatek e9fb887
+++ b/metadata/metabuilder.c
Tomas Bzatek e9fb887
@@ -1010,8 +1010,8 @@ meta_builder_write (MetaBuilder *builder,
Tomas Bzatek e9fb887
 {
Tomas Bzatek e9fb887
   GString *out;
Tomas Bzatek e9fb887
   guint32 random_tag;
Tomas Bzatek e9fb887
-  int fd, fd2;
Tomas Bzatek e9fb887
-  char *tmp_name;
Tomas Bzatek e9fb887
+  int fd, fd2, fd_dir;
Tomas Bzatek e9fb887
+  char *tmp_name, *dirname;
Tomas Bzatek e9fb887
 
Tomas Bzatek e9fb887
   out = metadata_create_static (builder, &random_tag);
Tomas Bzatek e9fb887
 
Tomas Bzatek e9fb887
@@ -1035,6 +1035,17 @@ meta_builder_write (MetaBuilder *builder,
Tomas Bzatek e9fb887
       goto out;
Tomas Bzatek e9fb887
     }
Tomas Bzatek e9fb887
 
Tomas Bzatek e9fb887
+  /* Sync the directory to make sure that the entry in the directory containing
Tomas Bzatek e9fb887
+     the new medata file has also reached disk. */
Tomas Bzatek e9fb887
+  dirname = g_path_get_dirname (filename);
Tomas Bzatek e9fb887
+  fd_dir = open (dirname, O_RDONLY);
Tomas Bzatek e9fb887
+  if (fd_dir > -1)
Tomas Bzatek e9fb887
+    {
Tomas Bzatek e9fb887
+      fsync (fd_dir);
Tomas Bzatek e9fb887
+      close (fd_dir);
Tomas Bzatek e9fb887
+    }
Tomas Bzatek e9fb887
+  g_free (dirname);
Tomas Bzatek e9fb887
+
Tomas Bzatek e9fb887
   /* Mark old file (if any) as rotated) */
Tomas Bzatek e9fb887
   if (fd2 != -1)
Tomas Bzatek e9fb887
     {
Tomas Bzatek e9fb887
--
Tomas Bzatek e9fb887
cgit v0.8.2