From: Ulrich Drepper <drepper@redhat.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] utimensat implementation
Date: Thu, 26 Apr 2007 17:54:00 -0700 [thread overview]
Message-ID: <463149A8.6070408@redhat.com> (raw)
In-Reply-To: <20070426162530.bc30a1bb.akpm@linux-foundation.org>
[-- Attachment #1.1: Type: text/plain, Size: 1377 bytes --]
Andrew Morton wrote:
> Does the spec say what the OS should do if (ts_nsec => 1e9)?
Yes, return EINVAL. We already do this. It's just that now we have to
recognize two special values.
> OK, so there's no collision on ts_nsec if unnormalised timespecs are
> disallowed.
Indeed, that's the basis of using the special values.
I chose the values of the constants so that they are a) out of the way
of valid values and b) don't have to be adjusted for 32-bit compat code.
> But there's a potential collision on ts_sec? Do we know what date that
> corresponds to?
No, there is no collision. The tv_sec value is relevant. The
UTIME_OMIT and UTIME_NOW value refers to the atime/mtime respectively,
not just the tv_nsec field of either. It makes no sense to just set
tv_sec, the tv_nsec value would be basically random.
In my patch I'm testing that tv_sec is zero in case any of the special
values is used in the corresponding tv_nsec field. That's more than the
standard currently requires but I think it's better and I try to get the
standard proposal changed. If this doesn't happen I'll make appropriate
changes at userlevel for the "strictly POSIX" mode.
> Do you have a testcase app which can be used by arch maintainers?
Attached here.
--
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: utimensat-test.c --]
[-- Type: text/x-csrc; name="utimensat-test.c", Size: 3044 bytes --]
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <stddef.h>
#include <syscall.h>
#define UTIME_NOW ((1l << 30) - 1l)
#define UTIME_OMIT ((1l << 30) - 2l)
int
main(void)
{
int status = 0;
int fd = open("ttt", O_RDWR|O_CREAT|O_EXCL, 0666);
if (fd == -1)
error (1, errno, "failed to create test file \"ttt\"");
struct stat64 st1;
if (fstat64 (fd, &st1) != 0)
error (1, errno, "fstat failed");
struct timespec t[2];
t[0].tv_sec = 0;
t[0].tv_nsec = 0;
t[1].tv_sec = 0;
t[1].tv_nsec = 0;
if (syscall(280, AT_FDCWD, "ttt", t) != 0)
error (1, errno, "utimensat failed");
struct stat64 st2;
if (fstat64 (fd, &st2) != 0)
error (1, errno, "fstat failed");
if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
{
puts ("atim not reset to zero");
status = 1;
}
if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
{
puts ("mtim not reset to zero");
status = 1;
}
if (status != 0)
goto out;
t[0] = st1.st_atim;
t[1].tv_sec = 0;
t[1].tv_nsec = UTIME_OMIT;
if (syscall(280, AT_FDCWD, "ttt", t) != 0)
error (1, errno, "utimensat failed");
if (fstat64 (fd, &st2) != 0)
error (1, errno, "fstat failed");
if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
|| st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
{
puts ("atim not set");
status = 1;
}
if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
{
puts ("mtim changed from zero");
status = 1;
}
if (status != 0)
goto out;
t[0].tv_sec = 0;
t[0].tv_nsec = UTIME_OMIT;
t[1] = st1.st_mtim;
if (syscall(280, AT_FDCWD, "ttt", t) != 0)
error (1, errno, "utimensat failed");
if (fstat64 (fd, &st2) != 0)
error (1, errno, "fstat failed");
if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
|| st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
{
puts ("mtim changed from original time");
status = 1;
}
if (st2.st_mtim.tv_sec != st1.st_mtim.tv_sec
|| st2.st_mtim.tv_nsec != st1.st_mtim.tv_nsec)
{
puts ("mtim not set");
status = 1;
}
if (status != 0)
goto out;
sleep (2);
t[0].tv_sec = 0;
t[0].tv_nsec = UTIME_NOW;
t[1].tv_sec = 0;
t[1].tv_nsec = UTIME_NOW;
if (syscall(280, AT_FDCWD, "ttt", t) != 0)
error (1, errno, "utimensat failed");
if (fstat64 (fd, &st2) != 0)
error (1, errno, "fstat failed");
struct timeval tv;
gettimeofday(&tv,NULL);
if (st2.st_atim.tv_sec <= st1.st_atim.tv_sec
|| st2.st_atim.tv_sec > tv.tv_sec)
{
puts ("atim not set to NOW");
status = 1;
}
if (st2.st_mtim.tv_sec <= st1.st_mtim.tv_sec
|| st2.st_mtim.tv_sec > tv.tv_sec)
{
puts ("mtim not set to NOW");
status = 1;
}
if (status == 0)
puts ("all OK");
out:
close (fd);
unlink ("ttt");
return status;
}
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 251 bytes --]
next prev parent reply other threads:[~2007-04-27 0:54 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-26 22:49 [PATCH] utimensat implementation Ulrich Drepper
2007-04-26 23:25 ` Andrew Morton
2007-04-27 0:11 ` H. Peter Anvin
2007-04-27 0:55 ` Ulrich Drepper
2007-04-27 0:58 ` H. Peter Anvin
2007-04-27 1:04 ` Ulrich Drepper
2007-04-27 23:15 ` H. Peter Anvin
2007-04-27 23:05 ` David Lang
2007-04-27 23:30 ` Ulrich Drepper
2007-04-27 23:33 ` H. Peter Anvin
2007-04-27 0:54 ` Ulrich Drepper [this message]
2007-04-27 15:27 ` Updated utimensat test program Ulrich Drepper
2007-04-27 1:57 ` [PATCH] utimensat implementation Neil Brown
2007-04-27 2:13 ` Ulrich Drepper
2007-04-27 6:01 ` Neil Brown
2007-05-10 18:26 ` Ulrich Drepper
2007-05-10 18:52 ` Christoph Hellwig
2007-05-10 19:44 ` Ulrich Drepper
2007-05-13 21:02 ` Christoph Hellwig
2007-05-11 1:01 ` H. Peter Anvin
2007-05-11 2:14 ` Neil Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=463149A8.6070408@redhat.com \
--to=drepper@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.