]> granicus.if.org Git - postgresql/commitdiff
Correct handling of fsync failures with tar mode of walmethods.c
authorMichael Paquier <michael@paquier.xyz>
Tue, 26 Jun 2018 00:41:58 +0000 (09:41 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 26 Jun 2018 00:41:58 +0000 (09:41 +0900)
This file has been missing the fact that it needs to report back to
callers a proper failure on fsync calls.  I have spotted the one in
tar_finish() while Kuntal has spotted the one in tar_close().

Backpatch down to 10 where this code has been introduced.

Reported by: Michael Paquier, Kuntal Ghosh
Author: Michael Paquier
Reviewed-by: Kuntal Ghosh, Magnus Hagander
Discussion: https://postgr.es/m/20180625024356.GD1146@paquier.xyz

src/bin/pg_basebackup/walmethods.c

index 331d0e72757c67eaa1c0c05c9c1ed047c52b780c..fbfee05a5a6b2aed88e673bc7eb486fc797e61d6 100644 (file)
@@ -865,7 +865,8 @@ tar_close(Walfile f, WalCloseMethod method)
                return -1;
 
        /* Always fsync on close, so the padding gets fsynced */
-       tar_sync(f);
+       if (tar_sync(f) < 0)
+               return -1;
 
        /* Clean up and done */
        pg_free(tf->pathname);
@@ -896,7 +897,7 @@ tar_finish(void)
                        return false;
        }
 
-       /* A tarfile always ends with two empty  blocks */
+       /* A tarfile always ends with two empty blocks */
        MemSet(zerobuf, 0, sizeof(zerobuf));
        if (!tar_data->compression)
        {
@@ -957,7 +958,10 @@ tar_finish(void)
 
        /* sync the empty blocks as well, since they're after the last file */
        if (tar_data->sync)
-               fsync(tar_data->fd);
+       {
+               if (fsync(tar_data->fd) != 0)
+                       return false;
+       }
 
        if (close(tar_data->fd) != 0)
                return false;