[git commit] fsync,sync: merge into one source module

Denys Vlasenko vda.linux at googlemail.com
Tue Apr 2 12:55:29 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=2f28b2bdbbe229b760e7c2a271d73a19f929ca76
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

With FEATURE_SYNC_FANCY not set:

function                                             old     new   delta
fsync_main                                           130     123      -7

With FEATURE_SYNC_FANCY set, should be much larger code size savings.

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/fsync.c | 62 ------------------------------------------
 coreutils/sync.c  | 80 ++++++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 61 insertions(+), 81 deletions(-)

diff --git a/coreutils/fsync.c b/coreutils/fsync.c
deleted file mode 100644
index 216cbcf41..000000000
--- a/coreutils/fsync.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Mini fsync implementation for busybox
- *
- * Copyright (C) 2008 Nokia Corporation. All rights reserved.
- *
- * Licensed under GPLv2 or later, see file LICENSE in this source tree.
- */
-//config:config FSYNC
-//config:	bool "fsync (3.6 kb)"
-//config:	default y
-//config:	help
-//config:	fsync is used to flush file-related cached blocks to disk.
-
-//                APPLET_NOFORK:name   main   location    suid_type     help
-//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
-
-//kbuild:lib-$(CONFIG_FSYNC) += fsync.o
-
-//usage:#define fsync_trivial_usage
-//usage:       "[-d] FILE..."
-//usage:#define fsync_full_usage "\n\n"
-//usage:       "Write all buffered blocks in FILEs to disk\n"
-//usage:     "\n	-d	Avoid syncing metadata"
-
-#include "libbb.h"
-
-/* This is a NOFORK applet. Be very careful! */
-
-int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int fsync_main(int argc UNUSED_PARAM, char **argv)
-{
-	int ret;
-	int opts;
-
-	opts = getopt32(argv, "d"); /* fdatasync */
-	argv += optind;
-	if (!*argv) {
-		bb_show_usage();
-	}
-
-	ret = EXIT_SUCCESS;
-	do {
-		/* GNU "sync FILE" uses O_NONBLOCK open */
-		int fd = open_or_warn(*argv, /*O_NOATIME |*/ O_NOCTTY | O_RDONLY | O_NONBLOCK);
-		/* open(NOATIME) can only be used by owner or root, don't use NOATIME here */
-
-		if (fd < 0) {
-			ret = EXIT_FAILURE;
-			goto next;
-		}
-		if ((opts ? fdatasync(fd) : fsync(fd)) != 0) {
-			bb_simple_perror_msg(*argv);
-			ret = EXIT_FAILURE;
-		}
-		close(fd);
- next:
-		argv++;
-	} while (*argv);
-
-	return ret;
-}
diff --git a/coreutils/sync.c b/coreutils/sync.c
index e60e553a3..ea328a54c 100644
--- a/coreutils/sync.c
+++ b/coreutils/sync.c
@@ -43,32 +43,17 @@
 
 /* This is a NOFORK applet. Be very careful! */
 
-int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
+#if ENABLE_FEATURE_SYNC_FANCY || ENABLE_FSYNC
+static int sync_common(int opts, char **argv)
 {
-#if !ENABLE_FEATURE_SYNC_FANCY
-	/* coreutils-6.9 compat */
-	bb_warn_ignoring_args(argv[1]);
-	sync();
-	return EXIT_SUCCESS;
-#else
-	unsigned opts;
 	int ret;
-
 	enum {
 		OPT_DATASYNC = (1 << 0),
 		OPT_SYNCFS   = (1 << 1),
 	};
 
-	opts = getopt32(argv, "^" "df" "\0" "d--f:f--d");
-	argv += optind;
-
-	/* Handle the no-argument case. */
-	if (!argv[0])
-		sync();
-
 	ret = EXIT_SUCCESS;
-	while (*argv) {
+	do {
 		/* GNU "sync FILE" uses O_NONBLOCK open */
 		int fd = open_or_warn(*argv, /*O_NOATIME |*/ O_NOCTTY | O_RDONLY | O_NONBLOCK);
 		/* open(NOATIME) can only be used by owner or root, don't use NOATIME here */
@@ -77,6 +62,7 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 			ret = EXIT_FAILURE;
 			goto next;
 		}
+# if ENABLE_FEATURE_SYNC_FANCY
 		if (opts & OPT_SYNCFS) {
 			/*
 			 * syncfs is documented to only fail with EBADF,
@@ -84,6 +70,7 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 			 */
 			syncfs(fd);
 		} else
+# endif
 		if (((opts & OPT_DATASYNC) ? fdatasync(fd) : fsync(fd)) != 0) {
 			bb_simple_perror_msg(*argv);
 			ret = EXIT_FAILURE;
@@ -91,8 +78,63 @@ int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 		close(fd);
  next:
 		argv++;
-	}
+	} while (*argv);
 
 	return ret;
+}
+#endif
+
+#if ENABLE_SYNC
+int sync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int sync_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
+{
+# if !ENABLE_FEATURE_SYNC_FANCY
+	/* coreutils-6.9 compat */
+	bb_warn_ignoring_args(argv[1]);
+	sync();
+	return EXIT_SUCCESS;
+# else
+	unsigned opts = getopt32(argv, "^" "df" "\0" "d--f:f--d");
+	argv += optind;
+	if (!argv[0]) {
+		sync();
+		return EXIT_SUCCESS;
+	}
+	return sync_common(opts, argv);
+# endif
+}
 #endif
+
+/*
+ * Mini fsync implementation for busybox
+ *
+ * Copyright (C) 2008 Nokia Corporation. All rights reserved.
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+//config:config FSYNC
+//config:	bool "fsync (3.6 kb)"
+//config:	default y
+//config:	help
+//config:	fsync is used to flush file-related cached blocks to disk.
+
+//                APPLET_NOFORK:name   main   location    suid_type     help
+//applet:IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
+
+//kbuild:lib-$(CONFIG_FSYNC) += sync.o
+
+//usage:#define fsync_trivial_usage
+//usage:       "[-d] FILE..."
+//usage:#define fsync_full_usage "\n\n"
+//usage:       "Write all buffered blocks in FILEs to disk\n"
+//usage:     "\n	-d	Avoid syncing metadata"
+
+#if ENABLE_FSYNC
+int fsync_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int fsync_main(int argc UNUSED_PARAM, char **argv)
+{
+	int opts = getopt32(argv, "^" "d" "\0" "-1"/*min 1 arg*/);
+	argv += optind;
+	return sync_common(opts, argv);
 }
+#endif


More information about the busybox-cvs mailing list