Re: [PATCH v3 5/5] ovl: consistent st_ino/d_ino

Amir Goldstein
2017-06-21T09:05:39Z

On Wed, Jun 21, 2017 at 11:53 AM, Miklos Szeredi <miklos@szeredi.hu> wrote:
> On Wed, Jun 21, 2017 at 10:49 AM, Amir Goldstein <amir73il@gmail.com> wrote:
>> On Wed, Jun 21, 2017 at 11:45 AM, Miklos Szeredi <miklos@szeredi.hu> wrote:
>>> On Wed, Jun 21, 2017 at 10:38 AM, Miklos Szeredi <miklos@szeredi.hu> wrote:
>>>> On Wed, Jun 21, 2017 at 10:20 AM, Miklos Szeredi <miklos@szeredi.hu> wrote:
>>>>
>>>>> Right. The problem is when dir becomes impure due to rename between
>>>>> two getdents(2) calls. We can't call ovl_dir_reset() because the
>>>>> offset is not zero. We could do a "cache with head cut off" starting
>>>>> from the current offset in the dir and finish with that. Yeah, it's
>>>>> probably less complexity than trying to intercept the actor...
>>>>
>>>> On the other hand, we'll need to accommodate the native directory
>>>> indexing (i.e. seekdir(3) hell) in the cache, which is going to add to
>>>> complexity. Ugh.
>>>
>>> Another idea: we are allowed to omit directory entries added after
>>> the opendir/rewinddir. So if there was a simple way to filter out
>>> newly added entries which have origin then we are fine.
>>>
>>

Following up on your idea:
- check in ovl_iterate() if version has changed and if dir became impure
- if it did, populate od->cache, but keep the dir od->is_real
- iterate upper cache entries and call ovl_cache_update_ino()
- Then actor of real dir iterator can use the cache to ommit entries or use
p->ino from cache if p->real_ino match real d_ino, but differs from p->ino.