Now that we have a write barrier lets use it at some
critical points.
---
 ext2fs/getblk.c | 9 ++++++++-
 ext2fs/hyper.c  | 8 +++++++-
 ext2fs/inode.c  | 7 ++++++-
 ext2fs/pager.c  | 9 ++++++++-
 4 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/ext2fs/getblk.c b/ext2fs/getblk.c
index ed6e3e09..49ab5740 100644
--- a/ext2fs/getblk.c
+++ b/ext2fs/getblk.c
@@ -234,7 +234,14 @@ block_getblk (struct node *node, block_t block, int nr, 
int create, int zero,
   bh[nr] = *result;
 
   if (diskfs_synchronous || diskfs_node_disknode (node)->info.i_osync)
-    sync_global_ptr (bh, 1);
+    {
+      sync_global_ptr (bh, 1);
+      /* We just wrote a new indirect block pointer.
+         If this doesn't hit the platter, the file is corrupt. */
+      error_t err = store_sync (store);
+      if (err && err != EOPNOTSUPP)
+       ext2_warning ("indirect block flush failed: %s", strerror (err));
+    }
   else
     record_indir_poke (node, bh);
 
diff --git a/ext2fs/hyper.c b/ext2fs/hyper.c
index 59458724..847f9f2b 100644
--- a/ext2fs/hyper.c
+++ b/ext2fs/hyper.c
@@ -220,7 +220,13 @@ diskfs_set_hypermetadata (int wait, int clean)
    }
 
   sync_global (wait);
-
+  if (wait)
+    {
+      error_t err = store_sync (store);
+      /* Ignore EOPNOTSUPP (legacy drivers), but warn on real I/O errors */
+      if (err && err != EOPNOTSUPP)
+        ext2_warning ("device flush failed: %s", strerror (err));
+    }
   return 0;
 }
 
diff --git a/ext2fs/inode.c b/ext2fs/inode.c
index 8d1656f6..8d10af01 100644
--- a/ext2fs/inode.c
+++ b/ext2fs/inode.c
@@ -569,7 +569,12 @@ diskfs_write_disknode (struct node *np, int wait)
   if (di)
     {
       if (wait)
-       sync_global_ptr (di, 1);
+        {
+         sync_global_ptr (di, 1);
+          error_t err = store_sync (store);
+          if (err && err != EOPNOTSUPP)
+            ext2_warning ("inode flush failed: %s", strerror (err));
+        }
       else
        record_global_poke (di);
     }
diff --git a/ext2fs/pager.c b/ext2fs/pager.c
index a7801bea..1c795784 100644
--- a/ext2fs/pager.c
+++ b/ext2fs/pager.c
@@ -1575,7 +1575,7 @@ diskfs_shutdown_pager (void)
 
   /* Sync everything on the the disk pager.  */
   sync_global (1);
-
+  store_sync (store);
   /* Despite the name of this function, we never actually shutdown the disk
      pager, just make sure it's synced. */
 }
@@ -1596,6 +1596,13 @@ diskfs_sync_everything (int wait)
 
   /* Do things on the the disk pager.  */
   sync_global (wait);
+  if (wait)
+    {
+      error_t err = store_sync (store);
+      /* Ignore EOPNOTSUPP (drivers), but warn on real I/O errors */
+      if (err && err != EOPNOTSUPP)
+        ext2_warning ("device flush failed: %s", strerror (err));
+    }
 }
 
 static void
-- 
2.52.0


Reply via email to