Vincent Lefevre <[EMAIL PROTECTED]> wrote:
> On 2007-03-05 19:07:31 +0100, Jim Meyering wrote:
>> Your log shows that rm succeeds in removing each file (all unlink syscalls
>> succeed), yet the directory is not empty, so it rewinds it and goes
>> through again -- and all names are still there.  The _second_ unlink
>> attempt fails with ENOENT, because now NFS is reporting that it's gone:
>>
>>   access("test/config.h.in", W_OK)        = 0
>>   unlink("/proc/self/fd/4/config.h.in")   = 0
>>   ...
>>   access("test/config.h.in", W_OK)        = -1 ESTALE (Stale NFS file handle)
>>   unlink("/proc/self/fd/4/config.h.in")   = -1 ENOENT (No such file or 
>> directory)
>>
>> But the solution for ignoring diagnostics about nonexistent
>> files is simply to use rm's -f option.
>
> But IMHO, rm should remember that is has already done an unlink and
> there shouldn't be a diagnostic in this case.

Such "remembering" would be prohibitively expensive, in general.
The file system is supposed to do that.
Actually it looks like POSIX expects a certain amount of
synchronicity of rewinddir.  From the POSIX spec for readdir:

    If a file is removed from or added to the directory after the most
    recent call to opendir() or rewinddir(), whether a subsequent call
    to readdir() returns an entry for that file is unspecified.

Obviously, that doesn't require precisely what we want, but it
sort of implies that the desired rewinddir behavior is expected.

It sounds like your client NFS implementation's cache is not coherent,
at least in some respect.  The client has successfully unlinked a file,
yet after a rewinddir, a subsequent readdir gets the same name; that
suggests the dir entry is out of date:  it doesn't reflect operations
the client itself has marshaled.

FYI, here's the relevant bit from the description of rewinddir:

    The rewinddir() function shall reset the position of the directory
    stream to which dirp refers to the beginning of the directory. It shall
    also cause the directory stream to refer to the current state of the
    corresponding directory, as a call to opendir() would have done.


_______________________________________________
Bug-coreutils mailing list
Bug-coreutils@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-coreutils

Reply via email to