HomeFreeBSD

Fix some edge cases with rewinddir():

Description

Fix some edge cases with rewinddir():

  • In the unionfs case, opendir() and fdopendir() read the directory's full contents and cache it. This cache is not refreshed when rewinddir() is called, so rewinddir() will not notice updates to a directory. Fix this by splitting the code to fetch a directory's contents out of __opendir_common() into a new _filldir() function and call this from rewinddir() when operating on a unionfs directory.
  • If rewinddir() is called on a directory opened with fdopendir() before any directory entries are fetched, rewinddir() will not adjust the seek location of the backing file descriptor. If the file descriptor passed to fdopendir() had a non-zero offset, the rewinddir() will not rewind to the beginning. Fix this by always seeking back to 0 in rewinddir(). This means the dd_rewind hack can also be removed.

While here, add missing locking to rewinddir().

CR: https://phabric.freebsd.org/D312
Reviewed by: jilles
MFC after: 1 week

Details

Provenance
jhbAuthored on Jul 11 2014, 4:16 PM
Parents
rGfcc34a238c98: Fix style bug: rename the refcount field of m_ext to ext_cnt, to match
Branches
Unknown
Tags
Unknown