X-Recipient: archive-cygwin@delorie.com
X-SWARE-Spam-Status: No, hits=-7.1 required=5.0	tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_FD
X-Spam-Check-By: sourceware.org
Message-ID: <4E7A5209.1000907@redhat.com>
Date: Wed, 21 Sep 2011 15:07:21 -0600
From: Eric Blake <eblake@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.22) Gecko/20110906 Fedora/3.1.14-1.fc14 Lightning/1.0b3pre Mnenhy/0.8.3 Thunderbird/3.1.14
MIME-Version: 1.0
To: cygwin@cygwin.com
Subject: Re: fsync bug
References: <4E7A4C69.5080807@redhat.com> <20110921205418.GE31288@ednor.casa.cgf.cx>
In-Reply-To: <20110921205418.GE31288@ednor.casa.cgf.cx>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-IsSubscribed: yes
Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe@cygwin.com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin@cygwin.com>
List-Help: <mailto:cygwin-help@cygwin.com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner@cygwin.com
Mail-Followup-To: cygwin@cygwin.com
Delivered-To: mailing list cygwin@cygwin.com

On 09/21/2011 02:54 PM, Christopher Faylor wrote:
> On Wed, Sep 21, 2011 at 02:43:21PM -0600, Eric Blake wrote:
>> fsync() is required to work on read-only fds (in theory, you can sync
>> the atime metadata, which is a write operation triggered by a read-only
>> fd).  But cygwin rejects this program, which works on Linux:
>>
>> $ cat foo.c
>> #include<errno.h>
>> #include<unistd.h>
>> #include<stdio.h>
>> #include<stdlib.h>
>> #include<assert.h>
>> #include<fcntl.h>
>> int main (void)
>> {
>>    int fd = open("file", O_CREAT|O_EXCL|O_WRONLY, 0600);
>>    if (fd<  0)
>>      return 1;
>>    if (close(fd))
>>      return 2;
>>    fd = open("file", O_RDONLY);
>>    if (fd<  0)
>>      return 3;
>>    if (fsync(fd))
>>      return 4;
>>    if (unlink("file"))
>>      return 5;
>>    puts("success");
>>    return 0;
>> }
>> $ rm -f file&&  ./foo; echo $?
>> 4
>
> http://msdn.microsoft.com/en-us/library/aa364439%28VS.85%29.aspx

So what's wrong with making fsync() a no-op for read-only fds, on the 
grounds that windows doesn't give us a way to flush that data, so the 
best emulation we can do is by ignoring the request rather than 
propagating a spurious failure back to the user?

Also, FlushFileBuffers sounds more like fdatasync(); I'm wondering if 
fsync() should also be flushing the containing directory of any given 
file, in case file metadata (such as timestamps or changes in size via 
truncate) still need to be flushed to disk by flushing the directory.

-- 
Eric Blake   eblake@redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

