[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] dd: work around buffer length restrictions with oflag=direct
From: |
Eric Sandeen |
Subject: |
Re: [PATCH] dd: work around buffer length restrictions with oflag=direct (O_DIRECT) |
Date: |
Fri, 07 Aug 2009 09:48:01 -0500 |
User-agent: |
Thunderbird 2.0.0.22 (Macintosh/20090605) |
Jim Meyering wrote:
> Eric Sandeen wrote:
> ...
>> I suppose it would be nice to at least make that last buffered IO
>> synchronous if possible, or sync the file afterwards.
>> POSIX_FADV_DONTNEED for extra credit? :)
>
> Good idea.
> What do you think of this?
> It feels slightly excessive to make 3 additional syscalls just
> to preserve some semantics of O_DIRECT for that final buffer.
> ...but I like it.
heh. I like it too. Thanks!
> From ff159a605e5bc10fe871109f66cba5ee410c9138 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <address@hidden>
> Date: Fri, 7 Aug 2009 16:21:35 +0200
> Subject: [PATCH] dd: preserve semantics of O_DIRECT even for final block
>
> * src/dd.c: Include "ignore-value.h"
> (iwrite): When disabling O_DIRECT, try to compensate
> via POSIX_FADV_DONTNEED and fsync.
> Suggested by Eric Sandeen.
> ---
> src/dd.c | 17 +++++++++++++++++
> 1 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/src/dd.c b/src/dd.c
> index 43ad718..d9e4c85 100644
> --- a/src/dd.c
> +++ b/src/dd.c
> @@ -29,6 +29,7 @@
> #include "fd-reopen.h"
> #include "gethrxtime.h"
> #include "human.h"
> +#include "ignore-value.h"
> #include "long-options.h"
> #include "quote.h"
> #include "quotearg.h"
> @@ -843,6 +844,22 @@ iwrite (int fd, char const *buf, size_t size)
> if (fcntl (STDOUT_FILENO, F_SETFL, old_flags & ~O_DIRECT) != 0)
> error (0, errno, _("failed to turn off O_DIRECT: %s"),
> quote (output_file));
> +
> + /* Since we have just turned off O_DIRECT for the final write,
> + here we try to preserve some of its semantics. First, use
> + posix_fadvise to tell the system not to pollute the buffer
> + cache with this data. Don't bother to diagnose lseek or
> + posix_fadvise failure. */
> +#ifdef POSIX_FADV_DONTNEED
> + off_t off = lseek (STDOUT_FILENO, 0, SEEK_CUR);
> + if (0 <= off)
> + ignore_value (posix_fadvise (STDOUT_FILENO,
> + off, 0, POSIX_FADV_DONTNEED));
> +#endif
> +
> + /* Attempt to ensure that that final block is committed
> + to disk as quickly as possible. */
> + conversions_mask |= C_FSYNC;
> }
>
> while (total_written < size)
> --
> 1.6.4.115.g33d49