Blame SOURCES/0001-sadc-Add-a-f-flag-to-force-fdatasync-use.patch

13ba7c
From 560d88cb5a16636acb0e350d6997fe915cc4253e Mon Sep 17 00:00:00 2001
13ba7c
From: Kyle Walker <kwalker@redhat.com>
13ba7c
Date: Wed, 30 Jan 2019 07:50:55 -0500
13ba7c
Subject: [PATCH] sadc: Add a -f flag to force fdatasync() use
13ba7c
13ba7c
For quite some time, the sadc utility has not used fdatasync() when writing
13ba7c
stat information to disk. This resulted in instances where data files could
13ba7c
be corrupted or entries lost if a system encountered a sudden reset
13ba7c
condition. This change adds a "-f" flag which can be used to bring back the
13ba7c
previous behaviour if end users require it.
13ba7c
13ba7c
Note, the fdatasync() lowers the likelihood of lost data, but does so at
13ba7c
the expense of performance within the write operation.
13ba7c
---
13ba7c
 man/sadc.in |  8 +++++++-
13ba7c
 sa.h        |  2 ++
13ba7c
 sadc.c      | 13 ++++++++++++-
13ba7c
 3 files changed, 21 insertions(+), 2 deletions(-)
13ba7c
13ba7c
diff --git a/man/sadc.in b/man/sadc.in
13ba7c
index 2d754b71..ce8ee230 100644
13ba7c
--- a/man/sadc.in
13ba7c
+++ b/man/sadc.in
13ba7c
@@ -4,7 +4,7 @@ sadc \- System activity data collector.
13ba7c
 .SH SYNOPSIS
13ba7c
 .B @SA_LIB_DIR@/sadc [ -C
13ba7c
 .I comment
13ba7c
-.B ] [ -D ] [ -F ] [ -L ] [ -V ] [ -S { DISK | INT | IPV6 | POWER | SNMP | XDISK | ALL | XALL [,...] } ] [
13ba7c
+.B ] [ -D ] [ -F ] [ -L ] [ -V ] [ -f ] [ -S { DISK | INT | IPV6 | POWER | SNMP | XDISK | ALL | XALL [,...] } ] [
13ba7c
 .I interval
13ba7c
 .B [
13ba7c
 .I count
13ba7c
@@ -106,6 +106,12 @@ then it will be truncated. This may be useful for daily data files
13ba7c
 created by an older version of
13ba7c
 .B sadc
13ba7c
 and whose format is no longer compatible with current one.
13ba7c
+.IP -f
13ba7c
+fdatasync() will be used to ensure data is written to disk. This differs
13ba7c
+from the normal operation in that a sudden system reset is less likely to
13ba7c
+result in the saDD datafiles being corrupted. However, this is at the
13ba7c
+expense of performance within the sadc process as forward progress will be
13ba7c
+blocked while data is written to underlying disk instead of just to cache.
13ba7c
 .IP -L
13ba7c
 .B sadc
13ba7c
 will try to get an exclusive lock on the
13ba7c
diff --git a/sa.h b/sa.h
13ba7c
index 1cd0c3d9..d3236f7c 100644
13ba7c
--- a/sa.h
13ba7c
+++ b/sa.h
13ba7c
@@ -110,5 +110,6 @@
13ba7c
 #define S_F_HUMAN_READ		0x01000000
13ba7c
 #define S_F_ZERO_OMIT		0x02000000
13ba7c
+#define S_F_FDATASYNC		0x08000000
13ba7c
 
13ba7c
 #define WANT_SINCE_BOOT(m)		(((m) & S_F_SINCE_BOOT)   == S_F_SINCE_BOOT)
13ba7c
 #define WANT_SA_ROTAT(m)		(((m) & S_F_SA_ROTAT)     == S_F_SA_ROTAT)
13ba7c
@@ -138,5 +139,6 @@
13ba7c
 #define PACK_VIEWS(m)			(((m) & S_F_SVG_PACKED) == S_F_SVG_PACKED)
13ba7c
 #define DISPLAY_HUMAN_READ(m)		(((m) & S_F_HUMAN_READ) == S_F_HUMAN_READ)
13ba7c
+#define FDATASYNC(m)			(((m) & S_F_FDATASYNC)    == S_F_FDATASYNC)
13ba7c
 
13ba7c
 #define AO_F_NULL		0x00000000
13ba7c
 
13ba7c
diff --git a/sadc.c b/sadc.c
13ba7c
index 826f4aed..139d490a 100644
13ba7c
--- a/sadc.c
13ba7c
+++ b/sadc.c
13ba7c
@@ -92,7 +92,7 @@ void usage(char *progname)
13ba7c
 		progname);
13ba7c
 
13ba7c
 	fprintf(stderr, _("Options are:\n"
13ba7c
-			  "[ -C <comment> ] [ -D ] [ -F ] [ -L ] [ -V ]\n"
13ba7c
+			  "[ -C <comment> ] [ -D ] [ -F ] [ -L ] [ -V ] [ -f ]\n"
13ba7c
 			  "[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"));
13ba7c
 	exit(1);
13ba7c
 }
13ba7c
@@ -1109,6 +1109,13 @@ void rw_sa_stat_loop(long count, int stdfd, int ofd, char ofile[],
13ba7c
 
13ba7c
 		/* Flush data */
13ba7c
 		fflush(stdout);
13ba7c
+		if (FDATASYNC(flags)) {
13ba7c
+			/* If indicated, sync the data to media */
13ba7c
+			if (fdatasync(ofd) < 0) {
13ba7c
+				perror("fdatasync");
13ba7c
+				exit(4);
13ba7c
+			}
13ba7c
+		}
13ba7c
 
13ba7c
 		if (count > 0) {
13ba7c
 			count--;
13ba7c
@@ -1206,6 +1213,10 @@ int main(int argc, char **argv)
13ba7c
 			optz = 1;
13ba7c
 		}
13ba7c
 
13ba7c
+		else if (!strcmp(argv[opt], "-f")) {
13ba7c
+			flags |= S_F_FDATASYNC;
13ba7c
+		}
13ba7c
+
13ba7c
 		else if (!strcmp(argv[opt], "-C")) {
13ba7c
 			if (!argv[++opt]) {
13ba7c
 				usage(argv[0]);