dd: add support for opening files in Concurrent I/O (CIO) mode
authorMatt Harden <matth@mindspring.com>
Mon, 22 Dec 2008 04:06:16 +0000 (22:06 -0600)
committerJim Meyering <meyering@redhat.com>
Fri, 26 Dec 2008 09:57:05 +0000 (10:57 +0100)
* src/dd.c (O_CIO): New flag.
* src/dd.c (O_FULLBLOCK): Add O_CIO to the list of flags that
O_FULLBLOCK should be greater than.
* src/dd.c (flags): Give the name "cio" to the new O_CIO flag, mirroring
the treatment of O_DIRECT.
* src/dd.c (usage): Add a description of the new flag when it is available.
* doc/coreutils.text (dd invocation): Describe the new flag.
* NEWS: Mention the new feature.

NEWS
doc/coreutils.texi
src/dd.c

diff --git a/NEWS b/NEWS
index 717af04cd443e76e8864304ed3185f57bf8b2944..f605330e749b415fc51bca12de0bf8119625b542 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** New features
 
+  dd accepts iflag=cio and oflag=cio to open the file in CIO (concurrent I/O)
+  mode where this feature is available.
+
   ls --color now highlights hard linked files, too
 
   stat -f recognizes the Lustre file system type
index 9047925e3117a770bd3dfe87f972db7dc65e4afa..387377345397885a4ec7db3034ad3cbb7907ad42 100644 (file)
@@ -7729,6 +7729,14 @@ If you combine this flag with the @samp{of=@var{file}} operand,
 you should also specify @samp{conv=notrunc} unless you want the
 output file to be truncated before being appended to.
 
+@item cio
+@opindex cio
+@cindex concurrent I/O
+Use concurrent I/O mode for data.  This mode performs direct I/O
+and drops the @acronym{POSIX} requirement to serialize all I/O to the same file.
+A file cannot be opened in CIO mode and with a standard open at the
+same time.
+
 @item direct
 @opindex direct
 @cindex direct I/O
index e54cc14dfc430acdf248d2dd9cc15be08e38a1e1..76396126127eb48e36d770f41332930541ce3c9d 100644 (file)
--- a/src/dd.c
+++ b/src/dd.c
@@ -66,6 +66,12 @@ static void process_signals (void);
 # define SIGINFO SIGUSR1
 #endif
 
+/* This may belong in GNULIB's fcntl module instead.
+   Define O_CIO to 0 if it is not supported by this OS. */
+#ifndef O_CIO
+# define O_CIO 0
+#endif
+
 #if ! HAVE_FDATASYNC
 # define fdatasync(fd) (errno = ENOSYS, -1)
 #endif
@@ -264,6 +270,7 @@ enum
     /* Use a value that is larger than that of any other O_ symbol.  */
     O_FULLBLOCK = ((MAX (O_APPEND,
                    MAX (O_BINARY,
+                   MAX (O_CIO,
                    MAX (O_DIRECT,
                    MAX (O_DIRECTORY,
                    MAX (O_DSYNC,
@@ -272,7 +279,7 @@ enum
                    MAX (O_NOFOLLOW,
                    MAX (O_NOLINKS,
                    MAX (O_NONBLOCK,
-                   MAX (O_SYNC, O_TEXT)))))))))))) << 1)
+                   MAX (O_SYNC, O_TEXT))))))))))))) << 1)
   };
 
 /* Ensure that we didn't shift it off the end.  */
@@ -288,6 +295,7 @@ static struct symbol_value const flags[] =
 {
   {"append",   O_APPEND},
   {"binary",   O_BINARY},
+  {"cio",      O_CIO},
   {"direct",   O_DIRECT},
   {"directory",        O_DIRECTORY},
   {"dsync",    O_DSYNC},
@@ -508,6 +516,8 @@ Each FLAG symbol may be:\n\
 \n\
   append    append mode (makes sense only for output; conv=notrunc suggested)\n\
 "), stdout);
+      if (O_CIO)
+       fputs (_("  cio       use concurrent I/O for data\n"), stdout);
       if (O_DIRECT)
        fputs (_("  direct    use direct I/O for data\n"), stdout);
       if (O_DIRECTORY)