svn commit: r352920 - head/bin/dd

Matt Macy mmacy at FreeBSD.org
Mon Sep 30 21:48:13 UTC 2019


Author: mmacy
Date: Mon Sep 30 21:48:12 2019
New Revision: 352920
URL: https://svnweb.freebsd.org/changeset/base/352920

Log:
  Add conv=fdatasync flag to dd
  
  The fdatasync flag performs an fdatasync(2) on the output file before closing it.
  This will be useful for the ZFS test suite.
  
  Submitted by:	Ryan Moeller
  Reviewed by:	manpages, mmacy@
  MFC after:	1 week
  Sponsored by:	iXSystems, Inc.
  Differential Revision:	https://reviews.freebsd.org/D21373

Modified:
  head/bin/dd/args.c
  head/bin/dd/dd.1
  head/bin/dd/dd.c
  head/bin/dd/dd.h
  head/bin/dd/extern.h

Modified: head/bin/dd/args.c
==============================================================================
--- head/bin/dd/args.c	Mon Sep 30 21:14:33 2019	(r352919)
+++ head/bin/dd/args.c	Mon Sep 30 21:48:12 2019	(r352920)
@@ -77,7 +77,7 @@ static off_t	get_off_t(const char *);
 static const struct arg {
 	const char *name;
 	void (*f)(char *);
-	u_int set, noset;
+	uint64_t set, noset;
 } args[] = {
 	{ "bs",		f_bs,		C_BS,	 C_BS|C_IBS|C_OBS|C_OSYNC },
 	{ "cbs",	f_cbs,		C_CBS,	 C_CBS },
@@ -314,12 +314,13 @@ f_status(char *arg)
  
 static const struct conv {
 	const char *name;
-	u_int set, noset;
+	uint64_t set, noset;
 	const u_char *ctab;
 } clist[] = {
 	{ "ascii",	C_ASCII,	C_EBCDIC,	e2a_POSIX },
 	{ "block",	C_BLOCK,	C_UNBLOCK,	NULL },
 	{ "ebcdic",	C_EBCDIC,	C_ASCII,	a2e_POSIX },
+	{ "fdatasync",	C_FDATASYNC,	0,		NULL },
 	{ "fsync",	C_FSYNC,	0,		NULL },
 	{ "ibm",	C_EBCDIC,	C_ASCII,	a2ibm_POSIX },
 	{ "lcase",	C_LCASE,	C_UCASE,	NULL },

Modified: head/bin/dd/dd.1
==============================================================================
--- head/bin/dd/dd.1	Mon Sep 30 21:14:33 2019	(r352919)
+++ head/bin/dd/dd.1	Mon Sep 30 21:48:12 2019	(r352920)
@@ -252,6 +252,10 @@ are maps used in historic
 and
 .No pre- Ns Bx 4.3 reno
 systems.
+.It Cm fdatasync
+Perform an
+.Xr fdatasync 2
+on the output file before closing it.
 .It Cm fsync
 Perform an
 .Xr fsync 2

Modified: head/bin/dd/dd.c
==============================================================================
--- head/bin/dd/dd.c	Mon Sep 30 21:14:33 2019	(r352919)
+++ head/bin/dd/dd.c	Mon Sep 30 21:48:12 2019	(r352920)
@@ -83,7 +83,7 @@ STAT	st;			/* statistics */
 void	(*cfunc)(void);		/* conversion function */
 uintmax_t cpy_cnt;		/* # of blocks to copy */
 static off_t	pending = 0;	/* pending seek if sparse */
-u_int	ddflags = 0;		/* conversion options */
+uint64_t	ddflags = 0;	/* conversion options */
 size_t	cbsz;			/* conversion block size */
 uintmax_t files_cnt = 1;	/* # of files to copy */
 const	u_char *ctab;		/* conversion table */
@@ -164,7 +164,7 @@ setup(void)
 		errx(1, "files is not supported for non-tape devices");
 
 	cap_rights_set(&rights, CAP_FTRUNCATE, CAP_IOCTL, CAP_WRITE);
-	if (ddflags & C_FSYNC)
+	if (ddflags & (C_FDATASYNC | C_FSYNC))
 		cap_rights_set(&rights, CAP_FSYNC);
 	if (out.name == NULL) {
 		/* No way to check for read access here. */
@@ -511,6 +511,9 @@ dd_close(void)
 	if (ddflags & C_FSYNC) {
 		if (fsync(out.fd) == -1)
 			err(1, "fsyncing %s", out.name);
+	} else if (ddflags & C_FDATASYNC) {
+		if (fdatasync(out.fd) == -1)
+			err(1, "fdatasyncing %s", out.name);
 	}
 }
 

Modified: head/bin/dd/dd.h
==============================================================================
--- head/bin/dd/dd.h	Mon Sep 30 21:14:33 2019	(r352919)
+++ head/bin/dd/dd.h	Mon Sep 30 21:48:12 2019	(r352920)
@@ -70,38 +70,39 @@ typedef struct {
 } STAT;
 
 /* Flags (in ddflags). */
-#define	C_ASCII		0x00000001
-#define	C_BLOCK		0x00000002
-#define	C_BS		0x00000004
-#define	C_CBS		0x00000008
-#define	C_COUNT		0x00000010
-#define	C_EBCDIC	0x00000020
-#define	C_FILES		0x00000040
-#define	C_IBS		0x00000080
-#define	C_IF		0x00000100
-#define	C_LCASE		0x00000200
-#define	C_NOERROR	0x00000400
-#define	C_NOTRUNC	0x00000800
-#define	C_OBS		0x00001000
-#define	C_OF		0x00002000
-#define	C_OSYNC		0x00004000
-#define	C_PAREVEN	0x00008000
-#define	C_PARNONE	0x00010000
-#define	C_PARODD	0x00020000
-#define	C_PARSET	0x00040000
-#define	C_SEEK		0x00080000
-#define	C_SKIP		0x00100000
-#define	C_SPARSE	0x00200000
-#define	C_SWAB		0x00400000
-#define	C_SYNC		0x00800000
-#define	C_UCASE		0x01000000
-#define	C_UNBLOCK	0x02000000
-#define	C_FILL		0x04000000
-#define	C_STATUS	0x08000000
-#define	C_NOXFER	0x10000000
-#define	C_NOINFO	0x20000000
-#define	C_PROGRESS	0x40000000
-#define	C_FSYNC		0x80000000
+#define	C_ASCII		0x0000000000000001ULL
+#define	C_BLOCK		0x0000000000000002ULL
+#define	C_BS		0x0000000000000004ULL
+#define	C_CBS		0x0000000000000008ULL
+#define	C_COUNT		0x0000000000000010ULL
+#define	C_EBCDIC	0x0000000000000020ULL
+#define	C_FILES		0x0000000000000040ULL
+#define	C_IBS		0x0000000000000080ULL
+#define	C_IF		0x0000000000000100ULL
+#define	C_LCASE		0x0000000000000200ULL
+#define	C_NOERROR	0x0000000000000400ULL
+#define	C_NOTRUNC	0x0000000000000800ULL
+#define	C_OBS		0x0000000000001000ULL
+#define	C_OF		0x0000000000002000ULL
+#define	C_OSYNC		0x0000000000004000ULL
+#define	C_PAREVEN	0x0000000000008000ULL
+#define	C_PARNONE	0x0000000000010000ULL
+#define	C_PARODD	0x0000000000020000ULL
+#define	C_PARSET	0x0000000000040000ULL
+#define	C_SEEK		0x0000000000080000ULL
+#define	C_SKIP		0x0000000000100000ULL
+#define	C_SPARSE	0x0000000000200000ULL
+#define	C_SWAB		0x0000000000400000ULL
+#define	C_SYNC		0x0000000000800000ULL
+#define	C_UCASE		0x0000000001000000ULL
+#define	C_UNBLOCK	0x0000000002000000ULL
+#define	C_FILL		0x0000000004000000ULL
+#define	C_STATUS	0x0000000008000000ULL
+#define	C_NOXFER	0x0000000010000000ULL
+#define	C_NOINFO	0x0000000020000000ULL
+#define	C_PROGRESS	0x0000000040000000ULL
+#define	C_FSYNC		0x0000000080000000ULL
+#define	C_FDATASYNC	0x0000000100000000ULL
 
 #define	C_PARITY	(C_PAREVEN | C_PARODD | C_PARNONE | C_PARSET)
 

Modified: head/bin/dd/extern.h
==============================================================================
--- head/bin/dd/extern.h	Mon Sep 30 21:14:33 2019	(r352919)
+++ head/bin/dd/extern.h	Mon Sep 30 21:48:12 2019	(r352920)
@@ -58,7 +58,7 @@ extern STAT st;
 extern void (*cfunc)(void);
 extern uintmax_t cpy_cnt;
 extern size_t cbsz;
-extern u_int ddflags;
+extern uint64_t ddflags;
 extern size_t speed;
 extern uintmax_t files_cnt;
 extern const u_char *ctab;


More information about the svn-src-all mailing list