fsync after block device writes

When markBoolSuccessful is invoked, we update
the partition table. These writes should be
synced before merge operation is resumed post OTA.
If not, any crash before these writes are landed to
backing storage will lead to incorrect switching of
slots.

BUG: 175711601
BUG: 177652253
Test: Verify slot switching correctly after crash when merge in progress
Signed-off-by: Akilesh Kailash <akailash@google.com>
Change-Id: I2da9286490d5d063df0c9d4dc491e0fbf28f51bb
diff --git a/gpt-utils/gpt-utils.cpp b/gpt-utils/gpt-utils.cpp
index f1f2858..c83ecc8 100644
--- a/gpt-utils/gpt-utils.cpp
+++ b/gpt-utils/gpt-utils.cpp
@@ -157,11 +157,18 @@
     else
         r = read(fd, buf, len);
 
-    if (r < 0)
+    if (r < 0) {
         fprintf(stderr, "block dev %s failed: %s\n", rw ? "write" : "read",
                 strerror(errno));
-    else
-        r = 0;
+    } else {
+        if (rw) {
+            r = fsync(fd);
+            if (r < 0)
+                fprintf(stderr, "fsync failed: %s\n", strerror(errno));
+        } else {
+            r = 0;
+        }
+    }
 
     return r;
 }