From: Dmitry Potapov <dpotapov@gmail.com>
To: Alex Riesen <raa.lkml@gmail.com>
Cc: Johannes Sixt <j.sixt@viscovery.net>,
Junio C Hamano <gitster@pobox.com>,
Kjetil Barvik <barvik@broadpark.no>,
Git Mailing List <git@vger.kernel.org>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: Re: [PATCH 2/2] Windows: Skip fstat/lstat optimization in write_entry()
Date: Mon, 20 Apr 2009 17:33:05 +0400 [thread overview]
Message-ID: <20090420133305.GE25059@dpotapov.dyndns.org> (raw)
In-Reply-To: <81b0412b0904200558w2d506f18i675d5dfb990005ce@mail.gmail.com>
On Mon, Apr 20, 2009 at 02:58:49PM +0200, Alex Riesen wrote:
> 2009/4/20 Dmitry Potapov <dpotapov@gmail.com>:
> > The cygwin version has the same problem. (In fact, it is even worse,
> > because we have an optimized version for lstat/stat but not for fstat,
> > and they return different values for some fields like i_no). But even
> > if we used the only Cygwin functions, we would still face the problem,
> > because Windows returns the wrong values for timestamps (and maybe
> > even size on FAT?). So I think the following patch should be squashed
> > on top.
>
> I just sent a patch with an "optimized" fstat. I see no problems (at least none
> like these) with that patch. Timestamps match. Windows XP, yes. But since
> that MSDN article mentions that it is not guaranteed, I guess I just been lucky.
If the time passed between the creating file and end of writing to it is
small (less than timestamp resolution), you may not notice the problem.
The following program demonstrates the problem with fstat on Windows.
(I compiled it using Cygwin). If you remove 'sleep' then you may not
notice the problem for a long time.
-- >8 --
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FILENAME "stat-test.tmp"
int main()
{
struct stat st1, st2;
memset(&st1, 0, sizeof(st1));
memset(&st2, 0, sizeof(st2));
unlink(FILENAME);
int fd = open(FILENAME, O_CREAT|O_RDWR|O_TRUNC, S_IRWXU);
if (fd == -1)
{
perror("Cannot open " FILENAME);
return -1;
}
sleep(1); /* It is IMPORTANT! */
write(fd, "test\n", 5);
fstat(fd, &st1);
close(fd);
lstat(FILENAME, &st2);
if (memcmp(&st1, &st2, sizeof(st1))==0)
printf("fstat is OK\n");
else
printf("fstat is broken\n");
return 0;
}
-- >8 --
Dmitry
next prev parent reply other threads:[~2009-04-20 13:35 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-20 8:17 [PATCH 2/2] Windows: Skip fstat/lstat optimization in write_entry() Johannes Sixt
2009-04-20 10:05 ` Johannes Schindelin
2009-04-20 11:03 ` Dmitry Potapov
2009-04-20 12:34 ` Hannu Koivisto
2009-04-20 12:58 ` Alex Riesen
2009-04-20 13:33 ` Dmitry Potapov [this message]
2009-04-20 13:54 ` Alex Riesen
2009-04-20 14:19 ` Johannes Sixt
2009-04-20 14:25 ` Alex Riesen
2009-04-20 14:27 ` Alex Riesen
2009-04-20 21:17 ` Junio C Hamano
2009-04-20 22:17 ` Alex Riesen
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=20090420133305.GE25059@dpotapov.dyndns.org \
--to=dpotapov@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=barvik@broadpark.no \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j.sixt@viscovery.net \
--cc=raa.lkml@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).